【AWS CloudFormation】「レプリケーション時間のコントロール (RTC)」等を含めたS3レプリケーション設定のテンプレートの書き方

# 前置き

現場で AWS の CloudFormation に初挑戦することになりました。
「レプリケーション時間のコントロール (RTC)」等を含めた、
S3レプリケーション設定のテンプレートの書き方で引っかかったことがあったので、投稿します。

# 内容

以下のようなテンプレートファイルでスタックを作成し、実行しました。

```yaml
S3BucketOriginal:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub 'original-${AWS::AccountId}'
      VersioningConfiguration:
        Status: Enabled
      ReplicationConfiguration:
        Role: !Sub 'arn:aws:iam::${AWS::AccountId}:role/OriginBucketBackupRole'
        Rules:
        - Id: BackUpRule
          Status: Enabled
          DeleteMarkerReplication:
            Status: Disabled
          Destination:
            Bucket: !Sub 'arn:aws:s3:::backup-${AWS::AccountId}'
            EncryptionConfiguration:
              ReplicaKmsKeyID: !Sub 'arn:aws:kms:${AWS::Region}:${AWS::AccountId}:alias/BackupKey'
            Metrics: 
              Status: Enabled
              EventThreshold: 
                Minutes: 15
            ReplicationTime:
              Status: Enabled
              Time:
                Minutes: 15
          SourceSelectionCriteria: 
            SseKmsEncryptedObjects:
              Status: Enabled
```

すると、以下のようなエラーになってしまいました。

```
DeleteMarkerReplication cannot be used for this version of Cross Region Replication configuration schema.
Please refer to S3 Developer Guide for more information
```

このエラーは、以下CloudFormationのユーザーガイド「[ReplicationRule](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html)」内の注記のとおりです。  
前述のエラーメッセージ内の`this version`は、S3のレプリケーション設定のバージョンのことでした。

![スクリーンショット 2021-02-28 6.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/31c64fb7-86bb-61db-02d7-860b4a5227f7.png)

以下のように、Filter を設定しないとS3のレプリケーション設定はV1になってしまうということでした。

```yaml
・・・
      ReplicationConfiguration:
        Role: !Sub 'arn:aws:iam::${AWS::AccountId}:role/OriginBucketBackupRole'
        Rules:
        - Id: BackUpRule
          Status: Enabled
          DeleteMarkerReplication:
             Status: Disabled
          Filter:         # 追加
            Prefix: ""    # 追加
・・・
```

Filter を設定していないと、以下のように Replication Time Control (S3 RTC) の設定もエラーとなってしまいます。

```
ReplicationTime cannot be used for this version of the replication configuration schema.
Please refer to S3 Developer Guide for more information
```

Filter を設定したテンプレートでスタックを実行して今度こそ・・・
と思ったら以下のようなエラーになってしまいました。
 
```
Priority must be specified for this version of Cross Region Replication configuration schema.
Please refer to the S3 Developer Guide for more information
```

Priority（優先度）は、 CloudFormation のユーザーガイドでは「必須：いいえ」となっているのに・・・

![スクリーンショット 2021-02-28 6.27.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/031ca2ce-17b7-cfc4-98a8-48346193229a.png)

マネジメントコンソールからの設定だと、自動に設定してくれていれるんですね・・・
全く意識したことなかったです・・・

![スクリーンショット 2021-02-28 6.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/4f2c6b1f-d3da-c775-58c3-26f6a60e21a9.png)

その他にも、レプリケーション時間のコントロール (RTC)等の設定はマネジメントコンソール上だとチェックボックスでONにするだけなのですが、
CloudFormationのテンプレートでは時間数が必須入力する必要があります。
このあたり、マネジメントコンソールでは意識しないので難しい・・・

![スクリーンショット 2021-02-28 6.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23789/6d5d24ee-0151-2840-e324-bd3ff13636a2.png)

```yaml
            Metrics: 
              Status: Enabled
              EventThreshold: 
                Minutes: 15
            ReplicationTime:
              Status: Enabled
              Time:
                Minutes: 15
```

# 結果

最終的にはテンプレートファイルを以下のようにすることで、レプリケーション設定を作成することが出来ました。
（BucketName、ReplicaKmsKeyID 辺りの指定方法は適宜置き換えください）

```yaml
Resources:
  S3BucketOriginal:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub 'original-${AWS::AccountId}'
      VersioningConfiguration:
        Status: Enabled
      ReplicationConfiguration:
        Role: !Sub 'arn:aws:iam::${AWS::AccountId}:role/OriginBucketBackupRole'
        Rules:
        - Id: BackUpRule
          Status: Enabled
          DeleteMarkerReplication:
             Status: Disabled
          Filter:       #追加
            Prefix: ""  #追加
          Priority: 0   #追加
          Destination:
            Bucket: !Sub 'arn:aws:s3:::backup-${AWS::AccountId}'
            EncryptionConfiguration:
              ReplicaKmsKeyID: !Sub 'arn:aws:kms:${AWS::Region}:${AWS::AccountId}:alias/BackupKey'
            Metrics: 
              Status: Enabled
              EventThreshold: 
                Minutes: 15
            ReplicationTime:
              Status: Enabled
              Time:
                Minutes: 15
          SourceSelectionCriteria: 
            SseKmsEncryptedObjects:
              Status: Enabled
```