我一直在尝试使用 AWS CDK 以编程方式构建 CloudFormation 堆栈模板,但在使用 CfnParameter
参数化模板时遇到问题。
当我在 json/yaml 中手动编写模板时,我使用嵌套的 Parameters
列表声明 ParameterGroups
,并定义各个参数,包括类型、描述、AllowedPattern、然后在资源的定义中,我可以通过 Ref 值引用这些参数,例如
"CidrBlock": {
"Ref": "MyVpcCidr"
}
我的问题是如何通过 CDK 使用此功能、定义参数并稍后在模板中引用它?
我已使用 software.amazon.awscdk.core.CfnParameter
尝试了以下操作,但收到错误
final CfnParameter myVpcCidrParameter =
CfnParameter.Builder.create(this, "MyVpcCidr")
.type("String")
.description("The CIDR block for the VPC")
.build();
final Vpc vpc =
Vpc.Builder.create(this, "vpc")
.cidr(myVpcCidrParameter.getValueAsString()) // <-- error on this line
.enableDnsSupport(true)
.enableDnsHostnames(true)
.build();
...
错误状态
JsiiException: 'cidr' property must be a concrete CIDR string, got a Token
这似乎是合理的,因为 myVpcCidrParameter.getValueAsString()
返回 "${Token[TOKEN.10]}"
。
但是,我在 CfnParameter
或 Vpc.Builder
上没有看到任何其他方法允许我使用参数引用来指定属性值作为对我的参数。
使用 CDK 构建包含使用这些参数定义的参数和资源的模板的正确方法是什么?
最佳答案
您对CfnParameters
的使用看起来是正确的,但是有known issues当与以下资源一起使用时:
- VPC
- 负载均衡器
- 负载均衡器目标
Here's an explanation of why this occurs.
更好的选择是使用 CDK context
这是使用上下文更新的示例:
final String myVpcCidr = (String)this.getNode().tryGetContext("myVpcCidr");
final Vpc vpc =
Vpc.Builder.create(this, "vpc")
.cidr(myVpcCidr) // <-- Use context value
.enableDnsSupport(true)
.enableDnsHostnames(true)
.build();
与参数类似,您可以通过 CLI 提供上下文键/值:
cdk synth --context myVpcCidr=value MyStack
还可以通过其他 5 种方式向您的 AWS CDK 应用程序提供上下文值:
- 自动从当前 AWS 账户获取。
- 在项目的 cdk.context.json 文件中。
- 在项目的 cdk.json 文件的上下文键中。
- 在 ~/.cdk.json 文件的上下文键中。
- 在您的 AWS CDK 应用程序中使用 Construction.node.setContext() 方法。
请参阅CDK context docs了解更多信息。
关于parameters - 如何在 AWS CDK 中使用 CfnParameter 而无需在运行时填写值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64760900/