我使用以下代码片段在 CloudFormation 中创建了 Elastic Beanstalk 和 CloudWatch 警报:
"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
相反,Fn::GetAtt("EndpointURL") 属性返回负载均衡器的 DNSName,如下所示:
awseb-e-a-AWSEBLoa-AY8LC6V30OAW-175133046.us-east-1.elb.amazonaws.com
这将无法正确创建 CloudWatch 警报,因为它期望获取负载均衡器名称而不是 DNSName。
获取负载均衡器名称的最佳方式是什么?我不想将负载均衡器创建为外部资源,例如“AWS::ElasticLoadBalancing::LoadBalancer”,或者尝试使用某些子字符串方法从 DNSName 字符串中提取名称字符串。