首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在CloudFormation中从弹性豆茎环境中提取负载均衡器名称

如何在CloudFormation中从弹性豆茎环境中提取负载均衡器名称
EN

Stack Overflow用户
提问于 2018-08-17 22:25:39
回答 5查看 2K关注 0票数 2

我已经用以下代码片段在CloudFormation中创建了一个弹性Beanstalk和CloudWatch警报:

代码语言:javascript
复制
        "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警报被配置为发出警报。然而,我不能获得负载均衡器名称属性,它看起来像这样:

代码语言:javascript
复制
awseb-e-a-AWSEBLoa-AY8LC6V30OAW

相反,Fn::GetAtt("EndpointURL")属性返回负载均衡器的DNSName,如下所示:

代码语言:javascript
复制
awseb-e-a-AWSEBLoa-AY8LC6V30OAW-175133046.us-east-1.elb.amazonaws.com

它将无法正确创建CloudWatch告警,因为它希望获得负载均衡器名称,而不是DNSName。

获取负载均衡器名称的最佳方式是什么?我不想创建负载均衡器作为外部资源,比如"AWS::ElasticLoadBalancing::LoadBalancer“,或者尝试使用某个子串方法从DNSName字符串中提取名称字符串。

EN

回答 5

Stack Overflow用户

发布于 2018-08-31 16:56:24

好的,我找到了一个解决方案,我已经能够通过对从- Fn::GetAtt("EndpointURL")返回的DNSName字符串进行几次Split/Select/Join调用,从端点提取LoadBalancerName。代码如下:

代码语言:javascript
复制
"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。

票数 1
EN

Stack Overflow用户

发布于 2020-04-12 15:03:39

使用ebextensions创建警报要容易得多-因为获取ELB名称与取值一样简单:{ "Ref“:"AWSEBLoadBalancer”}

创建一个扩展名为.config (比如- BackendErrors.config)的文件,并将其放在名为".ebextensions“的文件夹中。完整的ebextension如下所示:

代码语言:javascript
复制
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文件夹:

代码语言:javascript
复制
~/workspace/my-application/
|-- .ebextensions
|   |-- BackendErrors.config
票数 1
EN

Stack Overflow用户

发布于 2018-08-18 00:42:11

如果您有访问环境名称的权限,则可以执行DescribeEnvironmentResources接口调用。响应将包括有关您的环境的负载均衡器的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51897501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档