如何使用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
可以设置为Number
或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
我正在构建一个 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
可以设置为Number
或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