雲のメモ帳

猫とクラウドと旅行が好きなインフラエンジニアです。 日々の調べたことや興味が持ったことをこのブログにアウトプットします。

異なる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 エラーを解決する

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

ーーーーーーーーーーーーー