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

Ano*_*ias 7 amazon-web-services amazon-dynamodb typescript aws-cdk

在我的 CDK 项目中创建了 dynamoDB 表。这很好,它被项目中创建的 lambda 使用。我们需要删除堆栈,这也很好,因为我们已在表上将保留资源设置为 true。

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

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

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

Ano*_*ias -4

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

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

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

  • 这不是 CDK 的工作原理。抛出异常的唯一方法是向 Table 构造函数传递不正确的参数。 (8认同)
  • 我刚刚测试了这个,但它不起作用。如果资源已经存在,则它已经存在。CDK 的工作分两步。1. 创建云程序集,它是应用程序代码中堆栈的模板文件。这是应用程序代码唯一运行的一次。2. 就是使用CloudFormation将生成的程序集部署到账户中。如果应用程序代码要求创建名为“ABC”的发电机表,则模板文件将配置为创建名为“ABC”的发电机表。异常处理不会转移到模板文件中。CDK 代码在 CloudFormation 部署期间不会执行。 (2认同)