我已经用以下代码片段在CloudFormation中创建了一个弹性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"
}
}您可以看到,如果Elastic Beanstalk的负载均衡器接收到5XX错误,则CloudWatch警报被配置为发出警报。然而,我不能获得负载均衡器名称属性,它看起来像这样:
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字符串中提取名称字符串。
发布于 2018-08-31 16:56:24
好的,我找到了一个解决方案,我已经能够通过对从- 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"
}}
即上面的代码能够从'awseb-k-3-AWSEBLoa-11B26NY4PQB9A-739614614.us-east-1.elb.amazonaws.com‘中提取“awseb-K-3-AWSEBLoa-11B26NY4PQB9A”,并且CloudWatch警报工作正常。我认为我必须调整代码以使用内部负载均衡器,即在DNSName的开头使用' internal -‘格式化,但我现在很好。
我已经向亚马逊网络服务提交了一个请求,要求他们添加一个CloudFormation方法来返回LoadBalancer名称,而不仅仅是DNSName。
发布于 2020-04-12 15:03:39
使用ebextensions创建警报要容易得多-因为获取ELB名称与取值一样简单:{ "Ref“:"AWSEBLoadBalancer”}
创建一个扩展名为.config (比如- BackendErrors.config)的文件,并将其放在名为".ebextensions“的文件夹中。完整的ebextension如下所示:
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发布于 2018-08-18 00:42:11
如果您有访问环境名称的权限,则可以执行DescribeEnvironmentResources接口调用。响应将包括有关您的环境的负载均衡器的信息。
https://stackoverflow.com/questions/51897501
复制相似问题