👨‍💻

AWS CDK s3.BucketにReplication Configurationを設定する

2023/04/15に公開

背景

  • L2コンストラクタである s3.Bucketで作成したS3バケットに対してオブジェクトのレプリケーションを設定したい
  • s3.Bucketにはレプリケーションを設定する機能がまだ無い
    • L1コンストラクタの s3.CfnBucket.ReplicationConfigurationProperty を使う必要がある
  • escape hatches を使って設定する

escape hatchesについて

公式ドキュメントはこちら
https://docs.aws.amazon.com/cdk/v2/guide/cfn_layer.html

自分としては、L2コンストラクタはL1コンストラクタを寄せ集めたものなので、L2コンストラクタ内からプロパティを引っ張ってきて直接設定してしまおうという感じで理解しています。

# Get the CloudFormation resource
cfn_bucket = bucket.node.default_child

# Change its properties
cfn_bucket.analytics_configuration = [
    {
        "id": "Config",
        # ...
    }
]

BucketからCfnBucketを取得してReplicationConfigurationを設定する

ソースコードはこちら。ちなみにこのソースコードですが、ChatGPT(GPT-3.5)に生成してもらったものを最低限ビルドが通るように修正したものです。

from aws_cdk import (
    Stack,
    aws_s3 as s3
)
from constructs import Construct

class S3ReplicationStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Create a bucket
        bucket = s3.Bucket(
            self,
            "MyBucket",
            bucket_name="my-bucket-name"
        )

        # Get the underlying CloudFormation bucket resource
        cfn_bucket = bucket.node.default_child

        # Create a replication rule
        replication_rule = {
            "Id": "MyReplicationRule",
            "Prefix": "prefix/to/replicate",
            "Status": "Enabled",
            "Destination": {
                "Bucket": "arn:aws:s3:::my-replica-bucket",
                "StorageClass": "STANDARD_IA"
            }
        }

        # Set the replication configuration on the CloudFormation bucket resource
        cfn_bucket.add_property_override(
            "ReplicationConfiguration",
            {
                "Role": "arn:aws:iam::123456789012:role/MyReplicationRole",
                "Rules": [replication_rule]
            }
        )

MyBucketのCloudFormationテンプレートはこんな感じ

  "MyBucketF68F3FF0": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "BucketName": "my-bucket-name",
    "ReplicationConfiguration": {
     "Role": "arn:aws:iam::123456789012:role/MyReplicationRole",
     "Rules": [
      {
       "Id": "MyReplicationRule",
       "Prefix": "prefix/to/replicate",
       "Status": "Enabled",
       "Destination": {
        "Bucket": "arn:aws:s3:::my-replica-bucket",
        "StorageClass": "STANDARD_IA"
       }
      }
     ]
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "aws:cdk:path": "S3ReplicationStack/MyBucket/Resource"
   }
  }

Discussion