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

Posted

技术标签:

【中文标题】如何在 AWS CDK 中使用 CfnParameter 而无需在运行时填写值【英文标题】:How to use a CfnParameter in AWS CDK without filling in the value at runtime 【发布时间】:2021-02-21 22:03:18 【问题描述】:

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

当我在 json/yaml 中手动编写模板时,我使用嵌套的 Parameters 列表声明 ParameterGroups,以及定义包括 Type、Description、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' 属性必须是一个具体的 CIDR 字符串,得到一个 Token

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

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

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

【问题讨论】:

这能回答你的问题吗? ***.com/questions/64574020/… @gshpychka 关闭,但不完全相同 @gshpychka 这个问题更清楚,并以更好的方式定义了需求。此外,其他问题的答案似乎都没有回答这里的问题。 最佳答案回答了这个问题——你不能用 CfnParameters 做到这一点,你不应该这样做。它提供了一个规范的替代方案。 @gshpychka 沮丧并不意味着不可能 【参考方案1】:

您对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 应用程序中使用construct.node.setContext() 方法。

请参阅CDK context docs 了解更多信息。

【讨论】:

以上是关于如何在 AWS CDK 中使用 CfnParameter 而无需在运行时填写值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 中使用 aws-cdk 在每次部署时不重建 DockerImageAsset?

如何在 AWS CDK 的“CodeBuildAction”中指定区域?

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

如何在部署前从@aws-cdk/aws-appsync 检索 schema.graphql 文件

AWS - 如何使用 CDK/CloudFormation 将服务链接角色传递给自动缩放组?

如何使用 aws-cdk 从 AWS Secrets Manager 导入 EKS 密钥?