首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CDK中查找或创建s3存储桶?

在CDK中查找或创建s3存储桶?
EN

Stack Overflow用户
提问于 2020-02-13 10:45:02
回答 3查看 4.1K关注 0票数 2

我发现每次我部署时,cdk都会尝试重新创建S3存储桶。如果不指定存储桶名称,则每次都会生成一个新的垃圾存储桶名称。如果我指定了一个名称,它将拒绝部署,因为存储桶已经存在。我怎么才能把它"upsert“成一个桶呢?

下面是我使用的代码:

代码语言:javascript
复制
const dataIngestBucket = new Bucket(this, 'data-lake', {
  bucketName: `${this.props.environmentName}-my-company-data-lake`
});
EN

回答 3

Stack Overflow用户

发布于 2021-07-28 17:14:50

只要我看不到您要使用的语言,我就会使用python给出答案。它可以很容易地跟踪和转换为任何其他语言。

请参考aws_cdk.aws_s3.Bucket类。

在那里您可以找到在类创建过程中指定的参数,即auto_delete_objects=Trueremoval_policy=cdk.RemovalPolicy.DESTROY,这些参数可以帮助您实现目标。

票数 2
EN

Stack Overflow用户

发布于 2021-07-19 14:36:50

如果CDK代码更新,CDK会自动更新您的堆栈资源。例如,当您第一次执行创建存储桶的CDK堆栈时,会使用提供的配置创建存储桶。当您更新CDK代码以更新存储桶的生命周期策略或添加CORS时,作为相同堆栈的一部分,堆栈的更新将自动更新存储桶-它不会重新创建存储桶,因为云形成知道现有堆栈上有更新。

在您的例子中,当堆栈资源仍然存在时,似乎在删除之后重新创建了堆栈。这会导致云形成创建一个新的堆栈及其资源,当堆栈被销毁时,这些堆栈及其资源没有被移除。

通常,例如,当堆栈更新失败并且处于回滚状态时,就会出现问题。在这种情况下,重新部署会再次尝试创建存储桶,但失败了。在这种情况下,可能的选项可能是:

  1. 删除存储桶
  2. 删除堆栈
  3. 重新部署以重新创建

很多时候,我们不想删除资源,因为它们包含数据;在这种情况下,您可以在CDK代码中使用另一个库,例如boto3 for python,以检查资源是否存在-如果不是通过CDK创建的话。这将导致CDK代码不会尝试创建存储桶( CDK本身不能用于查看S3资源是否已经存在--至少还没有看到如何实现这一点)。

另一个要点是与资源关联的删除策略

troubleshooting_resource_not_deleted

当我发出cdk

命令时,我的S3存储桶、DynamoDB表或其他资源未被删除

默认情况下,可以包含用户数据的资源有一个保留的removalPolicy (Python: removal_policy)属性,当堆栈被销毁时,资源不会被删除。相反,资源是从堆栈中孤立出来的。然后,必须在销毁堆栈后手动删除资源。在此之前,重新部署堆栈将失败,因为在部署期间创建的新资源的名称与孤立资源的名称冲突。

如果将资源的删除策略设置为销毁,则在销毁堆栈时将删除该资源。

但是,即使删除策略为销毁,云形成也无法删除非空存储桶。从下面的相同链接摘录-

亚马逊亚马逊网络服务CloudFormation不能删除非空的

S3存储桶。如果您将亚马逊S3存储桶的删除策略设置为销毁,并且该存储桶包含数据,则尝试销毁堆栈将失败,因为无法删除该存储桶。您可以让AWS CDK在尝试销毁存储桶之前删除存储桶中的对象,方法是将存储桶的autoDeleteObjects属性设置为true。

最佳实践是

  1. 设计堆栈资源的方式使它们应用的更新最少,这可能会导致失败。因此,可以使用诸如ECR、S3之类的大多数静态资源来创建堆栈,这些资源变化不大,并且通常独立于更有可能发生故障的主应用程序部署堆栈。

  1. 避免手动删除破坏堆栈inconsistency

的堆栈资源

  1. 如果删除堆栈,请确保同时删除堆栈的自有资源。
票数 1
EN

Stack Overflow用户

发布于 2020-06-04 20:52:40

摆脱固定的名字!

使用

代码语言:javascript
复制
 final IBucket myBucket = Bucket.Builder.create(this, "mybucket")
            .bucketName(PhysicalName.GENERATE_IF_NEEDED).build();

(Java,但无关紧要)

你会得到一个“随机命名”的Bucket吗?在这里描述:https://docs.aws.amazon.com/cdk/latest/guide/resources.html

像这样在你的模板中使用它(这里是嵌套栈)

代码语言:javascript
复制
@Nullable NestedStackProps templateProps = NestedStackProps.builder()
            .parameters(new HashMap<String, String>(){{
                put("S3Bucket", myBucket.getBucketName());

            }})
            .build();

或者你还有一个固定的名字(去掉!!)然后通过以下方式获取它们:

代码语言:javascript
复制
final IBucket myBucket = Bucket.fromBucketName(this, "mybucket", "my-hold-bucket-name");

但是你不能这样做:

代码语言:javascript
复制
if (!myBucket) then create

(伪代码)

编译/运行时无ressource-check!

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60199739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档