nmtysh.log

Tech系のネタや日々の独り言などを書いています。

異なるアカウントのS3バケットを参照するにはIAMポリシーとバケットポリシーの両方が必要

タイトルのまんまです。   異なるアカウントのS3バケットを参照するにはIAMポリシーとバケットポリシーの両方が必要です。

何をしたかったのか

別で作成したアカウントのS3バケットにファイルをコピーがしたかったんです。
ローカルに落とすとネットワークに負荷がかかるので、S3 to S3 で直接コピーすることにしました。

転送先のアカウントでIAMアカウントを作成して、転送先のS3バケットへのアクセス権限を与えました。
転送元のS3バケットポリシーには転送先アカウントからのアクセス許可を設定しました。


(こんな状態)

いざ aws s3 sync s3://Bucket123 s3://Bucket456 --profile IAM456 を実行すると ListObjectsでAccess deniedのエラーになりました。
aws s3 ls s3://Bucket123 --profile IAM456 これもエラー
aws s3 ls s3://Bucket123 --profile IAM123 これはOK
aws s3 ls s3://Bucket456 --profile IAM456 これもOK
(図と合わせただけなので、指定が微妙に間違っているのは気にしないでください)

権限が足りないのかと思い、S3関連の全権を与えてみても変わらず……

何が足りなかったのか

転送先のIAMアカウントに対して転送元のS3バケットへのアクセス権の設定が足りませんでした。


図の例だと、IAM456のポリシーにバケット123へのアクセス権を付与すると転送ができました。

結論

IAMポリシーとバケットポリシーの両方に対して適切なアクセス許可の設定が必要でした。
S3 to S3の方法を調べた時に転送元のS3バケットバケットポリシーの設定ばかりが目に付きました。
そのため、てっきりバケットポリシーの設定だけでできるのかと思い込んでいたのですが、IAMポリシーの設定も必要だったとは……

考えてみるとこの仕様は正しいんですけどね。
そのIAMができることのポリシーなのですから、IAMポリシーで許可していないことはできませんし、できちゃダメですよね。