やろうとしたこと
AWSアカウント1 から、AWSアカウント2のバケットにファイルを置き、AWSアカウント3 でファイルを取得する。
準備
環境は以下の通り。これでいけるでしょう。
- 共有バケットの作成: AWSアカウント2 でバケット kyouyu を作成。
- アクセス側の設定 :AWSアカウント1 とAWSアカウント3 で kyouyu へのアクセス許可を付与したロール作成。(記載省略)
- 共有バケットの設定:バケットポリシーで上記ロールのアクセスを許可。
kyouyu のバケットポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "kyouyu-Acl", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::AWSアカウント1ID:role/kyouyuアクセス許可付与ロール", "arn:aws:iam::AWSアカウント3ID:role/kyouyuアクセス許可付与ロール" ] }, "Action": [ "s3:ListBucket", "s3:DeleteObject", "s3:GetObjectAcl", "s3:GetObject", "s3:PutObjectAcl", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::kyouyu/*", "arn:aws:s3:::kyouyu" ] } ] }
できるかな
それではファイルを受け渡してみます。
- AWSアカウント1からファイルをアップロード
$ aws s3 cp file1.m4a s3://kyouyu/file1.m4a --acl bucket-owner-full-control upload: ./file1.m4a to s3://kyoyu/file1.m4a - AWSアカウント3からファイル をダウンロード
$ aws s3 cp s3://kyouyu/file1.m4a file1.m4a A client error (403) occurred when calling the HeadObject operation: Forbidden Completed 1 part(s) with ... file(s) remaining
ダウンロードできませんでした。。。
なぜできないのか?
ファイルのオブジェクトの権限を確認してみました。
$aws s3api get-object-acl --bucket kyouyu --key file1.m4a
{
"Owner": {
"DisplayName": "AWSアカウント1",
"ID": 省略
},
"Grants": [
{
"Grantee": {
"DisplayName": "AWSアカウント1",
"ID": 省略
},
"Permission": "FULL_CONTROL"
},
{
"Grantee": {
"DisplayName": "AWSアカウント2のアカウント名",
"ID": 省略
},
"Permission": "FULL_CONTROL"
}
]
}
- ファイルの所有者はAWSアカウント1
- AWSアカウント1、AWSアカウント2 ともにFULL_CONTROL権限
大丈夫なハズと思いAmazonのドキュメントを調べてみると・・・・
バケットの所有者は、自分が所有していないオブジェクトへのアクセス許可を付与できません。 http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/access-policy-alternatives-guidelines.html
- ファイルの所有者 AWSアカウント1 ≠ バケットの所有者 AWSアカウント2
このファイルへは、バケットポリシーで指定したAWSアカウント3へのアクセス許可を付与できません。
なお、AWSアカウント2でアップロードしたファイルは所有者が一致するので、AWSアカウント3でダウンロードできました。
わかったこと
この方法では、複数アカウント間のファイルの受け渡しはできないことがわかりました。
クロスアカウントアクセスが必要になります。 (やっとクロスアカウントの必要性が理解できました)
小田英了
楽曲管理システムのサポートを担当しています。
趣味:ランニング めざせサブ3.5!