我想t3.medium
在所有环境和m5.large
生产环境中创建 EC2 实例类型。
我.ebextensions
像这样使用(YAML):
选项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 因 Yaml 无效而失败(但我从这个 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 doc、SO 或其他任何地方都找不到如何实现这一点。我会假设这是简单的东西。我错过了什么?
编辑:
选项 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...
编辑2:
我最终发现该选项InstanceType
已过时,我们应该使用:
aws:ec2:instances
InstanceTypes: "t3.medium"
但是很可惜,这也不能解决问题,因为我也不能在这里使用替换函数(Fn:findInMap
)。