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

标签 parameters aws-cloudformation aws-cdk

我一直在尝试使用 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]}"

但是,我在 CfnParameterVpc.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/

相关文章:

amazon-web-services - Aws CDK : Api gateway, sagemaker 集成,SageMakerRuntime 类型的 AWS 服务不支持错误

amazon-web-services - 使用 CustomResource 调用 Lambda

aws-cloudformation - 通过 CDK 向数据湖位置授予权限时出错

c - 在 C/C++ 中创建 unix/linux 命令行工具的最佳实践是什么?

ruby-on-rails - Rails 5.1 API - 如何允许嵌套 JSON 对象的属性的参数

amazon-web-services - 在 Cloudformation 中将 Cloudfront "Cache Based on Selected Request Headers"设置为 All

amazon-web-services - 部署 efs 模板时出现 YAMLException

powershell - 位置等于1或无参数值的单参数参数?

bash - 问题理解 bash 脚本中的参数扩展

amazon-web-services - 正确的 AWS::Glue::Job Connections 属性结构是什么?