[S3]クロスアカウント時のアップロード時の権限エラー[はまった]
コンニチハ、千葉です。
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だけ。 ライフサイクルで自然消滅したり、絶対消すことのないデータなら良いのかもですが、クロス利用は参照のみが無難と思います。