AWS CDK-如何将“占位符”令牌与低级cfn构造一起使用

时间:2020-11-12 00:42:44

标签: amazon-cloudformation aws-cdk aws-cloudformation-custom-resource

我正在使用CDK(以打字稿形式)定义一个AWS Timestream DB及其内部的表。

我想允许AWS设置数据库的名称(并避免对其进行硬编码)。问题是如何在表构造中引用该数据库名称。

CDK用户将知道直到在AWS中创建实际数据库名称(在定义表的CDK代码执行之后)才定义。为此,CDK创建了 placeholder 令牌(我的重点是)的想法。

我知道在更高级别 CDK构造中,已经定义了占位符Token。对于低级 cfn 构造,似乎并非如此。

以下是一些示例代码来说明:

此代码使用高级dynamo构造和lambda并起作用:

const table = new dynamodb.Table(this, id);
const lambda = new lambda.Function(this, id);
lambda.addEnvironment("TABLE_NAME", table.tableName)
console.log(`table Token is: ${table.tableName}`); // prints *like* "${Token[TOKEN.540]}"

这是我为AWS Timestream编写的代码,并且没有生成令牌:

const db = new ts.CfnDatabase(this, id);
console.log(`database name is is: ${db.databaseName}`); // prints null
const table = new ts.CfnTable(this, id, { 
  databaseName: db.databaseName,
  });// this will break as databaseName is null

我的问题:

  1. 为什么:为什么较低层的构造不生成令牌。
  2. 方法:我认为我可以创建令牌并将其分配给db.databaseName,但是我不知道如何在运行cdk deploy时用数据填充该令牌。

在示例代码中生成令牌并进行填充的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您可能正在寻找ref而不是databaseName

const db = new ts.CfnDatabase(this, id);
console.log(`database name is is: ${db.ref}`); // prints null

const table = new ts.CfnTable(this, id, { 
  databaseName: db.ref,
});

这对应于AWS :: Timestream :: Database CloudFormation资源1:1。正如docs所描述的,Ref返回值表示数据库名称。

背景:“ CFN资源”(也称为L1资源)中公开的属性包括资源 properties (在初始化对象时配置)和资源属性< / strong>,这就是您追求的目标。