我正在构建一个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]}"
答案 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
属性
可以通过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