繁体   English   中英

如果不存在,CDK 创建资源 - typescript

[英]CDK create resource if does not exist - typescript

在我的 CDK 项目中创建了一个 dynamoDB 表。 这很好,它由项目中创建的 lambda 使用。 我们需要删除堆栈,这也很好,因为我们在表上将 retain resource 设置为 true。

现在,当我尝试全新部署时,我们得到表已存在的错误并且堆栈回滚。 我需要仅在表不存在时才创建表的代码。

这是表的基本创建,我找不到任何关于这个问题的文档,甚至找不到可以捕获的异常,也找不到抛出的异常类型,因为我们只在 AWS 上的 cloudformation 控制台中看到日志安慰。

 const dynamoTable = new Table(this, "my-table", {
      tableName: StackConfiguration.tableName,
      partitionKey: { name: "id", type: AttributeType.STRING },
    });

不幸的是,您不能在 CDK 中执行此操作,因为 CDK 在编译时而非运行时生成 CloudFormation 模板。 我在这里看到几个选项:

  1. 使用CloudFormation Resource Import将现有表导入您的堆栈
  2. 使用自定义资源 lambda 执行 AWS API 调用以检查表是否存在。 使用CDK代码中Fn.conditionEquals中的Custom resource output有条件地建表

如果这是您需要做的一次性事情,我建议您选择第一个选项;如果您希望这种情况经常发生,我建议您使用选项 2。

这不是一个很好的答案,而是一种解决方法,我将它留在这里以防它可能对某人有用,但我们可以将表创建添加到我们代码中的 try catch 中,我只是捕获了一般异常而不是特定异常如果有人在这里捕获正确的异常,我会很感兴趣。 这意味着堆栈将部署。

 try {
     const dynamoTable = new Table(this, "my-table", {
      tableName: StackConfiguration.tableName,
      partitionKey: { name: "id", type: AttributeType.STRING },
    });
    
      return dynamoReplayTable;
    } catch (e) {
      return;
    }

如果您想使用该表,那么在您的代码中,您将需要引用 ARN 而不是表变量名称,否则您可以在 catch 块中从名称进行一些导入。 但我发现的最佳解决方案是将表放在单独的堆栈中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM