Как использовать AWS CDK FindInMap для установки свойства числового типа? - PullRequest
0 голосов
/ 13 февраля 2019

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

Это для API-интерфейсов языка Java AWS CDK.

Это фрагмент кода 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());

Этот раздел кода пытается получить значение из сопоставления по параметру stage и назначить его свойствам (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 Ответ

0 голосов
/ 21 февраля 2019

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

...