【问题标题】:AWS CDK - How to use "placeholder" token with Low Level cfn constructsAWS CDK - 如何将“占位符”令牌与低级 cfn 构造一起使用
【发布时间】:2021-02-24 00:10:46
【问题描述】:

我正在使用 CDK(在 typescript 中)定义 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. 为什么:为什么较低级别的构造不生成 Token。
  2. 如何:我认为我可以创建一个令牌并将其分配给db.databaseName,但我不知道如何在运行cdk deploy 时使用数据填充该令牌。

任何有关生成令牌和填充它的示例代码的帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    您可能正在寻找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(因为它们在对象初始化时配置)和资源 attributes,这就是你所追求的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-29
      • 2021-08-25
      • 2020-09-07
      • 2021-03-30
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多