ablog

不器用で落着きのない技術者のメモ

クロスアカウントのS3バケット間コピーを行うとコピー実行ユーザーが所有者になる

検証したこと

  • クロスアカウントのS3バケット間コピーを行うとコピー実行ユーザーが所有者になる
  • コピー先アカウント(バケット所有者)に権限を付与することが可能

手順

  • アカウントAにファイルをアップロードする
$ aws s3 cp test.txt s3://az-test-src/                                                                                                                                                                              
upload: ./test.txt to s3://az-test-src/test.txt
  • アカウントAからアカウントBにファイルをコピーする
$ aws s3 cp s3://az-test-src/test.txt s3://az-test-dst/                                           
copy: s3://az-test-src/test.txt to s3://az-test-dst/test.txt
  • オブジェクトの所有者はコピー元アカウントになっている
$ aws s3api get-object-acl --bucket az-test-src --key test.txt
{
    "Owner": {
        "DisplayName": "azekatsu", ★コピー元アカウント
        "ID": "...."
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "azekatsu",
                "ID": "..."
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

https://docs.aws.amazon.com/ja_jp/cli/latest/reference/s3api/put-object-acl.html を見ても所有者の変更はできなさそう。

  • コピー先アカウントにオブジェクトに対するフルコントロールを付与する
$ aws s3api put-object-acl --bucket az-test-dst --key test.txt --acl bucket-owner-full-control
  • フルコントロール権限が付与されたことを確認する
$ aws s3api get-object-acl --bucket az-test-dst --key test.txt
{
    "Owner": {
        "DisplayName": "azekatsu",
        "ID": "..."
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "azekatsu",
                "ID": "..."
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "yoheia", ★コピー先アカウント(バケット所有者)にフルコントロール権限が付与されている
                "ID": "..."
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}