上記のように、アカウントAからのアカウントB所持のBucketを利用してみるのを、リソースベースのポリシーを利用してやってみた。
今のところアカウントAのManagement ConsoleでアカウントBのBucketを表示して操作はできなさそう。
ACLでなんとかしてみる
- アカウントAのemail、もしくは以下のようにアカウントAの適当なS3 Bucketからower idを調べておく
$ aws s3api get-bucket-acl --output text --query 'Owner.ID' --bucket [適当なBucket]
- アカウントBのマネージメントコンソールで対象のS3 BucketのPropertiesからPermissionsを設定
- Permissionを追加し、Ganteeに上で調べた[emailもしくはowner id]を指定して与えたい権限にチェックを入れてSave
- アカウントAで対象のS3 Bucketにアップロードしてみる => 成功
- アップロードされたオブジェクトはアカウントAに対する権限しかない
$ aws s3 cp [適当なファイル] s3://[対象のS3 Bucket]/
Bucket Policyでなんとかしてみる
- アカウントBのマネージメントコンソールで対象のBucketのPilicyを以下のように設定する
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[アカウントAのアカウントID]:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::[対象のBucket名]/*",
"arn:aws:s3:::[対象のBucket名]"
]
}
]
}
- アカウントAで対象のS3 Bucketにアップロードしてみる => 成功
- アップロードされたオブジェクトはアカウントAに対する権限しかない
$ aws s3 cp [適当なファイル] s3://[対象のS3 Bucket]/
オブジェクトにアカウントBの権限がつかないのをなんとかしてみる
-
上記どちらの手順でもアップロードしたオブジェクトはアカウントBの権限がなく、アカウントBから閲覧や権限変更ができない(バケットに権限はあるので削除などは可能)
- Bucket PolicyでアカウントBのアクセスを許可してもオブジェクトのownerとバケットのownerが一致しないため適用されないらしい(Amazon S3に別アカウントから書き込みを許可する場合の設定 | cloudpack技術情報サイト参照)
一応、以下のようにアップロードするとACLが設定されてアカウントBからも閲覧や権限変更が可能になる。
$ aws s3 cp --acl bucket-owner-full-control [適当なファイル] s3://[対象のS3 Bucket]/
or
$ aws s3 cp [適当なファイル] s3://[対象のS3 Bucket]/ --grants full=emailaddress=[アカウントBのe-mail]
- 対象のBucketに対して以下のようなBucket PolicyをStatementに追加すると、アカウントBに対してフルコントロール権限を付けることを強制できる
- が、上記のアップロード例2つのうち後の方しか許さないような形なので柔軟性はないのかな
{
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::[アカウントAのアカウントID]:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::[対象のBucket]/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-grant-full-control": "emailaddress=[アカウントBのe-mail]"
}
}
}