CloudFormation でオブジェクトロックを有効化したS3バケットを作成したいが、InvalidBucketStateエラーが発生する

2023.06.14

困っていた内容

テンプレートを使用し、オブジェクトロックを有効化した 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 行目以降です。

objlock-enabled-error.yml

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

どう対応すればいいの?

プロパティレベルのObjectLockConfigurationObjectLockEnabledが必要

CloudFormation のユーザガイド を確認すると、S3 オブジェクトロックに関するプロパティは以下の 2 点が存在します。

  • ObjectLockConfiguration: ObjectLockConfiguration
  • ObjectLockEnabled: Boolean

使用したテンプレートを見ると、ObjectLockConfiguration (8 行目) も ObjectLockEnabled (9 行目) も含まれているので一見問題ないように見えます。

objlock-enabled-error.yml

      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

以上のことから、 プロパティObjectLockConfigurationObjectLockEnabled: Enabledは、プロパティObjectLockEnabled: Booleanとは異なる属性として存在しています。

そのため、使用したテンプレート 9 行目の記述・配置には問題がない、ということになります。

修正したテンプレート

上記をふまえ、修正したテンプレートが以下のものになります。

objlock-enabled-fixed.yml

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 が存在することにご注意ください。

  1. プロパティObjectLockEnabled: True
  2. プロパティObjectLockConfiguration 内の ObjectLockEnabled: Enabled

参考資料