如何在AWS CDK中获取自动生成的WebAcl名称作为变量
获取AWS CDK自动生成的WebACL物理名称
你碰到的这个问题其实很典型——当你不让CDK指定显式物理名称时,这个带哈希后缀的名称是CloudFormation在部署阶段才会生成的运行时值,不是CDK合成阶段就能拿到的静态变量,所以那些合成时的属性自然拿不到你想要的结果。
正确的解决方法
要获取这个自动生成的WebACL物理名称,你需要使用CDK中CfnResource的getAttString方法,直接引用CloudFormation的Name属性:
const webAcl = new CfnWebACL(this, "webAcl", { defaultAction: { allow: {}, }, scope: myScope, visibilityConfig: { cloudWatchMetricsEnabled: true, metricName: "webACL", sampledRequestsEnabled: true, } }); // 获取自动生成的WebACL物理名称 const webAclPhysicalName = webAcl.getAttString('Name');
这个webAclPhysicalName是一个CDK Token,在CDK合成模板时会被转换成CloudFormation的!GetAtt引用,部署完成后就会自动解析成你想要的webAcl-7xtQ0oTU473X格式的名称。
为什么之前的方法不行?
我来帮你拆解一下之前尝试的几个方法的问题:
webAcl.name:只有当你显式设置了physicalName属性时,这个值才会存在,你没指定的话自然是undefined。webAcl.logicalId:这是CDK给资源分配的逻辑ID(就是你定义时的webAcl),和CloudFormation生成的带哈希的物理名称完全是两回事。webAcl.attrId:返回的是WAF WebACL的唯一标识符(一串纯数字/字母的ID),不是名称。webAcl.attrLabelNamespace和webAcl.attrArn:这两个字段确实包含了物理名称,但需要你手动截取解析,不仅麻烦还容易出错,远不如直接用getAtt('Name')可靠。Names.uniqueId(webAcl):这是CDK内部用来生成唯一标识的方法,规则和CloudFormation生成物理名称的规则不同,所以结果肯定不匹配。
额外提示
如果需要在其他CDK资源中使用这个名称(比如给资源打标签、配置日志规则等),直接传递webAclPhysicalName这个Token就可以了——CDK会自动处理部署时的解析,不需要额外的操作。
内容的提问来源于stack exchange,提问作者Mthenn
相关产品推荐
相关产品推荐

