web-dev-qa-db-ja.com

異なるAWSアカウントのs3バケット間で同期するとアクセスが拒否される

異なるAWSアカウントの2つのバケット間の同期をセットアップしようとしています。

私はcpを使って作業しました:

_@ubuntu:~$ s3cmd cp -v s3://src/dir/ s3://dest/folder --recursive
_

私は_/src/dir_を所有するユーザーであり、追加しました:

_{
"Version": "2012-10-17",
"Id": "Policy1477299702471",
"Statement": [
    {
        "Sid": "Stmt1477299696163",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::awsid:user/name"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::bucket/*"
    }
]}
_

テストバケットのバケット権限ポリシー。

_aws sync_をcronで使用することは推奨されていないため、私は_s3 cp_が機能するようになりました。

私は試した

_user@ubuntu:~$ aws s3 sync --dryrun s3://src/ s3://dest/ --region eu-central-1
_

しかし、私はアクセスが拒否されます:

致命的なエラー:ListObjects操作の呼び出し時にエラーが発生しました(AccessDenied):アクセスが拒否されました

バケットを所有しているユーザーがアクセスを拒否され、同期が実行されるようにするにはどうすればよいですか?

7
OrigamiEye

ListObjectsエラーの原因は、バケット(arn:aws:s3:::bucket/*)のcontentsにアクセスする権限を割り当てたが、権限を付与しなかったことが原因です- バケット自体にarn:aws:s3:::bucket)。 ListObjectsコマンドには、バケットへのアクセスが必要です。

これをテストするために、次のことを行いました。

  • 2つのAWSアカウントを使用:アカウントA、アカウントB
  • アカウントAにbucket-aを作成しました
  • アカウントBにbucket-bを作成しました
  • user-aへのアクセス権限を持つアカウントAにIAMユーザーbucket-aを作成しました
  • bucket-bにバケットポリシーを追加しました:

    {
      "Id": "CopyBuckets",
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1",
          "Action": "s3:*",
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::bucket-b",
            "arn:aws:s3:::bucket-b/*"
          ],
          "Principal": {
            "AWS": [
              "arn:aws:iam::<account-a-id>:user/user-a"
            ]
          }
        }
      ]
    }
    

次に、アカウントAでuser-aを使用して同期をトリガーしました。

aws s3 sync s3://bucket-a s3://bucket-b --profile user-a

うまくいきました。

13
John Rotenstein