Amazon S3 バケットで sync コマンドを実行すると、ListObjectsV2 で Access Denied (アクセス拒否) エラーが表示されるのはなぜですか?

最終更新日: 2022 年 8 月 10 日

Amazon Simple Storage Service (Amazon S3) バケットとの間でオブジェクトのコピーを実行するために、aws s3 sync コマンドを使用しています。しかし、ListObjectsV2 オペレーションを呼び出すと、Access Denied (アクセス拒否) エラーが発生します。解決方法を教えてください。

簡単な説明

aws s3 sync コマンドを実行すると、Amazon S3 は、ListObjectsV2CopyObjectGetObject、および PutObject の各 API を呼び出します。

具体的には、次の処理が行われます。

1.    Amazon S3 は、オブジェクトが存在するかどうかをチェックするために、ソースと宛先をリストします。

2.    次に、Amazon S3 は次の API 呼び出しを実行します。

バケットからバケットへのオペレーションのための CopyObject 呼び出し
バケットからローカルへのオペレーションのための GetObject
ローカルからバケットへのオペレーションのための PutObject

注: この解決方法では、GetObject 呼び出しおよび PutObject 呼び出しが AWS Identity Access Managemen (IAM) ユーザーまたはロールに既に付与されていることを前提としています。この解決方法では、ListBucket 権限の不適切な、またはリクエスタ支払いでの誤った sync コマンド構文の使用によって引き起こされるアクセス拒否エラーを解決する方法について説明します。

解決方法

IAM ポリシーの設定

オブジェクトのコピー先またはコピー元の Amazon S3 バケットで s3:ListBucket のアクセス許可があることを確認します。ListObjectsV2 アクションを実行するには、このアクセス許可が必要です。

注: s3:ListBucket は、ユーザーがバケット内のオブジェクトを一覧表示できるようにするアクセス許可の名前です。ListObjectsV2 は、バケット内のオブジェクトを一覧表示する API コールの名前です。

IAM ユーザーまたはロールが別の AWS アカウントに属している場合は、IAM およびバケットポリシーで s3:ListBucket アクションが許可されているかどうかを確認してください。IAM ポリシーとバケットポリシーの両方で s3:ListBucket へのアクセス許可が必要です。

ユーザーまたはロールがバケット所有者のアカウントに属している場合、IAM ポリシーとバケットポリシーの両方で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/testusers3: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 コマンドを使用する

バケットが別の AWS アカウントに属し、リクエスタ支払いが有効になっている場合は、バケットポリシーと IAM 権限の両方が ListObjectsV2 権限を付与していることを確認します。ListObjectsV2 権限が適切に付与されている場合は、sync コマンドの構文を確認します。sync コマンドを使用する場合は、request-payer リクエスタオプションを含める必要があります。そうしない場合、「アクセス拒否」エラーが表示されます。

例:

aws s3 sync ./ s3://requester-pays-bucket/ --request-payer requester