Amazon Simple Storage Service (Amazon S3) バケットとの間でオブジェクトのコピーを実行するために、aws s3 sync コマンドを使用しています。しかし、ListObjectsV2 API コールを行うと、アクセス拒否エラーが表示されます。
簡単な説明
sync コマンドを実行すると、Amazon S3 は ListObjectsV2 API コールを発行して、オブジェクトがソースバケットまたは送信先バケットのいずれかに存在するかどうかを確認します。オブジェクトがいずれのバケットにも存在しない場合、Amazon S3 は次の API コールを実行します。
- バケット間オペレーション用の CopyObject コール
- バケットからローカルへのオペレーション用の GetObject
- ローカルからバケットへのオペレーション用の PutObject
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、使用している AWS CLI が最新バージョンであることを確認してください。
IAM ポリシーの設定
**注:**この解決策では、GetObject および PutObject アクションが AWS Identity Access Management (IAM) ユーザーまたはロールにすでに付与されていることを前提としています。この解決策では、ListBucket 権限が不適切であったり、Requester Pays で正しくない sync コマンド構文を使用したりしたために発生するアクセス拒否エラーを解決する方法について説明します。
オブジェクトのコピー先またはコピー元となる Amazon S3 バケットに対する s3:ListBucket 権限があることを確認します。ListObjectsV2 API コールを実行するには、このアクセス許可が必要です。
IAM ユーザーまたはロールが別の AWS アカウントに属している場合は、IAM とバケットポリシーで s3:ListBucket アクションが許可されているかどうかを確認してください。IAM ポリシーとバケットポリシーの両方で s3:ListBucket に対するアクセス許可が必要です。
ユーザーまたはロールがバケット所有者のアカウントに属している場合、IAM ポリシーとバケットポリシーの両方でs3:ListBucketを許可する必要はありません。s3:ListBucket アクションを許可するために必要なポリシーは 1 つだけです。
**重要:**IAM ポリシーまたはバケットポリシーのいずれかで、s3:ListBucket アクションが既に許可されている場合、そのアクションを明示的に拒否するステートメントあるかどうか、他のポリシーを確認してください。明示的な拒否ステートメントが、許可ステートメントを上書きしてしまうからです。
次の IAM ポリシーの例では、s3:ListBucket アクセス権限を付与しています。
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "Stmt1546506260896",
"Action": "s3:ListBucket",
"Effect": "Allow",
"Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET"
}]
}
次のバケットポリシーの例では、ユーザー arn:aws:iam::123456789012:user/testuser に s3:ListBucket へのアクセス権限を付与しています。
{
"Id": "Policy1546414473940",
"Version": "2012-10-17",
"Statement": [{
"Sid": "Stmt1546414471931",
"Action": "s3:ListBucket",
"Effect": "Allow",
"Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:user/testuser"
]
}
}]
}
リクエスタ支払いで sync コマンドを使用する
バケットが別の アカウントに属し、リクエスタ支払いが有効になっている場合は、バケットポリシーと IAM ポリシーの両方が ListObjectsV2 アクセス許可を付与していることを確認してください。ListObjectsV2 権限が適切に付与されている場合は、sync コマンドの構文を確認してください。sync コマンドの実行時に --request-payer リクエスタオプションを含めないと、アクセス拒否エラーが表示されます。
たとえば、次の sync コマンドを実行しますが、requester-pays-bucket を自分のバケットの名前に置き換えてください。
aws s3 sync ./ s3://requester-pays-bucket/ --request-payer requester
関連情報
バケット所有者がクロスアカウントのバケットのアクセス許可を付与する
Amazon S3 のアイデンティティベースのポリシー