boto3を使ってS3バケットのACLを無効化する

こんにちは。サービス部の武田です。今回Pythonのboto3を使って、S3バケットのACLを無効化する機会がありましたので共有します。
2022.09.28

こんにちは。サービス部の武田です。

Amazon S3のポリシー設定は歴史的な経緯から複雑になっています。特に複雑にしているのがACLの存在ですが、これは2021年のアップデートで無効化できるようになりました。また、 無効化が推奨 されています。

今回Pythonのboto3を使って、ACLを無効化する機会がありましたので共有します。

必要な権限

ACLを無効化する際にはs3:PutBucketOwnershipControlsの権限が必要です。事前に付与されているか、されていない場合は追加することを忘れないでください。

新規バケット作成時に無効化する

新規バケットを作成する際に、ACLを無効化できます。create_bucketObjectOwnershipパラメーターが指定できるため、ここにBucketOwnerEnforcedを指定すればOKです。

s3 = boto3.client("s3")

s3.create_bucket(
    Bucket="YOUR_BUCKET_NAME",
    CreateBucketConfiguration={"LocationConstraint": "ap-northeast-1"},
    ObjectOwnership="BucketOwnerEnforced",
)

既存バケットを無効化する

既存のバケットのACLを無効化する場合、put_bucket_ownership_controlsを使用します。OwnershipControlsパラメーターはdictになっており、RulesObjectOwnership: BucketOwnerEnforcedを指定します。

s3 = boto3.client("s3")

s3.put_bucket_ownership_controls(
    Bucket="YOUR_BUCKET_NAME",
    OwnershipControls={
        "Rules": [
            {"ObjectOwnership": "BucketOwnerEnforced"},
        ]
    },
)

注意する点として、ACLの設定をデフォルトから変更している場合エラーとなります。その場合は少し手間ですが設定を元に戻すなりの対応が必要です。

まとめ

S3バケットのACLは無効化が推奨されています。特別な理由がない限りは無効化して運用をしましょう。