1

AWS SDKを使用してS3バケットと対話するJavaプログラムに問題があります。AWS S3 Java:d​​oesObjectExistの結果は403:FORBIDDEN

s3Client.doesObjectExists(bucketName, objectName); 
:私は、ファイル天気をチェック、ダウンロードが存在するかを開始する前に、ファイルをダウンロードしようとすると

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(); 

この

は、私はS3のクライアントを作成するために使用するコードです

ここで私は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のやりとりはうまく動作します。 しかし、私はAWSStaticCredentialsProviderを使用しているため、問題はIAMの役割に依存しないと思います。

+0

を取得します、日付時刻は、あなたがからの要求を行っているマシン上で正しく設定されていることを確認しますこれはあなたの "資格ファイル"のアクセシビリティ(これらのmyaccesskey()メソッド)で問題になります。実際のアクセスキーとセキュリティキーで置き換えてください。 – kosa

+0

AWSStaticCredentialsProviderを作成した後、provider.getCredentials()をチェックして、正しい資格情報を返します。 そうですね、これらのメソッドは正しいと思います(恐ろしい一時的な名前は別として:P) –

+0

注文を変更すると、PUTして、存在を確認し、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

"Resource":["*"] "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-代わりに)。 - [レビューの投稿](/レビュー/低品質の投稿/ 17343502) – Rob

関連する問題