AWS의 SNS와 Lambda는 사실 완전히 다른 서비스임에도 불구하고, SNS가 이벤트 기반 메시지 전달 서비스이기 때문에, 이에 대한 이벤트 트리거로 Lambda를 함께 사용하는 경우가 많습니다. 그래서 이번 포스팅에선 SNS와 Lambda를 사용하여 문자메시지를 전송하는 방법에 대해 알아보겠습니다.
① IAM의 정책 탭에 들어가 정책 생성 버튼을 클릭한다.
② 서비스 선택에 있는 SNS를 클릭한다.
③ 액세스 수준에서 쓰기의 모든 작업을 선택한다.
④ 리소스 설정을 모두로 변경하고 다음 버튼을 클릭한다.
⑤ 정책의 이름을 입력하고 정책 생성 버튼을 클릭한다.
⑥ 이제 역할 탭에 들어가 역할 만들기 버튼을 클릭한다.
⑦ AWS 서비스를 선택하고, Lambda를 선택한다.
⑧ 방금 추가한 정책을 연결한다.
⑨ 역할 이름을 입력한 후, 역할 생성 버튼을 클릭하면 된다.
① SNS를 메뉴로 들어와 리전을 도쿄로 변경해주어야 한다. 그 이유는 모바일 문자 메시지를 서울 리전에서는 지원해주지 않기 때문이다.
② 스크롤을 조금만 내리면 샌드박스 대상 전화번호가 있는데, 우측의 전화번호 추가 버튼을 클릭한다.
※ SandBox
샌드박스란, 외부로부터 들어온 프로그램이 보호된 영역에서 동작해 시스템에 문제가 생기는 일을 방지하는 보안 형태이다. 따라서 샌드박스에 등록되지 않은 전화번호에 대해서는 메시지를 발신할 수 없게 된다. 샌드박스의 제약 사항에는 아래의 내용이 포함된다.
- 등록된 전화번호로만 SNS 메시지 전송 가능
- 전화번호는 최대 10개까지만 등록 가능
- 한번 등록한 전화번호는 24시간 이후에 삭제 가능
③ 본인의 전화번호를 추가하면 된다.
④ 이제 메시지 개시 버튼을 클릭한다.
⑤ 메시지 유형은 트랜잭션을 선택하고, 대상 전화번호는 방금 등록한 전화번호를 선택한다. 메시지는 아무렇게나 적으면 된다.
⑥ 발신자 ID와 발신 번호는 생략한 채로 메시지 게시버튼을 클릭한다.
① 이제 Lambda 메뉴에 들어간다. 람다와 SNS는 리전이 같아야하기 때문에 Lambda 역시 도쿄 리전에서 실행해야 한다. 리전을 확인한 후 함수 생성 버튼을 클릭한다.
② 새로 생성을 선택하고, 함수 이름, 런타임을 설정한다. 참고로 AWS에선 Node.js와 파이썬 런타임에 대해서만 코드 편집 기능을 제공하므로, 되도록 둘 중 하나를 고르는 게 좋다. 여기서는 파이썬을 선택하기로 한다.
③ 방금 생성한 역할을 선택한 후 함수 생성 버튼을 클릭한다.
④ 테스트 탭을 클릭한 후 새 이벤트 생성, 이벤트 이름, 공유 가능을 설정한다. 이벤트 JSON에 message에는 보낼 문자 내용을, number에는 수신할 전화번호(SandBox에 등록된 전화번호)를 입력하고 저장한다. 전화번호에는 국가번호를 포함하고, 하이픈을 사용하지 않아야 한다.
코드 탭을 들어가면 아래와 같이 코드 편집기가 나온다. 앞서 이야기했듯, Lambda의 런타임을 Java 17로 설정한 경우, AWS 자체에서 코드 편집 기능을 제공해주지 않는다. 다소 귀찮더라도 .jar 파일을 빌드하여 Lambda에 업로드해야 한다.
만약 Node.js나 파이썬을 다룰 수 있는 사람이라면, 런타임을 Node.js나 Python으로 설정하여 코드 편집 기능을 이용하는게 좋다.
① 아래와 같이 코드를 작성하고, Deploy 버튼을 클릭한다.
import json
import boto3
def send_sms_message(event, context):
# event에서 메시지 내용(msg)과 전화번호(phone)를 추출합니다.
msg = event.get('message')
phone = event.get('number')
# 필요한 입력이 없으면 오류를 반환합니다.
if not msg or not phone:
return {
'statusCode': 400,
'body': json.dumps('메시지 내용과 전화번호를 모두 입력해주세요.')
}
# AWS SNS 클라이언트를 생성합니다.
sns = boto3.client('sns')
try:
# SMS를 보냅니다.
response = sns.publish(
PhoneNumber=phone,
Message=msg
)
print(response) # 이 부분은 선택 사항이며, Lambda 함수의 로그에 응답을 기록하기 위해 사용됩니다.
return {
'statusCode': 200,
'body': json.dumps('메시지가 성공적으로 전송되었습니다.')
}
except Exception as e:
print(e)
return {
'statusCode': 500,
'body': json.dumps('메시지 전송 중 오류가 발생하였습니다.')
}
② 스크롤을 조금 내린 후 런타임 설정의 편집 버튼을 클릭한다.
③ 핸들러의 이름을 "파이썬 파일 이름"."메서드 이름"으로 변경해야 한다.
④ Test 버튼을 누르면 아래와 같이 결과가 나오면서 메시지가 전송된다.
⑤ 메시지가 정상적으로 도착하는지 확인한다.
문자는 50건까지만 무료이기 때문에 테스트를 위해, 문자를 너무 남발하지 않도록 주의한다.
SandBox에는 제약이 많기 때문에 실제 서비스에 활용하기에는 어려움이 많다. 따라서 이 제약을 푸는 방법에 대해서 소개한다.
① SNS 메뉴에서 스크롤을 조금만 내리면 SMS 샌드박스 종료 버튼이 있는데, 이것을 클릭한다.
② 한도 유형은 SNS Text Messaging을 선택하면 된다.
나머지 빈칸들도 알맞게 채운 후 제출을 누르면, AWS 측으로 문의가 간다. 자세한 내용은 아래의 공식 홈페이지 자료를 참고하기 바란다.
>> SandBox 제약 해제
실제 서비스 환경에 사용할 것이 아니라 단순히 공부가 목적이라면, 문의를 넣지 않는게 낫다.