ALB 부하의 EC2를 절반씩 분리하면서 쉘 일격으로 배포

10250 단어 EC2JenkinsALBAWS

하고 싶은 일



ALB의 Target Group하에 복수의 EC2 인스턴스가 등록되어 있다.


인플레이스 배포 등 사용자에게 영향을 주지 않도록 절반씩 분리하면서 처리하고 싶은 경우가 있다.
이것을 쉘을 사용해 일격으로 실시하고 싶다. (jenkins에서 1 클릭 이미지)

처리 흐름



AWS CLI를 사용하여 Target Group에서 절반씩 切り離し -> デプロイ -> 再登録를 두 번 반복합니다. Target Group은 다음과 같이 상태 천이하기 때문에 각각 대기한다.
참고: 대상 상태
  • deregister
  • healthy → draining → unused

  • register
  • unused → initial → healthy


  • 아래 준비


  • 작업 머신에 AWS CLI 설치/설치
  • Target Group의 헬스 체크 임계치, 등록 지연 타임 아웃 설정치의 재검토
  • 기본 시간이 지나면 시간이 길고 분리 및 재 등록에 시간이 걸리므로 적절한 값으로 변경 (참고)

  • EC2 인스턴스에 그룹 태그 부여


  • 단계


  • A 그룹 분리 ( unused까지 대기)
  • A 그룹 배포
  • A 그룹 재등록 ( healthy까지 대기)
  • B 그룹 분리 ( unused까지 대기)
  • B 그룹 배포
  • B 그룹 재등록 ( healthy까지 대기)

  • 쉘 내용


    target_group_arn="my_target_group_arn"
    group_a_instance_ids=$(aws ec2 describe-instances --filter "Name=tag:deploy_group,Values=A" --query "Reservations[].Instances[].InstanceId" --output text)
    group_b_instance_ids=$(aws ec2 describe-instances --filter "Name=tag:deploy_group,Values=B" --query "Reservations[].Instances[].InstanceId" --output text)
    
    alb_waiter_function() {
      while :
      do
        state=$(aws elbv2 describe-target-health --target-group-arn $1 --targets Id=$2 --query "TargetHealthDescriptions[].TargetHealth.State" --output text)
        if [ "$3" = "${state}" ]; then
          echo "InstanceId: $2 State:$3 wait break!"
          break
        else
          echo "InstanceId: $2 State:$state keep waiting..."
        fi
        sleep 10
      done
    }
    
    # 1. Aグループ切り離し
    echo -n ${group_a_instance_ids} | xargs -I {} -P 0 -d\\t  aws elbv2 deregister-targets --target-group-arn ${target_group_arn} --targets Id={}
    for instance_id in $(echo ${group_a_instance_ids}); do alb_waiter_function ${target_group_arn} ${instance_id} 'unused'; done
    
    # 2. Aグループデプロイ実行 (tagかinstance_idを利用。例としてansibleを実行)
    ansible-playbook -i ./inventory/ec2.py --limit "tag_deploy_group_A" -u foo --private-key='~/.ssh/hoge.pem' deploy.yml
    
    # 3. Aグループ再登録
    echo -n ${group_a_instance_ids} | xargs -I {} -P 0 -d\\t  aws elbv2 register-targets --target-group-arn ${target_group_arn} --targets Id={}
    for instance_id in $(echo ${group_a_instance_ids}); do alb_waiter_function ${target_group_arn} ${instance_id} 'healthy'; done
    
    # 4. Bグループ切り離し
    echo -n ${group_b_instance_ids} | xargs -I {} -P 0 -d\\t aws elbv2 deregister-targets --target-group-arn ${target_group_arn} --targets Id={}
    for instance_id in $(echo ${group_b_instance_ids}); do alb_waiter_function ${target_group_arn} ${instance_id} 'unused'; done
    
    # 5. Bグループデプロイ実行
    ansible-playbook -i ./inventory/ec2.py --limit "tag_deploy_group_B" -u foo --private-key='~/.ssh/hoge.pem' deploy.yml
    
    # 6. Bグループ再登録
    echo -n ${group_b_instance_ids} | xargs -I {} -P 0 -d\\t  aws elbv2 register-targets --target-group-arn ${target_group_arn} --targets Id={}
    for instance_id in $(echo ${group_b_instance_ids}); do alb_waiter_function ${target_group_arn} ${instance_id} 'healthy'; done
    
  • 참고: htps : // 걸려. 하테나 bぉg. 코m/엔트리/2017/04/22/233836

  • 추가: 2019/11/20



    이 기사를 쓴 다음날 이런 기능이 나왔습니다

    Application Load Balancer simplifies deployments with support for weighted target groups

    좋은 웹페이지 즐겨찾기