Динамически установите тип экземпляра EC2 для каждой среды с помощью ebextensions - PullRequest
3 голосов
/ 27 мая 2020

Я хочу создать экземпляр EC2 типа t3.medium во всех средах и m5.large в производственной среде.

Я использую .ebextensions (YAML) примерно так:

option 1:

Mappings:
  EnvironmentMap:
    "production":
      TheType: "m5.large"
      SecurityGroup: "foo"
      ...
    "staging":
      TheType: "t3.medium"
      SecurityGroup: "bar"
      ...

option_settings:
  aws:autoscaling:launchconfiguration:
    IamInstanceProfile: "aws-elasticbeanstalk-ec2-role"
    InstanceType: !FindInMap
      - EnvironmentMap
      - !Ref 'AWSEBEnvironmentName'
      - TheType
    SecurityGroups:
      - {"Fn::FindInMap": ["EnvironmentMap", {"Ref": "AWSEBEnvironmentName"}, "SecurityGroup"]}

Вариант 2:

    InstanceType: {"Fn::FindInMap": ["EnvironmentMap", {"Ref": "AWSEBEnvironmentName"}, "EC2InstanceType"]}

Вариант 3:

    InstanceType:
      - {"Fn::FindInMap": ["EnvironmentMap", {"Ref": "AWSEBEnvironmentName"}, "EC2InstanceType"]}

Результаты

Вариант 1 не работает с недопустимым Ямлом (но Я взял это из этого AWS примера .

Варианты 2 и 3 не работают с той же проблемой. Функция FindInMap не "вызывается": Invalid option value: '{"Fn::FindInMap":["EnvironmentMap","EC2InstanceType"]},{"Ref":"AWSEBEnvironmentName"}' (Namespace: 'aws:autoscaling:launchconfiguration', OptionName: 'InstanceType'): Value is not one of the allowed values: [c1.medium, c1.xlarge, c3.2xlarge, .... Она пытается интерпретировать все функция / вещь в виде строки.

Для свойства SecurityGroups это работает, для InstanceType - нет.

Я не могу делать это динамически и Я не могу найти, как добиться этого ни на AWS, ни на c, так и где-либо еще. Я предполагаю, что это простые вещи. Что мне не хватает?


EDIT:

Вариант 4: использование условных выражений

Conditions:
  IsProduction: !Equals [ !Ref AWSEBEnvironmentName, production ]

option_settings:

  aws:autoscaling:launchconfiguration:
    InstanceType: !If [ IsProduction, m5.large, t3.medium ]
    SecurityGroups:
      - {"Fn::FindInMap": ["EnvironmentMap", {"Ref": "AWSEBEnvironmentName"}, "SecurityGroup"]}

Ошибка: YAML exception: Invalid Yaml: could not determine a constructor for the tag !Equals in...

Но это взято из документации по условиям и if .


РЕДАКТИРОВАТЬ 2:

* 10 51 * В конце концов я обнаружил, что опция InstanceType это obsolute , и мы должны использовать:
aws:ec2:instances
  InstanceTypes: "t3.medium"

Но, увы, это не решает проблему, потому что я не могу использовать замену здесь также работает (Fn:findInMap).

1 Ответ

1 голос
/ 28 мая 2020

Причина, по которой FindInMap не работает в option_settings, заключается в том, что здесь разрешены только четыре встроенные c функции (из docs ):

  • Ref
  • Fn :: GetAtt
  • Fn :: Join
  • Fn :: GetOptionSetting

Я не убедился, что SecurityGroups работает. Я думаю, что ваш сценарий потерпел неудачу до того, как FindInMap в SecurityGroups получил шанс быть оцененным.

Однако, я пытался найти способ , используя Ресурсы . Я получил закрытие со следующим config файлом:

Mappings:
  EnvironmentMap:
    production:
      TheType: "t3.medium"
    staging:
      TheType: "t2.small"

Resources:
  AWSEBAutoScalingLaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      InstanceType:
        ? "Fn::FindInMap"
        :
          - EnvironmentMap
          - 
            Ref: "AWSEBEnvironmentName"
          - TheType

Хотя это на шаг ближе, но в конечном итоге тоже не работает . Причина в том, что когда EB объединяет наш конфигурационный файл Resources со своим собственным шаблоном, он производит следующее:

"InstanceType": {
  "Ref": "InstanceType", # <--- this should NOT be here :-(
  "Fn::FindInMap": [
    "EnvironmentMap",
    {
      "Ref": "AWSEBEnvironmentName"
    },
    "TheType"
  ]
},

вместо

"InstanceType": {
  "Fn::FindInMap": [
    "EnvironmentMap",
    {
      "Ref": "AWSEBEnvironmentName"
    },
    "TheType"
  ]
},

И это происходит потому, что оригинал InstanceType (до совместной операции):

"InstanceType":{"Ref":"InstanceType"},

Следовательно, EB вместо замены InstanceType на наш собственный InstanceType, предоставленный в нашем файле конфигурации, он просто объединяет их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...