web-dev-qa-db-ja.com

AWS S3 Java SDK-アクセス拒否

AWS SDKを使用してバケットとそのすべてのオブジェクトにアクセスしようとしていますが、コードの実行中に、スレッド「メイン」com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: X), S3 Extended Request ID: Y=で例外としてエラーが発生します

私が不足している場所と、アクセス拒否エラーが発生している理由をお勧めしますが、バケットに対する次のすべての許可を取得しています:

s3:GetObject
s3:GetObjectVersion
s3:GetObjectAcl
s3:GetBucketAcl
s3:GetBucketCORS
s3:GetBucketLocation
s3:GetBucketLogging
s3:ListBucket
s3:ListBucketVersions
s3:ListBucketMultipartUploads
s3:GetObjectTorrent
s3:GetObjectVersionAcl

コードは次のとおりです。

AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
conn.setEndpoint(bucketName);
Bucket bucket = conn.createBucket(bucketName);
ObjectListing objects = conn.listObjects(bucket.getName());
do {
    for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
            System.out.println(objectSummary.getKey() + "\t" +
                    objectSummary.getSize() + "\t" +
                    StringUtils.fromDate(objectSummary.getLastModified()));
    }
    objects = conn.listNextBatchOfObjects(objects);
} while (objects.isTruncated());
22
gkbstar

これで問題は解決しました。コードには次の問題がありました。

  1. エンドポイントが正しくありませんでした。正しいエンドポイントがあるはずです。
  2. バケットに十分な許可が与えられていません。 AWS SDKでバケットを使用する前に、完全なアクセス許可のリストを取得する必要があります。

以下は正しいコードです

AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
conn.setEndpoint("correct end point");
Bucket bucket = conn.createBucket(bucketName);
ObjectListing objects = conn.listObjects(bucket.getName());
do {
    for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
            System.out.println(objectSummary.getKey() + "\t" +
                    objectSummary.getSize() + "\t" +
                    StringUtils.fromDate(objectSummary.getLastModified()));
    }
    objects = conn.listNextBatchOfObjects(objects);
} while (objects.isTruncated());
7
gkbstar

IAMに移動して、APIに使用されているユーザー[Access Key&Secret Key]にS3ベースのAPIを使用する前兆があるかどうかを確認します。

指定されたユーザーにS3ポリシーを添付-S3フルアクセスで試してください。これが機能したら、アクセスをきめ細かくすることができます。詳細については、このリンクを確認してください[ Managing IAM Policies ]

24
Naveen Vijay

正しいIAMポリシーを設定し、バケット/パスを確認してもエラーが表示される場合は、Apache HTTPクライアントの依存関係を確認してください。 Apache HTTPクライアント4.5.5は正常に動作しますが、4.5.7以降は何らかの奇妙な理由で失敗します(フォルダーパスセパレーターを適切にエンコードしない)。その場合は、Apache HTTPクライアントのバージョンを明示的に4.5.5に設定する必要があります。または、少なくとも動作する他のバージョンが必要です。

0

バケットの許可タブで、チェックを外します:

  • このバケットのパブリックアクセス制御リスト(ACL)を管理する
  • 新しいパブリックACLをブロックし、パブリックオブジェクトをアップロードする(推奨)

そして問題はなくなった。

0
phongnt