👨💻
AWS CDK s3.BucketにReplication Configurationを設定する
背景
- L2コンストラクタである s3.Bucketで作成したS3バケットに対してオブジェクトのレプリケーションを設定したい
- s3.Bucketにはレプリケーションを設定する機能がまだ無い
- L1コンストラクタの s3.CfnBucket.ReplicationConfigurationProperty を使う必要がある
- escape hatches を使って設定する
escape hatchesについて
公式ドキュメントはこちら
自分としては、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