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

时间:2019-02-13 18:57:02

标签: aws-cdk

我正在构建一个CloudFormation模板,该模板的属性应根据阶段(例如Beta,prod)设置为不同的值。该属性的类型是数字。但是,Fn.FindInMap返回字符串令牌。那么如何使用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());

这是代码部分,试图通过阶段参数从映射中获取值并将其分配给需要Number类型的属性(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是令牌字符串,因此将引发以下异常:Exception in thread "main" java.lang.NumberFormatException: For input string: "${Token[TOKEN.14]}"

1 个答案:

答案 0 :(得分:0)

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

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

例如:

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

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

      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