▶ ALB(Application Load Balancer)의 타겟 그룹을 활용하여 Hot / Standby 구조를 구현하는 것이 목표
ASG(Auto Scaling Group)에서 관리하는 EC2 인스턴스(Hot)와 Standby 인스턴스를 운영하면서, 장애 발생 시 트래픽을 자동으로 Standby로 전환하는 걸 확인하는 테스트하고자 한다.
CloudWatch Alarm 설정
ALB의 타겟 그룹 헬스 체크 기준에 따라 특정 인스턴스가 UnHealthy 상태가 되면, UnHealthyHostCount 값이 증가하고 CloudWatch Alarm이 트리거 된다. 즉, ASG의 하나의 인스턴스라도 Unhealthy 상태면, 경보가 울린다.
CloudWatch Alarm의 작업 설정은 Alarm / OK 상태 모두 SNS 토픽으로 트리거되게 잡았다.
(여기서 SNS Topic 생성이 필요)
Lambda 생성
import boto3
import json
elb_client = boto3.client('elbv2')
def lambda_handler(event, context):
# SNS 메시지에서 이벤트 추출
sns_message = event['Records'][0]['Sns']['Message']
event_detail = json.loads(sns_message)
# ALB 리스너 ARN과 대상 그룹 ARN
listener_arn = 'your_arn'
primary_target_group_arn = 'your_arn'
standby_target_group_arn = 'your_arn'
# SNS 메시지에서 상태 추출
state = event_detail['NewStateValue']
if state == 'ALARM':
# ALARM 상태일 때 Standby로 트래픽 분산 (50:50 or 100:0)
action = {
'Type': 'forward',
'ForwardConfig': {
'TargetGroups': [
{
'TargetGroupArn': primary_target_group_arn,
'Weight': 20 # 기존 대상 그룹을 일부 유지
},
{
'TargetGroupArn': standby_target_group_arn,
'Weight': 80 # 대부분의 트래픽을 Standby로 전환
}
]
}
}
response_message = 'Listener rule updated: 80% traffic to standby target group'
elif state == 'OK':
# OK 상태일 때 다시 Primary Target Group으로 복원
action = {
'Type': 'forward',
'ForwardConfig': {
'TargetGroups': [
{
'TargetGroupArn': primary_target_group_arn,
'Weight': 100 # 다시 Primary Target Group으로 복원
},
{
'TargetGroupArn': standby_target_group_arn,
'Weight': 0 # Standby로 가는 트래픽 제거
}
]
}
}
response_message = 'Listener rule updated: 100% traffic to primary target group'
try:
# ALB 리스너 규칙 업데이트
response = elb_client.modify_listener(
ListenerArn=listener_arn,
DefaultActions=[action]
)
print("Response:", response)
return {
'statusCode': 200,
'body': response_message
}
except Exception as e:
print("Error:", str(e))
return {
'statusCode': 500,
'body': 'Error updating listener rule'
}
위 코드를 넣어주고 Deploy 버튼을 눌러 배포해준다.
(가중치는 원하는대로 조정하면 된다.)
Lambda IAM 역할은
AmazonSNSFullAccess, CloudWatchEventsFullAccess, ElasticLoadBalancingFullAccess 의 정책을 연결해준다.
( Lambda 실행 후 CloudWatch Logs에서 로그 확인 (/aws/lambda/{LambdaFunctionName} 경로) ← 해당 로그에서 에러 시 확인하기 좋다.)
Lambda 트리거 설정
SNS Topic을 Lambda가 구독해 트리거 설정을 해준다.
Hot/Standby Test
지금 설정해둔 ALB의 리스너 규칙을 보면, 아래 이미지와 같다.
asg-tg의 인스턴스를 unhealthy로 만들어주면, CloudWatch Alarm이 Alarm 경보를 보낸다.
아래 이미지와 같이 가중치가 자동으로 변하며, standby-sg 쪽에 트래픽이 분산된다.
다시 asg-tg의 인스턴스를 healthy 상태로 만들어주면, CloudWatch Alarm 상태가 OK 상태로 바뀌고 100 / 0의 가중치로 돌아올 것이다.
위 방식은 나의 머릿 속에서 의식의 흐름대로 적었을 뿐... 더 좋은 방식이 있을 수 있다🙄
급증하는 트래픽에 ASG 인스턴스 늘어나는 속도가 트래픽 속도를 못 따라 잡을 때 대응 방법으로 생각해본 것!
'Cloud > AWS' 카테고리의 다른 글
[AWS] EFS를 통한 ASG 소스 배포 테스트 (0) | 2025.02.26 |
---|---|
AWS 환경 위에서 NAS 환경 구성하는 방법 (0) | 2024.04.24 |
[EKS] eksctl로 EKS 클러스터 생성하기 (0) | 2024.04.04 |
[AWS] private EC2에 접속하는 방법 -2 (0) | 2024.03.06 |
[AWS] private EC2에 접속하는 방법 -1 (0) | 2024.03.05 |