1

我在使用AWS開發工具包與S3存儲桶交互的Java程序中遇到問題。AWS S3 Java:d​​oesObjectExist結果403:FORBIDDEN

這是我用它來創建一個S3客戶端的代碼:當我嘗試下載一個文件,開始下載我請檢查是否文件存在與否與之前

public S3StorageManager(S3Config config) throws StorageException { 

    BasicAWSCredentials credentials = new BasicAWSCredentials(myAccessKey(), mySecretKey()); 
    AWSStaticCredentialsProvider provider = new AWSStaticCredentialsProvider(credentials); 

    this.s3Client = AmazonS3ClientBuilder 
     .standard() 
     .withCredentials(provider) 
     .withRegion(myRegion) 
     .build(); 

s3Client.doesObjectExists(bucketName, objectName); 

這是我得到403:FORBIDDEN。 奇怪的是,只有當我在同一個會話中執行上傳之前嘗試執行對象存在檢查時纔會引發此問題。 換句話說,初始化s3Client之後: - 如果我首先嚐試檢查一個對象是否存在,它會引發FORBIDDEN問題; - 如果我第一次執行文件上傳,它工作正常,之後,任何對象存在檢查工作正常,以及;

這裏是我的堆棧跟蹤:

com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden (Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden; Reques 
t ID: A23BB805491E411F) 
     at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1588) ~[aws-java-sdk-core-1. 
11.128.jar:?] 
     at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1258) ~[aws-java-sdk-core-1.11 
.128.jar:?] 
     at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1030) ~[aws-java-sdk-core-1.11.128 
.jar:?] 
     at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:742) ~[aws-java-sdk-core-1.11.128.jar: 
?] 
     at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:716) ~[aws-java-sdk-core-1.11.1 
28.jar:?] 
     at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) ~[aws-java-sdk-core-1.11.128.jar:?] 
     at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) ~[aws-java-sdk-core-1.11.128.jar 
:?] 
     at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) ~[aws-java-sdk-core-1.1 
1.128.jar:?] 
     at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) ~[aws-java-sdk-core-1.11.128.jar:?] 
     at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4169) ~[aws-java-sdk-s3-1.11.128.jar:?] 
     at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4116) ~[aws-java-sdk-s3-1.11.128.jar:?] 
     at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:1237) ~[aws-java-sdk-s3-1.11.128.jar:?] 
     at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:1213) ~[aws-java-sdk-s3-1.11.128.jar:?] 
     at com.amazonaws.services.s3.AmazonS3Client.doesObjectExist(AmazonS3Client.java:1272) ~[aws-java-sdk-s3-1.11.128.jar:?] 

另一個奇怪的是,當我提出我的Java程序中的EC2遠程機器上的所有這些問題開始。 如果我在本地機器上執行它,S3交互工作正常。 但是我不認爲問題依賴於IAM角色,因爲我使用AWSStaticCredentialsProvider。

+0

我敢肯定這是您的「憑證文件」可訪問性(那些myaccesskey()方法)的問題,只是爲了證明,用真實的accesskey和安全密鑰替換它們。 – kosa

+0

我在創建AWSStaticCredentialsProvider後檢查了provider.getCredentials(),並且它返回了正確的憑證... 所以我想這些方法是正確的(除了他們可怕的臨時名稱:P) –

+0

當您更改順序,然後檢查存在,這對EC2工作正常嗎?如果是這樣,我們可以得出結論,這不是一個政策問題。我們可以檢查你的完整代碼和你正在使用的aws-sdk的版本嗎? – kosa

回答

0

我真的看起來像一個IAM政策問題。 您的本地計算機上的用戶策略是什麼?您的IAM角色與哪個策略有關? 對於您的EC2實例,創建它時,請使用「AmazonS3FullAccess」策略創建一個角色,如果它解決了問題,您將刪除無用的權限。

+0

但是,如果這是一個IAM政策問題,爲什麼它會在我執行上傳後「神奇地」消失? :/ –

1

您的憑據可能是正確的,但如果您沒有設置正確的IAM策略,您仍然會獲得FORBIDDEN。要在S3中檢查對象,你需要以下條件:

{ 
    "Version":"2012-10-17", 
    "Statement":[ 
     { 
      "Effect":"Allow", 
      "Action":[ 
      "s3:ListBucket" 
      ], 
      "Resource":["arn:aws:s3:::examplebucket/*"] 
     }, 
     { 
      "Effect":"Allow", 
      "Action":[ 
      "s3:GetObject" 
      ], 
      "Resource":["arn:aws:s3:::examplebucket/*"] 
     } 
    ] 
} 
+0

這對我來說只適用於「資源」:[「*」]爲「s3:ListBucket」操作。 (這裏的關鍵是「s3:ListBucket」動作。) – user1648825

1

確保日期時間是否正確設置你正在從請求上機,否則你將得到一個403

+0

這不能提供問題的答案。一旦你有足夠的[聲譽](https:// stackoverflow。com/help/whats-reputation)你將能夠[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/17343502) – Rob