如何使用AWS CDK FindInMap设置数字类型属性?

How to use AWS CDK FindInMap to set property of number type?

我正在构建一个 CloudFormation 模板,其属性应根据阶段(例如 beta、prod)设置不同的值。 属性 的类型是数字。但是,Fn.FindInMap returns 字符串标记。那么如何使用FindInMap设置这样的属性的数字类型呢?

这适用于 AWS CDK Java 语言 API。

这是映射的代码部分:

Mapping writeCapacityMapping = new Mapping(parent, "TableWriteCapacityMapping", MappingProps.builder()
                .withMapping(ImmutableMap.of(
                        Stage.beta.name(), ImmutableMap.of(
                                "min", 5,
                                "max", 100),
                        Stage.prod.name(), ImmutableMap.of(
                                "min", 400,
                                "max", 1200)))
                .build());

这是代码部分,试图通过阶段参数从映射中获取值并分配给需要数字类型的属性(minCapacity 和 maxCapacity)。

String minCapacity = Fn.findInMap("TableWriteCapacityMapping", stageParameter.getValueAsString(), "min");
String maxCapacity = Fn.findInMap("TableWriteCapacityMapping", stageParameter.getValueAsString(), "max");

ScalableTargetProps props = ScalableTargetProps.builder()
                .withMinCapacity(Integer.valueOf(minCapacity))
                .withMaxCapacity(Integer.valueOf(maxCapacity))
                .build();

预期的 CloudFormation 模板是:

Mappings:
  WriteCapacityMap:
    beta:
      min: 5
      max: 100
    prod:
      min: 400
      max: 1200

TableWriteCapacityScalableTarget:
    Type: "AWS::ApplicationAutoScaling::ScalableTarget"
    Properties:
      MinCapacity:
        Fn::FindInMap: [WriteCapacityMap, { Ref: "Stage" }, min]
      MaxCapacity:
        Fn::FindInMap: [WriteCapacityMap, { Ref: "Stage" }, max]

但是会抛出如下异常,因为minCapacity或maxCapacity是token字符串:Exception in thread "main" java.lang.NumberFormatException: For input string: "${Token[TOKEN.14]}"

如果对您有用,我想分享我的解决方案 - 使用 AWS CloudFormation 层库。

如 AWS CDK 文档 [1] 中所述,在幕后,CDK 构造是使用 AWS CloudFormation 库实现的,这些库在每个库的 CfnXxx 类 中可用。对于高级用例和 CDK 与 CloudFormation 之间的差距,可能需要使用这些 CloudFormation 库。

例如:

  • AWS CDK构造: software.amazon.awscdk.services.applicationautoscaling.ScalableTarget中的minCapacity属性接受Number类型的参数.

      void setMinCapacity(final java.lang.Number value);
    
  • AWS CloudFormation 库software.amazon.awscdk.services.applicationautoscaling.CfnScalableTargetProps中的minCapacity属性 CfnScalableTargetProps可以设置为NumberToken

      void setMinCapacity(final java.lang.Number value);
      void setMinCapacity(final software.amazon.awscdk.Token value);
    

[1] https://docs.aws.amazon.com/CDK/latest/userguide/cloudformation.html