Я хочу создать экземпляр 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
).