異なるAWSアカウントのS3間のデータコピーをAWS CLIで実施した際に権限回りで少しはまったので備忘録です。
問題
◆環境
・AWSアカウント A : コピー元のS3バケット
・AWSアカウント B : コピー先のS3バケット
◆実行コマンド
aws s3 cp s3://<AWSアカウントA S3バケット名>/ s3://<AWSアカウントB S3バケット名>/
◆問題
① AWSアカウントAのIAMクレデンシャルと使って、AWS CLIでAWSアカウントBのS3バケットにオブジェクトをコピー。
② AWSアカウント Bコピーしたオブジェクトを参照したところ、全て「403 Access Denied 」となり、オブジェクトの中身を確認することができない。
※ AWSアカウント AのIAMポリシーの設定 および AWSアカウントBのS3バケットのバケットポリシーは設定済みの状態でした。
原因と解決方法
◆原因
ACLの設定ミス。
オブジェクトをコピーする際に、コピー先のS3バケットの所有者(AWSアカウントB)にアクセス許可を行っていなかったため、AWSアカウントBでオブジェクトにアクセスすることができなかった。
以下AWSの公式ドキュメントの引用。
デフォルトでは、S3 オブジェクトの所有者はそれをアップロードした AWS アカウントです。これは、バケット所有者が他のアカウントである場合にも当てはまります。オブジェクトへのアクセス権を取得するには、オブジェクト所有者が明示的にあなた (バケット所有者) にアクセス権を付与する必要があります。
オブジェクト所有者は、オブジェクトのアクセスコントロールリスト (ACL) を更新することによって、バケット所有者にオブジェクトのフルコントロールを付与できます。オブジェクト所有者は、put 操作または copy 操作中、またはオブジェクトがバケットに追加された後に ACL を更新できます。
他のアカウントによってアップロードされた S3 オブジェクトから 403 エラーを解決する
◆解決方法
AWSアカウントA からデータをコピーする際に、AWSアカウントBのバケット所有者にアクセス許可をする。
AWS CLIの場合は、--acl bucket-owner-full-control
オプションを付与したS3 cpコマンドを実行します。
aws s3 cp s3://<AWSアカウントA S3バケット名>/ s3://<AWSアカウントB S3バケット名>/ --acl bucket-owner-full-control
最後に
マルチアカウントでAWSを利用していると結構権限回りではまることがあります。
S3で権限回りではまったときは以下の項目を確認してみてください!!
- IAM回り
- IAM ポリシー :実行権限があるか
- IAM Role : クロスアカウント場合は信頼関係が設定されているか
- S3バケットポリシー
- S3 ACL
ーーーーーーーーーーーーー