Amazon S3 Object Ownershipは、Athenaのクロスアカウントアクセスを解決してくれるニクいやつだ

# Amazon S3 Object Ownership
2020年10月2日公開
[Amazon S3 Object Ownership が利用可能になり、バケットにアップロードされたオブジェクトの所有権をバケット所有者が自動的に引き受けることが可能に](https://aws.amazon.com/jp/about-aws/whats-new/2020/10/amazon-s3-object-ownership-enables-bucket-owners-to-automatically-assume-ownership-of-objects-uploaded-to-their-buckets/)

> S3 Object Ownership は、Amazon S3 で共有データセットを作成および維持する作業を簡素化します。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/09d72d9d-fbad-794d-4eb0-a3cdf707759d.png)
共有データセット・・・？

# クロスアカウントで保存されたデータを、Athenaでクロスアカウントアクセスするときに便利だった
ここではCloudTrailを例にとる。CloudTrailがS3に保存するオブジェクトへのアクセス権限は、次の状態になる。

* オブジェクト所有者： **CloudTrail**
* オブジェクトのアクセス権限： Bucket Owner Full Access

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/ad85064a-1c6c-11cd-57f2-f98491e9cf59.png)

Owner Full AccessがついているのであるアカウントAでS3にアクセス権を持つユーザであれば誰でもアクセスできるが、所有者はあくまでCloudTrail。

## 何が問題か？
マルチアカウント環境下で、あるアカウントに集約されたログ（ここではCloudTrailの）を見たいことは**よくある**。また、ログ集約アカウントへのアクセスを許可せず、他のメンバーアカウントからアクセスしたいことも**よくある**。

しかし、ドキュメントに従って進めたとしても、クロスアカウントなAthenaで読み出すことはできない。なぜなら、S3 Bucketに保存されている情報の所有者はCloudTrailであって保存先アカウントではないため、S3 Bucket所有者といえど好きにすることはできない

Athenaのドキュメントには、クロスアカウントでアクセスする場合、以下のBucket Policyを設定するように書いてあるが、所有者が別だとオブジェクトへのアクセス許可は付与されない。

```json
{
    "Version": "2012-10-17",
    "Id": "MyPolicyID",
    "Statement": [
        {
            "Sid": "MyStatementSid",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789123:root"
            },
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-athena-data-bucket",
                "arn:aws:s3:::my-athena-data-bucket/*"
            ]
        }
    ]
}

```

cf. [Amazon S3 バケットへの Athena のクロスアカウントアクセス - Amazon Athena](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cross-account-permissions.html)

Objectにアクセスできませんエラーになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/14e09d7a-f436-5dc8-579d-5458b5417100.png)


## Obucjet Ownershipの変更がない時代
[別AWSアカウントに保存しているCloudTrailログをAthenaから検索する - 本日も乙](https://blog.jicoman.info/2019/01/using-athena-cloudtail-logs-anorher-aws-account/)の記事に詳しい。

一つ一つのオブジェクトを頑張って権限変更する。とてもつらい。

```bash
aws s3 cp \
s3://cloudtrail-test/AWSLogs/123456789123/CloudTrail/ap-northeast-1/2018/12 \
s3://cloudtrail-test/AWSLogs/123456789123/CloudTrail/ap-northeast-1/2018/12 \
--recursive \
--grants full=id=<CloudTrailの開アカウントID>,id=<S3バケット所有者のアカウントID> \
read=id=<Athena検索するアカウントID>
```



## Objcet Ownershipの変更がある時代
before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/58a59de3-8dab-813d-2904-1129f291915f.png)


after
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/b5936834-f300-01fd-63ce-ba4aa2d58c12.png)

このようにすると保存されるログの持ち主はBucketの所有者となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/c0d56973-e476-9a72-a22a-0e891d6117cf.png)

アクセスできてハッピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/4be73c8e-b606-24b9-518e-895b30608d13.png)

# まとめ
> S3 Object Ownership は、Amazon S3 で共有データセットを作成および維持する作業を簡素化します。 

Object Ownershipは、共有データセットの作成と維持に本当に便利だった。
Athenaのクロスアカウントアクセスを解決してくれるニクいやつ。