Как использовать AWS CDK FindInMap для установки свойства числового типа?

Я создаю шаблон CloudFormation со свойствами, которые должны быть установлены с различными значениями в зависимости от стадии (например, бета, prod). Тип свойства - число. Однако Fn.FindInMap возвращает строковый токен. Так как же использовать FindInMap для установки такого свойства числового типа?

Это для AWS CDK API языка Java.

Это раздел кода Mapping:

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), для которых требуется тип Number.

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 ответ

Решение

В случае, если это будет полезно для вас, я хотел бы поделиться своим решением - с помощью библиотеки уровней 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.CfnScalableTargetPropsCfnScalableTargetProps можно установить с помощью 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

Другие вопросы по тегам