別アカウントからS3にアップロードされたファイルの所有者を変更する

# はじめに
複数アカウントを運用していると別アカウントからS3にファイルをアップロードされることがあると思います。
その場合、デフォルトでは元のアカウントを所有者としてファイルがアップロードされてしまいます。

S3バケットとアップロードされたファイルの所有者が異なる場合はコマンドによる復元操作ができないなどの問題が発生するため、今回はその対応方法について試してみました。

# 実施手順
## ファイルのアップロード
別アカウントからS3バケットにファイルをアップロードします。
※アップロードはEC2にアタッチしたIAMロールを使用して行いました
※アップロード先のS3バケットのポリシーでIAMロールを許可しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a4231088-fbac-9e17-88a3-7a40a189da7e.png)

アップロード方法は以下のブログで書いているので、そちらをご参照ください。
https://www.capybara-engineer.com/entry/2021/05/20/120604

所有者はアップロード元のAWSアカウントになっていました。(諸事情でモザイクかけてます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/8cefe909-3277-021d-6bdc-b39582f94dce.png)

その状態だとS3バケット所有者のアカウントからオブジェクトにアクセスする権限が足りていないので、このようにエラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/d181b7d3-665f-00b2-55ff-84d500cd84d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/2c2f0c3f-5e1b-97f2-4b03-faa3a81e6afc.png)

## アップロード時にオブジェクトの所有者を変更する
2020年10月にAWSから以下のUpdateがありました。
簡単に言うとS3バケット側の設定で「Object Ownership」を設定し、アップロード時に[bucket-owner-full-control]を指定することで所有者をS3バケットのアカウントに変更できるようになりました。
https://aws.amazon.com/jp/blogs/aws/amazon-s3-update-three-new-security-access-control-features/

設定内容は↑のリンクに書いてますが、順番に実施していきます。

対象のS3バケットのアクセス許可タブを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/c1d5e899-74ac-ed95-b528-9e799f63882f.png)

オブジェクト所有者の設定の部分で編集ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/de258170-ec00-64e0-0936-67f15da369b5.png)

デフォルトはオブジェクトライターになっているので、これをバケット所有者に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e0ae1310-8986-1c50-f92c-05cc2187c63f.png)

更新が完了すると画面に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e5b8649f-3d54-36cd-558f-b361d3e75def.png)

変更できたので、再度別アカウントからファイルをアップロードしてみます。
まずは[bucket-owner-full-control]を指定しないアップロードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/b92a2615-71f5-7fb9-d1cd-1fe89dad5068.png)

オブジェクトを見ると所有者は特に変わってません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/b054fce1-5e68-4146-192e-dbfe3027a0d8.png)

次は[bucket-owner-full-control]を指定してアップロードしてみます。

```
$ aws s3 cp .\test3.txt s3://test-tmp-20210603/test/ --acl bucket-owner-full-control
```

所有者がS3バケットを所有しているAWSアカウントになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e4aeacf9-e562-17d2-463c-138ee00c70ea.png)

設定前ではエラーが出ていたアクセス許可とサーバサイド暗号化の設定もエラーなく確認することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/0fcfba52-0d28-a27a-5740-07c5b3a2675f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/d2ce0e3b-34e6-057f-5ba4-a0b630970f43.png)

## ちなみに
今回のS3バケットでの設定をせずに[bucket-owner-full-control]を指定してアップロードしてもエラーは発生しないようにできます。

ただ、所有者は元のアカウントのままなので、もし指定をせずにアップロードされた場合は思いがけず操作できないということが発生する可能性があります。

その時はバケットポリシーに"s3:x-amz-acl": "bucket-owner-full-control"を指定するなどして、アップロード時に制限するのをオススメします。

# おわりに
簡単ではありますが今まで知らなかったのでやってみました。
複数アカウントからファイルをS3にアップロードするときは気を付けましょう。