ALB 부하의 EC2를 절반씩 분리하면서 쉘 일격으로 배포
하고 싶은 일
ALB의 Target Group하에 복수의 EC2 인스턴스가 등록되어 있다.
인플레이스 배포 등 사용자에게 영향을 주지 않도록 절반씩 분리하면서 처리하고 싶은 경우가 있다.
이것을 쉘을 사용해 일격으로 실시하고 싶다. (jenkins에서 1 클릭 이미지)
처리 흐름
AWS CLI를 사용하여 Target Group에서 절반씩 切り離し -> デプロイ -> 再登録
를 두 번 반복합니다. Target Group은 다음과 같이 상태 천이하기 때문에 각각 대기한다.
참고: 대상 상태
AWS CLI를 사용하여 Target Group에서 절반씩
切り離し -> デプロイ -> 再登録
를 두 번 반복합니다. Target Group은 다음과 같이 상태 천이하기 때문에 각각 대기한다.참고: 대상 상태
healthy → draining → unused
unused → initial → healthy
아래 준비
단계
unused
까지 대기) healthy
까지 대기) unused
까지 대기) 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
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
추가: 2019/11/20
이 기사를 쓴 다음날 이런 기능이 나왔습니다
Application Load Balancer simplifies deployments with support for weighted target groups
Reference
이 문제에 관하여(ALB 부하의 EC2를 절반씩 분리하면서 쉘 일격으로 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/moikei/items/5a8c9f025614447194ed
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(ALB 부하의 EC2를 절반씩 분리하면서 쉘 일격으로 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/moikei/items/5a8c9f025614447194ed텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)