{ "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/*" ] } ] }
- コピー元アカウントAのEC2インスタンスでアカウントAのS3バケットからアカウントBのS3バケットにコピーする。EC2インスタンスにはAmazonS3FullAccessポリシーがアタッチされたIAMロールをアタッチしている。
$ 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” がある。
原義としては「(何らかの集団の中で)一番目の人」の意味なので、下記の意味が出てきたのだろう。
「(演劇などの他の端役に対して)主役」「(オーケストラの他の楽器担当に対して)独奏」
https://qiita.com/knaka/items/69724ee0b5aaf6108a55
「(一緒に働く代理人に対して)本人」
つまりは、そのポリシーを持ったもの(User や Role)の権限で動く際はいわば agent であり、それを使う側(ユーザやサービス)が principal(代理人ではなく、代理人を使う本人)である、という意味になる。
参考
- 【そんなときどうする?】S3をクロスアカウントで使いたい – サーバーワークスエンジニアブログ
- クロスアカウントで S3 sync するための権限設定 | DevelopersIO
- メモOFF: 別アカウントのIAMアカウントに対してs3へのアクセス権限を与える
- https://qiita.com/ori3/items/69905a20587dd3ed594d
- https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_principal.html
追記(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/*" ] } ] }