2017-02-06 24 views
0

Доза кого-нибудь есть примеры (окна предпочтительнее) из следующих,CloudFormation Wait Состояние на основе In-Service принимает от ELB

В настоящее время у меня есть CF Thats шаблон создан мой AutoScaling группы, LoadBalancer и некоторые тревоги на здоровой хосты под ELB и работает колосниковая решетка,

То, что я хотел бы сделать, это иметь условие ожидания перед созданием аварийных сигналов, чтобы сигналы тревоги создавались только после того, как хосты отмечены как «in-Service», но ELB.

Я знаю, как работать с условием ожидания, однако я не могу понять, как заставить его работать на основе статуса «в процессе обслуживания» в ELB.

Доза у кого есть какие-либо советы или примеры? Я провожу веб-страницы для некоторых примеров, но помимо обычных страниц документации AWS и нескольких других, я не смог найти то, что мне нужно.

Я нашел фрагмент того, как проверить работоспособность экземпляра, но я не могу понять, как и как это сделать в состоянии ожидания.

verify_instance_health: 
commands: 
ELBHealthCheck: 
command: !Sub 
'until ; do state=$(aws --region ${AWS::Region} elb describe-instance-health 
--load-balancer-name ${ElasticLoadBalancer} 
--instances $(curl -s http://169.254.169.254/latest/meta-data/instance-id) 
--query InstanceStates[0].State); sleep 10; done' 

Приветствия

ответ

0

Это можно сделать с помощью Custom Resource, который следит за экземпляр с помощью DescribeInstanceHealth API, выполняя, когда экземпляр EC2 достигает InService состояния (например, с помощью instanceInService waiter из AWS SDK for JavaScript).

Вот полный пример, который использует cfn-init для настройки nginx на экземпляре EC2, добавляет проверку работоспособности ELB на TCP-порт 80, и пользовательский ресурс InService, который ждет, пока экземпляр EC2 не находится в УДР InService перед завершением стека:

Launch Stack

Description: Wait until instance enters the InService state. 
Parameters: 
    ImageId: 
    Description: Image ID to launch EC2 instances. 
    Type: AWS::EC2::Image::Id 
    # amzn-ami-hvm-2016.09.1.20161221-x86_64-gp2 
    Default: ami-9be6f38c 
    InstanceType: 
    Description: Instance type to launch EC2 instances. 
    Type: String 
    Default: m3.medium 
    AllowedValues: [ m3.medium, m3.large, m3.xlarge, m3.2xlarge ] 
    AvailabilityZones: 
    Description: Availability Zones for ELB. 
    Type: List<AWS::EC2::AvailabilityZone::Name> 
Resources: 
    InstanceSecurityGroup: 
    Type: AWS::EC2::SecurityGroup 
    Properties: 
     GroupDescription: Allow inbound traffic from Load Balancer 
    SecurityGroupIngress: 
    Type: AWS::EC2::SecurityGroupIngress 
    Properties: 
     IpProtocol: tcp 
     FromPort: 80 
     ToPort: 80 
     GroupName: !Ref InstanceSecurityGroup 
     SourceSecurityGroupName: !GetAtt LoadBalancer.SourceSecurityGroup.GroupName 
     SourceSecurityGroupOwnerId: !GetAtt LoadBalancer.SourceSecurityGroup.OwnerAlias 
    Instance: 
    Type: AWS::EC2::Instance 
    Properties: 
     ImageId: !Ref ImageId 
     InstanceType: !Ref InstanceType 
     SecurityGroups: [!Ref InstanceSecurityGroup] 
     UserData: 
     "Fn::Base64": !Sub | 
      #!/bin/bash 
      /opt/aws/bin/cfn-init -v \ 
      --stack ${AWS::StackName} \ 
      --region ${AWS::Region} \ 
      --resource Instance 
    Metadata: 
     AWS::CloudFormation::Init: 
     config: 
      packages: {yum: {nginx: []}} 
      services: 
      sysvinit: 
       nginx: 
       enabled: true 
       ensureRunning: true 
       files: [/etc/nginx/nginx.conf] 
       sources: 
       - /usr/share/nginx/html 
       - /etc/nginx/conf.d 
       - /etc/nginx/default.d 
    LoadBalancer: 
    Type: AWS::ElasticLoadBalancing::LoadBalancer 
    Properties: 
     AvailabilityZones: !Ref AvailabilityZones 
     Listeners: 
     - LoadBalancerPort: 80 
     InstancePort: 80 
     Protocol: HTTP 
     Instances: [!Ref Instance] 
     HealthCheck: 
     Target: TCP:80 
     HealthyThreshold: 2 
     UnhealthyThreshold: 5 
     Interval: 5 
     Timeout: 2 
    InService: 
    Type: Custom::InService 
    Properties: 
     ServiceToken: !GetAtt InServiceFunction.Arn 
     Instances: 
     - InstanceId: !Ref Instance 
     LoadBalancerName: !Ref LoadBalancer 
    InServiceFunction: 
    Type: AWS::Lambda::Function 
    Properties: 
     Handler: index.handler 
     Role: !GetAtt LambdaExecutionRole.Arn 
     Code: 
     ZipFile: !Sub | 
      var response = require('cfn-response'); 
      var AWS = require('aws-sdk'); 
      exports.handler = (event, context) => { 
      console.log("Request received:\n", JSON.stringify(event)); 
      var physicalId = event.PhysicalResourceId || 'none'; 
      var success = data => response.send(event, context, response.SUCCESS, data, physicalId); 
      var failed = e => response.send(event, context, response.FAILED, e, physicalId); 
      if (event.RequestType == 'Create') { 
       var elb = new AWS.ELB(); 
       var elbParams = event.ResourceProperties; 
       delete elbParams.ServiceToken; 
       elb.waitFor('instanceInService', elbParams).promise(). 
       then((data)=> success({}), (e)=> failed(e)); 
      } else { 
       success({}); 
      } 
      }; 
     Runtime: nodejs4.3 
     Timeout: 300 
    LambdaExecutionRole: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Version: '2012-10-17' 
     Statement: 
     - Effect: Allow 
      Principal: {Service: [lambda.amazonaws.com]} 
      Action: ['sts:AssumeRole'] 
     Path:/
     ManagedPolicyArns: 
     - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole 
     Policies: 
     - PolicyName: ELBPolicy 
     PolicyDocument: 
      Version: '2012-10-17' 
      Statement: 
      - Effect: Allow 
       Action: 
       - 'elasticloadbalancing:DescribeInstanceHealth' 
       Resource: ['*'] 
Outputs: 
    URL: 
    Value: !Sub "http://${LoadBalancer.DNSName}"