CloudFormation でオブジェクトロックを有効化したS3バケットを作成したいが、InvalidBucketStateエラーが発生する
困っていた内容
テンプレートを使用し、オブジェクトロックを有効化した S3 バケットを CloudFormation で作成したいのですが、スタックを実行すると「Object Lock configuration cannot be enabled on existing buckets (Service: Amazon S3; Status Code: 409; Error Code: InvalidBucketState; Request ID: XXXXXXXXXX; S3 Extended Request ID: XXXXXXXXXX; Proxy: null)」というエラーが発生します。
CloudFormation スタックのイベント画面
使用したテンプレート
オブジェクトロック有効化のための記述は 8 行目以降です。
AWSTemplateFormatVersion: 2010-09-09 Description: 'Create an S3 bucket with Object Lock' Resources: S3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: cm-s3-objectlock-enable-test-01 ObjectLockConfiguration: ObjectLockEnabled: Enabled Rule: DefaultRetention: Days: 1 Mode: GOVERNANCE
どう対応すればいいの?
プロパティレベルのObjectLockConfiguration
とObjectLockEnabled
が必要
CloudFormation のユーザガイド を確認すると、S3 オブジェクトロックに関するプロパティは以下の 2 点が存在します。
ObjectLockConfiguration: ObjectLockConfiguration
ObjectLockEnabled: Boolean
使用したテンプレートを見ると、ObjectLockConfiguration
(8 行目) も ObjectLockEnabled
(9 行目) も含まれているので一見問題ないように見えます。
ObjectLockConfiguration: ObjectLockEnabled: Enabled
しかしよく見ると、9 行目 ObjectLockEnabled: Enabled
は S3 バケットのプロパティレベルではなく、プロパティObjectLockConfiguration
内に配置されており、また、値も Boolean ではありません。
つまり、プロパティレベルの ObjectLockEnabled: Boolean
が存在していない状態であり、これを追加する必要があります。
では、9 行目、 プロパティObjectLockConfiguration
内のObjectLockEnabled: Enabled
は誤って記述・配置されたものなのでしょうか?
プロパティObjectLockConfiguration
内のObjectLockEnabled
について
プロパティ ObjectLockConfiguration
の データタイプ ObjectLockConfiguration のドキュメント を確認すると、ObjectLockEnabled: String
が存在しています。
ObjectLockEnabled: String Rule: ObjectLockRule
また、許可された値は Enabled
となっています。
- ObjectLockEnabled
- Indicates whether this bucket has an Object Lock configuration enabled. Enable ObjectLockEnabled when you apply ObjectLockConfiguration to a bucket.
- Required: No
- Type: String
- Allowed values: Enabled
- Update requires: No interruption
以上のことから、 プロパティObjectLockConfiguration
内 ObjectLockEnabled: Enabled
は、プロパティObjectLockEnabled: Boolean
とは異なる属性として存在しています。
そのため、使用したテンプレート 9 行目の記述・配置には問題がない、ということになります。
修正したテンプレート
上記をふまえ、修正したテンプレートが以下のものになります。
AWSTemplateFormatVersion: 2010-09-09 Description: 'Create an S3 bucket with Object Lock' Resources: S3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: cm-s3-objectlock-enable-test-02 ObjectLockConfiguration: ObjectLockEnabled: Enabled Rule: DefaultRetention: Days: 1 Mode: GOVERNANCE ObjectLockEnabled: True
まとめ
S3 バケットでオブジェクトロックを有効化する際、以下の二つの ObjectLockEnabled が存在することにご注意ください。
- プロパティ
ObjectLockEnabled: True
- プロパティ
ObjectLockConfiguration
内のObjectLockEnabled: Enabled