【AWS】 異なるAWSアカウントのS3バケット間でコピーしたオブジェクトが「403 Access Denied 」になったときの対処法

異なるAWSアカウントのS3間のデータコピーをAWS CLIで実施した際に権限回りで少しはまったので備忘録です。

問題

f:id:ykoomaru:20200105161244p:plain

◆環境
・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 Access Denied エラーを解決する

◆解決方法
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