ablog

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

クロスアカウントで s3 cp する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Sample",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::012345678901:root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::az-test-dst",
                "arn:aws:s3:::az-test-dst/*"
            ]
        }
    ]
}
$ dd if=/dev/urandom of=test.dat bs=5 count=1
$ aws s3 ls s3://az-test-src
2018-05-03 13:35:46          5 test.txt
$ 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 s3 ls s3://az-test-dst
2018-05-04 05:39:36          5 test.txt
  • そのままではコピー先アカウントでアクセス権がない。
$ aws s3 cp s3://az-test-dst/test.txt ./
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
$ aws s3api get-object-acl --bucket az-test-dst --key test.txt
An error occurred (AccessDenied) when calling the GetObjectAcl operation: Access Denied
  • バケット所有者にフルアクセス権限を付与する。
$ 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.d
{
    "Owner": {
        "DisplayName": "discus",
        "ID": "..."
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "discus",
                "ID": "..."
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "yoheia",
                "ID": "..."
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}
$ aws s3 cp s3://az-test-dst/test.txt ./
download: s3://az-test-dst/test.dat to ./test.txt
$ aws s3 rm s3://az-test-dst/test.txt
delete: s3://az-test-dst/test.txt

補足

Principal は、AWS アカウント、IAM ユーザー、IAM ロールなどを指定できる。

  • AWSアカウント
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:root" }
  • IAMユーザー
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:user/user-name" }
  • IAMロール
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }


"Principal" という言葉の意味

ポリシーでは何かと出てくる「プリンシパル」だが、これもどうも今まで意味がピンと来ていなかった。一般的には「(演劇などの)主役, 主演者; (コンサートの)独奏者, 主席奏者; (犯罪の)主犯」の方の意味なんだろうが、別の意味で「〖しばしば〜s〗(代理人に対して)本人; (決闘の介添人に対し)決闘する本人」“a person for whom another acts as an agent or representative” がある。

原義としては「(何らかの集団の中で)一番目の人」の意味なので、下記の意味が出てきたのだろう。

「(演劇などの他の端役に対して)主役」「(オーケストラの他の楽器担当に対して)独奏」
「(一緒に働く代理人に対して)本人」
つまりは、そのポリシーを持ったもの(User や Role)の権限で動く際はいわば agent であり、それを使う側(ユーザやサービス)が principal(代理人ではなく、代理人を使う本人)である、という意味になる。

https://qiita.com/knaka/items/69724ee0b5aaf6108a55

参考


追記(2018/06/18):

  • クロスアカウントでコピーするため参照権限のみ付与する設定。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Sample",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::012345678901:root"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::az-test-src",
                "arn:aws:s3:::az-test-src/*"
            ]
        }
    ]
}