タイトルのまんまです。 異なるアカウントの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ポリシーで許可していないことはできませんし、できちゃダメですよね。