【问题标题】:CDK create resource if does not exist - typescript如果不存在,CDK 创建资源 - 打字稿
【发布时间】:2021-02-12 07:54:07
【问题描述】:

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

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

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

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

【问题讨论】:

  • 也许值得研究一下表中的静态方法,例如static fromTableName(scope, id, tableName)。有了这些,您可以将“外部”/现有表带入 CDK 应用程序。

标签: typescript amazon-web-services amazon-dynamodb aws-cdk


【解决方案1】:

这不是一个很好的答案,而是一种解决方法,我将把它留在这里以防它可能对某人有用,但我们可以将表创建添加到我们代码中的 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 块中做一些从名称导入的事情。但我发现的最佳解决方案是将表格放在单独的堆栈中。

【讨论】:

  • 这不是 CDK 的工作方式。抛出异常的唯一方法是向 Table 构造函数传递不正确的参数。
  • 这确实有效,虽然堆栈通常会失败,因为已经存在资源,它现在通过原因异常被捕获
  • 我刚刚对此进行了测试,但它不起作用。如果资源已经存在,则它已经存在。 CDK 分两步工作。 1. 是云程序集的创建,它是来自应用程序代码的堆栈模板文件。这是应用程序代码唯一运行的时间。 2.是将生成的程序集部署到使用CloudFormation的帐户中。如果应用程序代码说要创建一个名称为“ABC”的发电机表,那么模板文件将被配置为创建一个名称为“ABC”的发电机表。异常处理不会延续到模板文件。在 CloudFormation 部署期间不执行 CDK 代码。
  • 老实说,这是为我部署的,就像它在 try 块中创建表一样,必须被炸毁,因为它已经存在,然后继续使用代码。我现在已经离开了,所以无法测试,但我会接受你的话
  • 您所说的实际上是有道理的,但肯定有效。你似乎对 CDK 有点了解,你能看看这个问题吗stackoverflow.com/questions/64637238/…
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 2019-07-26
  • 2021-10-05
  • 2021-11-27
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多