AWS에서 가용 영역 종료 시뮬레이션

고가용성 애플리케이션 개발의 특정 단계에서 AWS에서 가용 영역이 다운될 때 어떤 일이 발생하는지 테스트하고 싶을 것입니다.

AZ 비활성화



AZ에 대한 모든 네트워크 트래픽을 차단하는 것이 이를 시뮬레이션하는 가장 좋은 방법인 것 같습니다. 내가 사용한 방법은 AZ의 모든 서브넷에 대한 ACL을 새 ACL로 변경하는 것이었습니다. AWS cli는 기본적으로 새 ACL에 대해 Deny All 트래픽이 있는 ACL을 생성합니다.

#!/bin/bash

# prereq
#  - jq
#  - aws-cli

AZ=eu-west-1c
# use the subnetId to get the NetworkAclAssociationId to create the new acl association
for SUBNETID in $(aws ec2 describe-subnets --region ${AZ%?}| jq ".Subnets[] | select(.AvailabilityZone==\"$AZ\")"  | jq -r '.SubnetId')
do
  aws ec2 describe-network-acls --region ${AZ%?}| jq -r ".[] | .[].Associations[] | select(.SubnetId==\"$SUBNETID\")" | jq -r '.NetworkAclAssociationId' >> NetworkAclAssociationId.tmp
  # Need to take a backup of the original NetworkAclId's to be able to reverse the change
  aws ec2 describe-network-acls --region ${AZ%?}| jq -r ".[] | .[].Associations[] | select(.SubnetId==\"$SUBNETID\")" | jq -r '.NetworkAclId' >> NetworkAclId-restore.tmp
done

여러 VPC가 있으므로 각 VPC에 대해 서로 다른 ACL을 생성해야 했습니다.

# create the dummy ACL and create a file containing the NetworkAclId for the dummy ACL for each VPC
for VPCID in $(aws ec2 describe-subnets --region ${AZ%?} | jq -r ".Subnets[] | select(.AvailabilityZone==\"$AZ\")"  | jq -r '.VpcId')
do
  aws ec2 create-network-acl --vpc-id $VPCID --region ${AZ%?} | jq -r '.NetworkAcl.NetworkAclId' >> NetworkAclId.tmp
done

그런 다음 NetworkAclAssociationId 및 NetworkAclId 목록을 가져오고 ACL 연결을 변경하는 함수를 만들었습니다.

# Function ChangeAcl takes two arguments for disable or enable
# $1 should be NetworkAclAssociationId filename
# $2 should be NetworkAclId filename
function ChangeAcl() {
  # needed to read from two files so used a count to poll through the lines of the second file
  count=1
  cat $1 | while read NetworkAclAssociationId
  do
    echo $(sed -n "${count}p" < $2)
    echo $NetworkAclAssociationId
    aws ec2 replace-network-acl-association --region ${AZ%?} --association-id $NetworkAclAssociationId --network-acl-id $(sed -n "${count}p" < $2)
    ((count=count+1))
  done
}
# Call the function to create new disable ACL association
ChangeAcl NetworkAclAssociationId.tmp NetworkAclId.tmp

이 시점에서 특정 AZ에 대한 모든 트래픽을 비활성화했으며 이제 리소스가 예상대로 재배포되고 다운타임이 없는지 확인할 수 있습니다.

다시 활성화



다시 활성화하려면 몇 가지 추가 단계가 필요합니다.

# Get the new networkAclAssociationId for the subnets
for SUBNETID in $(aws ec2 describe-subnets --region ${AZ%?} | jq ".Subnets[] | select(.AvailabilityZone==\"$AZ\")" | jq -r '.SubnetId')
do
  aws ec2 describe-network-acls --region ${AZ%?} | jq -r ".[] | .[].Associations[] | select(.SubnetId==\"$SUBNETID\")" | jq -r '.NetworkAclAssociationId' >> NetworkAclAssociationId-restore.tmp
done
# Restore the subnets to the original ACL's
ChangeAcl NetworkAclAssociationId-restore.tmp NetworkAclId-restore.tmp

# delete the dummy ACL's
cat NetworkAclId.tmp | while read deleteNetworkAclId
do
  aws ec2 delete-network-acl --network-acl-id $deleteNetworkAclId --region ${AZ%?}
done

즉, 모든 트래픽을 원래 구성으로 복원해야 합니다.

좋은 웹페이지 즐겨찾기