我发现 cdk 在每次部署时尝试重新创建 S3 存储桶。如果我不指定存储桶名称,它会每次生成一个新的无用名称。如果我指定了名称,它会因为该存储桶已经存在而拒绝部署。我该如何使它“upsert”存储桶?
以下是我使用的代码:
const dataIngestBucket = new Bucket(this, 'data-lake', {
bucketName: `${this.props.environmentName}-my-company-data-lake`
});
我发现 cdk 在每次部署时尝试重新创建 S3 存储桶。如果我不指定存储桶名称,它会每次生成一个新的无用名称。如果我指定了名称,它会因为该存储桶已经存在而拒绝部署。我该如何使它“upsert”存储桶?
以下是我使用的代码:
const dataIngestBucket = new Bucket(this, 'data-lake', {
bucketName: `${this.props.environmentName}-my-company-data-lake`
});
auto_delete_objects=True
和removal_policy=cdk.RemovalPolicy.DESTROY
。设计堆栈资源的方式应尽量减少更新,以避免可能导致故障。因此,可以创建一个堆栈,其中包含大多数静态资源(例如 ECR、S3 等),这些资源不会经常更改,并且通常独立于主应用程序部署堆栈,后者更容易出现故障。
避免手动删除堆栈资源,这会破坏堆栈的一致性。
如果删除堆栈,请确保同时删除堆栈拥有的资源。
摆脱固定的名称!
使用
final IBucket myBucket = Bucket.Builder.create(this, "mybucket")
.bucketName(PhysicalName.GENERATE_IF_NEEDED).build();
(Java,但不重要)
您是否获得了一个“随机命名”的存储桶。 在此处描述:https://docs.aws.amazon.com/cdk/latest/guide/resources.html
在模板中像这样使用它(这里是嵌套堆栈)
@Nullable NestedStackProps templateProps = NestedStackProps.builder()
.parameters(new HashMap<String, String>(){{
put("S3Bucket", myBucket.getBucketName());
}})
.build();
或者你仍然有一个固定的名称(摆脱它!)然后用以下方式获取它们:
final IBucket myBucket = Bucket.fromBucketName(this, "mybucket", "my-hold-bucket-name");
但你不能做这样的事情:
if (!myBucket) then create
(伪代码)
编译/运行时没有资源检查!
cdk diff
进行检查,以查看在部署相同代码时发生了什么变化。代码中似乎存在循环依赖关系。 - Pedreirocdk diff
显示我的S3堆栈没有任何更改,但它仍然被部署了。 - Andrej Mohar