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


Amazon S3 Object Ownership

2020年10月2日公開
Amazon S3 Object Ownership が利用可能になり、バケットにアップロードされたオブジェクトの所有権をバケット所有者が自動的に引き受けることが可能に

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


共有データセット・・・?

クロスアカウントで保存されたデータを、Athenaでクロスアカウントアクセスするときに便利だった

ここではCloudTrailを例にとる。CloudTrailがS3に保存するオブジェクトへのアクセス権限は、次の状態になる。

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

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

何が問題か?

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

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

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

{
    "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

Objectにアクセスできませんエラーになる。

Obucjet Ownershipの変更がない時代

別AWSアカウントに保存しているCloudTrailログをAthenaから検索する - 本日も乙の記事に詳しい。

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

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

after

このようにすると保存されるログの持ち主はBucketの所有者となる。

アクセスできてハッピー

まとめ

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

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