如何在AWS CDK中获取qldb.CfnLedger自动生成的QLDB账本名称
推荐方案:直接使用CFN返回的动态生成名称
你不需要手动生成名称,CfnLedger部署完成后会自动返回生成的账本名称,通过attrName属性即可获取,这个值是CDK的Token,在部署阶段会自动替换为实际值,完全可以直接用于栈输出和Lambda传参:
import * as qldb from '@aws-cdk/aws-qldb'; import * as cdk from '@aws-cdk/core'; import * as lambda from '@aws-cdk/aws-lambda'; const ledger = new qldb.CfnLedger(this, 'Ledger', { deletionProtection: true, permissionsMode: 'STANDARD', }); // 作为栈输出 new cdk.CfnOutput(this, 'LedgerNameOutput', { value: ledger.attrName, exportName: 'LedgerName', }); // 传给Lambda作为环境变量,运行时可直接读取到真实账本名 const queryFunc = new lambda.Function(this, 'QueryLedgerFunc', { // 其他Lambda配置省略 environment: { LEDGER_NAME: ledger.attrName, }, });
你之前打印ledger.name得到undefined是正常的,因为合成阶段Token还没有被实际值替换,部署后会自动生效,不需要额外处理。
可选方案:自定义可控的唯一名称
如果你确实需要提前指定名称(比如要在其他系统预先配置),可以用CDK内置的uniqueResourceName方法,直接支持长度限制,不需要自己正则截取:
const ledgerName = cdk.Names.uniqueResourceName(ledger, { maxLength: 32, // 严格匹配QLDB账本名称的长度限制 allowedSpecialCharacters: '-', // 符合QLDB仅支持小写字母、数字、横杠的命名规则 }); const ledger = new qldb.CfnLedger(this, 'Ledger', { name: ledgerName, // 构造时传入属性即可,不要后续直接给ledger.name赋值 deletionProtection: true, permissionsMode: 'STANDARD', });
这个方法生成的名称会自动基于资源路径生成全局唯一值,严格遵守你指定的长度限制,不会出现超长度的问题,同时天然避免多环境部署的名称冲突。
内容的提问来源于stack exchange,提问作者Chris Sargent
相关产品推荐
相关产品推荐

