Amazon web services 如何在CloudFormation中从Elastic Beanstalk环境中提取负载平衡器名称
我使用以下代码片段在CloudFormation中创建了一个弹性Beanstalk和CloudWatch警报:Amazon web services 如何在CloudFormation中从Elastic Beanstalk环境中提取负载平衡器名称,amazon-web-services,amazon-elastic-beanstalk,amazon-cloudformation,elastic-load-balancer,Amazon Web Services,Amazon Elastic Beanstalk,Amazon Cloudformation,Elastic Load Balancer,我使用以下代码片段在CloudFormation中创建了一个弹性Beanstalk和CloudWatch警报: "ElasticBeanstalkEnvironment": { "Type": "AWS::ElasticBeanstalk::Environment", "Properties": { "ApplicationName": "my-app", "EnvironmentName": "my
"ElasticBeanstalkEnvironment": {
"Type": "AWS::ElasticBeanstalk::Environment",
"Properties": {
"ApplicationName": "my-app",
"EnvironmentName": "my-eb",
"SolutionStackName": "64bit Amazon Linux 2018.03 v3.0.1 running Tomcat 8 Java 8",
"OptionSettings": [
{
"Namespace": "aws:elb:loadbalancer",
"OptionName": "CrossZone",
"Value": "true"
},
{
"Namespace": "aws:elb:listener:80",
"OptionName": "ListenerProtocol",
"Value": "HTTP"
},
{
"Namespace": "aws:elb:listener:80",
"OptionName": "InstancePort",
"Value": "80"
},
etc...
]
},
"CloudWatchBacken500XXAlarm": {
"Type": "AWS::CloudWatch::Alarm",
"Properties" : {
"AlarmActions": ["arn:aws:sns:us-east-1:12345678:mysnstopic"],
"Namespace": "AWS/ELB",
"Dimensions": [{
"Name": "LoadBalancerName",
"Value" : {
"Fn::GetAtt": [
"ElasticBeanstalkEnvironment",
"EndpointURL"
]
}
}],
"MetricName": "HTTPCode_Backend_5XX",
"Statistic": "Sum",
"Period": "60",
"EvaluationPeriods": "1",
"ComparisonOperator": "GreaterThanOrEqualToThreshold",
"Threshold": "1"
}
}
您可以看到,CloudWatch警报配置为在Elastic Beanstalk的负载平衡器收到5XX错误时发出警报。但是,我无法获取负载平衡器名称属性,该属性的外观如下所示:
awseb-e-a-AWSEBLoa-AY8LC6V30OAW
awseb-e-a-AWSEBLoa-AY8LC6V30OAW-175133046.us-east-1.elb.amazonaws.com
相反,Fn::GetAtt(“EndpointURL”)属性返回负载平衡器的DNSName,如下所示:
awseb-e-a-AWSEBLoa-AY8LC6V30OAW
awseb-e-a-AWSEBLoa-AY8LC6V30OAW-175133046.us-east-1.elb.amazonaws.com
这将无法正确创建CloudWatch警报,因为它希望获得负载平衡器名称而不是DNSName
获取负载平衡器名称的最佳方法是什么?我不希望必须创建负载平衡器作为外部资源,如“AWS::ElasticLoadBalancement::LoadBalancer”,或者尝试使用一些子字符串方法从DNSName字符串中提取名称字符串 如果您有权访问环境名称,则可以执行API调用。响应将包括有关您环境的loadbalancer的信息。好的,我找到了一个解决方案,这完全是一个黑客行为,我已经能够使用从-Fn::GetAtt(“EndpointURL”)返回的DNSName字符串上的几个Split/Select/Join调用从端点提取LoadBalancerName。代码如下:
"CloudWatchBackend500XXAlarm": {
"Type": "AWS::CloudWatch::Alarm",
"Properties" : {
"AlarmDescription": "Elastic Beanstalk Has Received 5XX Backend Connection Errors",
"AlarmActions": ["arn:aws:sns:us-east-1:1234567890:mysnstopic"],
"Namespace": "AWS/ELB",
"Dimensions": [
{
"Name": "LoadBalancerName",
"Value": {
"Fn::Join": ["", [{
"Fn::Select": [
"0",
{
"Fn::Split": ["AWSEBLoa-",
{
"Fn::GetAtt": [
"ElasticBeanstalkEnvironment",
"EndpointURL"
]
}
]
}
]
},
"AWSEBLoa-",
{
"Fn::Select": [
"0",
{
"Fn::Split": ["-",
{
"Fn::Select": [
"1",
{
"Fn::Split": ["AWSEBLoa-",
{
"Fn::GetAtt": [
"ElasticBeanstalkEnvironment",
"EndpointURL"
]
}
]
}
]
}
]
}
]
}
]]
}
}
],
"MetricName": "HTTPCode_Backend_5XX",
"Statistic": "Sum",
"Period": "60",
"EvaluationPeriods": "1",
"ComparisonOperator": "GreaterThanOrEqualToThreshold",
"Threshold": "1"
}
}
ie上面的代码能够从“awseb-k-3-AWSEBLoa-11B26NY4PQB9A-11B26NY4PQB9A-739614614.us-east-1.elb.amazonaws.com”中提取“awseb-k-3-AWSEBLoa-11B26NY4PQB9A”,CloudWatch闹钟工作正常。我想我必须调整代码以使用内部负载平衡器,即在DNSName的开头使用'internal-'格式化,但我现在还可以
我已经向AWS提交了一个请求,要求他们添加一个CloudFormation方法来返回LoadBalancer名称,而不仅仅是DNSName。使用ebextensions将更容易创建警报-因为获取ELB名称与值一样简单:{“Ref”:“awsebloadsbalancer”} 创建一个扩展名为.config的文件(比如-BackendErrors.config),并将其放置在名为“.ebextensions”的文件夹中。完整的电子扩展将如下所示:
Resources:
CloudWatchBacken500XXAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: "Elastic Beanstalk Has Received 5XX Backend Connection Errors"
AlarmName: { "Fn::Join" : ["", [{ "Ref" : "AWSEBEnvironmentName" }, "-Backend-5XX-Alarm." ]]}
AlarmActions:
- "arn:aws:sns:us-east-1:123456789012:mysnstopic"
Namespace: AWS/ELB
Dimensions:
- Name: LoadBalancerName
Value: { "Ref" : "AWSEBLoadBalancer" }
MetricName: HTTPCode_Backend_5XX
Statistic: Sum
Period: 60
EvaluationPeriods: 1
Threshold: 1
ComparisonOperator: GreaterThanOrEqualToThreshold
.ebextensions文件夹应在应用程序源捆绑包的顶层创建:
~/workspace/my-application/
|-- .ebextensions
| |-- BackendErrors.config
几年后来到这里,看起来亚马逊现在添加了这个属性: 引述: LoadBalancerFullName 负载平衡器的全名。例如,app/my load balancer/50dc6c495c0c9188 因此,您现在可以执行以下操作:
Dimensions:
- Name: LoadBalancer
Value: !GetAtt YourALBRef.LoadBalancerFullName
他如何将api调用集成到cloudformation中?