SNS란?
- 클라우드에서 손쉽게 알림 기능을 설정하고 작동 및 전송할 수 있는 AWS 서비스이다.
- 게시 - 구독 메시징 방식이며 Push 메커니즘을 사용하여 클라이언트에게 알림을 전달한다.
- 각 주제는 SNS 앤드포인트를 식별하는 고유한 이름을 가지기 때문에 게시자는 메시지를 게시하고 구독자는 알림을 받도록 등록이 가능하다.
- 구독자는 구독하는 주제에 게시된 모든 메시지를 수신하며, 특정 주제에 대한 알림은 모든 구독자가 동일하게 수신한다.
사용 사례
- AutoScaling Group에 Scale in, Scale out과 같은 특정 변경 사항이 발생했을 때, 사용자가 알림을 받을 수 있다.
- SNS를 사용하여 구독자에게 이메일 또는 문자메시지로 특정 뉴스 헤드라인을 Push할 수 있다.
- 업데이트가 가능함을 알리는 메시지를 앱으로 전송할 수 있다.
구성도 및 동작 방식
실습
1. AutoScaling Group 생성(단순 조정 정책)
1.1 시작 템플릿 생성
1.2 AutoScaling Group생성
1.2 단순 조정 정책을 위한 CloudWatch Alarm 생성
1.3 AutoScaling Group에 단순 조정 정책 적용
2. SNS 설정
2.1 SNS 주제 생성
2.2 AutoScaling Group과 SNS 주제 연동
3. Lambda 함수에 필요한 IAM 역할 생성
4. Lambda 함수 생성
이 작업에서는 AutoScaling Group에 의해 Scale out 이벤트가 발생하면 SNS가 호출할 AWS Lambda를 생성할 것이다. Lambda 함수가 실행되면 새로 생성된 인스턴스에 태그를 지정하고 EBS 볼륨의 스냅샷을 생성한다.
from __future__ import print_function
import json, boto3
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
# AutoScaling 이벤트 알림에서 EC2 Instace ID를 추출한다.
message = event['Records'][0]['Sns']['Message']
autoscalingInfo = json.loads(message)
ec2InstanceId = autoscalingInfo['EC2InstanceId']
# 새로 생성되는 인스턴스에 연결된 EBS 볼륨 스냅샷을 뜬다.
ec2 = boto3.resource('ec2')
for v in ec2.volumes.filter(Filters=[{'Name': 'attachment.instance-id', 'Values': [ec2InstanceId]}]):
description = 'Autosnap-%s-%s' % ( ec2InstanceId, v.volume_id )
if v.create_snapshot(Description = description):
print("\t\tSnapshot created with description [%s]" % description)
# 새로 생성되는 인스턴스에 태그를 추가한다.
ec2 = boto3.client('ec2')
response = ec2.create_tags(
Resources=[ec2InstanceId],
Tags=[{'Key': 'Snapshots', 'Value': 'Created'}]
)
print ("***Tag added to EC2 instance with id: " + ec2InstanceId)
return ec2InstanceId
5. SNS를 트리거로 지정
6. Scale Out하여 동작 테스트 해보기
6.1 실행중인 인스턴스 접속 및 Stress 패키지로 CPU 부하 발생하기
sudo amazon-linux-extras install epel -y
sudo yum install stress -y
인스턴스에서 상단의 명령어를 입력해준다. 첫 번째 명령어 실행 후 다음 두 번째 명령어는 동작까지 시간이 좀 걸릴 수 있다.
stress --cpu 2 --timeout 5000
6.2 테스트 결과
'AWS' 카테고리의 다른 글
사용자 인증이 가능한 서버리스 웹 어플리케이션 구축 (1) AWS Amplify를 활용한 정적 웹 사이트 호스팅 (0) | 2021.07.05 |
---|---|
AWS SES 사용 방법 및 구성 (0) | 2021.07.05 |
AWS Lambda + API GateWay를 활용한 REST API 사용하기 (0) | 2021.07.03 |
AWS Lambda 기초 개념 및 간단 사용 (0) | 2021.07.03 |
AWS CodeCommit 사용해보기 (0) | 2021.07.03 |