gpt4 book ai didi

amazon-web-services - 使用 ebextensions 动态设置每个环境的 EC2 实例类型

转载 作者:行者123 更新时间:2023-12-04 04:09:11 24 4
gpt4 key购买 nike

我想在所有环境中创建 EC2 实例类型 t3.medium,并在生产环境中创建 m5.large

我正在使用 .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 example 获取此信息。

选项 2 和 3 因同样的问题而失败。FindInMap 函数没有被“调用”:选项值无效:'{"Fn::FindInMap":["EnvironmentMap","EC2InstanceType"]},{"Ref":"AWSEBEnvironmentName"}'(命名空间:'aws:autoscaling:launchconfiguration',OptionName: 'InstanceType'): 值不是允许的值之一:[c1.medium, c1.xlarge, c3.2xlarge, ....
它尝试将整个函数/事物解释为字符串。

对于 SecurityGroups 属性有效,对于 InstanceType 则无效。

我无法动态地执行此操作,并且在 AWS 文档、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 异常:无效 Yaml:无法确定标记的构造函数!等于...

但这来自 conditions 的文档和 if .


编辑2:

我最终发现选项InstanceTypeobsolute我们应该使用:

aws:ec2:instances
InstanceTypes: "t3.medium"

但是可惜,这也不能解决问题,因为我也无法在这里使用替换函数(Fn:findInMap)。

最佳答案

FindInMapoption_settings 中不起作用的原因是那里只允许四个内部函数(来自 docs ) :

  • 引用
  • Fn::GetAtt
  • Fn::加入
  • Fn::GetOptionSetting

我不相信SecurityGroups 有效。我认为您的脚本在 SecurityGroups 中的 FindInMap 有机会被评估之前就失败了。

但是,我尝试使用 Resources 找到一种方法 。我得到的关闭是使用以下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,而是将它们合并。

关于amazon-web-services - 使用 ebextensions 动态设置每个环境的 EC2 实例类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62046964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com