[S3]クロスアカウント時のアップロード時の権限エラー[はまった]

2017.11.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

S3のクロスアカウント環境を構築したのですが、クロスアカウント上でアップロードしたファイルをダウンロードしたとろこと権限エラー(Access Denied)になってはまったので記しておきます。

事象

環境

クロスアカウントで S3 sync するための権限設定を参考に、IAMロールベースでクロスアカウントのアクセス設定をしました。

環境は以下となります。

これで、アカウントAのEC2からアカウントBのS3バケットを操作できるようになります。 具体的には、アカウントAのEC2からaws cp [ローカルファイル] s3://[アカウントBのS3バケット名]でファイルをアップロードしました。

権限が足りないエラー発生

アカウントBにファイルをアップロードできましたが、アカウントBにログインしS3にアップロードされたファイルを操作すると、

  • ファイル削除ができる
  • それ以外の操作(ファイルのダウンロードなど)ができない

という状況になってしまいました。

調査

アップロード後の権限がどうなっているか調査しました。

まずはクロスアカウントでない環境(アカウントAからアカウントAにアップロード)の場合aws cp [ローカルファイル] s3://[アカウントAのS3バケット名]

アカウントAの権限が追加されています。

次にクロスアカウント環境(アカウントAからアカウントBにアップロード)の場合aws cp [ローカルファイル] s3://[アカウントBのS3バケット名]

権限が1つもついていません(;゚Д゚)エエー.

解決方法

クロスアカウントの場合は権限を意識する必要がありました。

アップロード時のcpコマンドのオプションに--acl bucket-owner-full-control付与します。

aws s3 cp --acl bucket-owner-full-control [ローカルファイル] s3://[アカウントBのS3バケット名

これで、アカウントBでログインしてファイルダウンロードなどの操作ができるようになりました。

権限がどうなったかみてみましょう。

ちゃんとアカウントAとアカウントBの権限が付与されていました!!

最後に

クロスアカウントでファイルをアップロードするときは、権限を意識する必要がありました。ハマりやすいポイントだと思うので頭の片隅に入れてもらえれば!

追加で!!

以下、suzuki.ryoよりコメントもらいました。STSを利用した方が、権限周りでハマることは減りそうです。

アカウントAでクロス書込許可したS3バケットに、アカウントBから設置したファイル、デフォルトでは削除出来るのはアカウントBだけ。 ライフサイクルで自然消滅したり、絶対消すことのないデータなら良いのかもですが、クロス利用は参照のみが無難と思います。