Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在CloudFormation中从Elastic Beanstalk环境中提取负载平衡器名称_Amazon Web Services_Amazon Elastic Beanstalk_Amazon Cloudformation_Elastic Load Balancer - Fatal编程技术网

Amazon web services 如何在CloudFormation中从Elastic Beanstalk环境中提取负载平衡器名称

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

我使用以下代码片段在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"
                }
        }
您可以看到,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中?