如何在 AWS CDK 中使用 CfnParameter 而无需在运行时填写值

wut*_*tch 11 parameters aws-cloudformation aws-cdk

我一直在尝试使用 AWS CDK 以编程方式构建 CloudFormation 堆栈模板,但在使用CfnParameters 参数化模板时遇到问题。

当我在 json/yaml 中手动编写模板时,我ParameterGroups使用嵌套Parameters列表进行声明,并定义各个参数,包括类型、描述、AllowedPattern 等。然后在资源的定义中,我可以通过Ref值引用这些参数,例如

"CidrBlock": {
  "Ref": "MyVpcCidr"
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何通过 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();
...
Run Code Online (Sandbox Code Playgroud)

错误指出

JsiiException:“cidr”属性必须是具体的 CIDR 字符串,已获得令牌

这似乎很合理,因为myVpcCidrParameter.getValueAsString()返回"${Token[TOKEN.10]}".

但是,我没有看到任何其他方法CfnParameterVpc.Builder允许我使用参数引用来指定属性值作为对我的参数的引用。

使用 CDK 构建包含参数和使用这些参数定义的资源的模板的正确方法是什么?

Rya*_*yan 1

您的使用CfnParameters看起来正确,但是与资源一起使用时存在已知问题,例如:

  • VPC
  • 负载均衡器
  • 负载均衡器目标

以下是发生这种情况的原因的解释。

更好的选择是使用CDK 上下文

这是使用上下文更新的示例:

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();
Run Code Online (Sandbox Code Playgroud)

与参数类似,您可以通过 CLI 提供上下文键/值:

cdk synth --context myVpcCidr=value MyStack
Run Code Online (Sandbox Code Playgroud)

还可以通过其他 5 种方式向您的 AWS CDK 应用程序提供上下文值:

  • 自动从当前 AWS 账户。
  • 在项目的 cdk.context.json 文件中。
  • 在项目的 cdk.json 文件的上下文键中。
  • 在 ~/.cdk.json 文件的上下文键中。
  • 在您的 AWS CDK 应用程序中使用 Construction.node.setContext() 方法。

有关更多信息,请参阅CDK 上下文文档。