만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/backend&devOps

[AWS] amazon lambda + API Gateway 로 SNS 메시지 보내기 - 1

D36choi 2021. 4. 12. 13:20
728x90

먼저 발행된 글들

 

2021.03.04 - [프로그래밍/backend&devOps] - [AWS] Amazon SNS 란?

 

[AWS] Amazon SNS 란?

Amazon SNS 란? Amazon Simple Notification Service (Amazon SNS) is a managed service that provides message delivery from publishers to subscribers (also known as producers and consumers). Publishe..

choichumji.tistory.com

2021.03.04 - [프로그래밍/backend&devOps] - [AWS] Amazon SNS 로 구독자 메일 전송을 해보자

 

[AWS] Amazon SNS 로 구독자 메일 전송을 해보자

Amazon SNS 서비스를 처음 시작해보는 사람에게 적합한 튜토리얼입니다. aws 서비스 리전은 서울로 설정되어있습니다. Amazon SNS 가 뭐하는 서비스인지는 아래 글에 써놓았습니다. 2021/03/04 - [프로그

choichumji.tistory.com

2021.03.10 - [프로그래밍/backend&devOps] - [AWS] amazon SNS + Spring Boot 이용한 메시지 서비스 만들기

 

[AWS] amazon SNS + Spring Boot 이용한 메시지 서비스 만들기

project link github.com/d36choi/awssns-springboot d36choi/awssns-springboot Contribute to d36choi/awssns-springboot development by creating an account on GitHub. github.com 회사의 신입 개발자 과제..

choichumji.tistory.com


API Gateway + lambda 로 API 요청을 보내자

 

최종 목표는

"lambda 함수를 생성해 API Gateway 를 트리거로 삼아, API 요청을 통해 외부에서 amazon SNS 에 메시지를 발행한다."

가 된다.

 

AWS lambda 란?

AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda는 필요 시에만 코드를 실행하며, 하루에 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 확장이 가능합니다. 사용한 컴퓨팅 시간만큼만 비용을 지불하고, 코드가 실행되지 않을 때는 요금이 부과되지 않습니다. Lambda에서는 사실상 모든 유형의 애플리케이션이나 백엔드 서비스에 대한 코드를 별도의 관리 없이 실행할 수 있습니다. - 개발자 안내서

내가 서버를 배포할 필요 없이, 다양한 방법으로 함수 동작 명령을 내리게 되면 스스로 함수를 실행시켜주는 서비스라고 보면 된다고 생각.

즉 서버리스 (serverless) 아키텍처에 대응하는, 가장 많이 알려진 function as a service (FaaS) 다. 

 

API Gateway 란?

Amazon API Gateway 는 어떤 스케일이든, 웹소켓API, REST,HTTP API 를 생성 관리 유지 모니터링 할 수 있는 아마존의 서비스입니다.
API 개발자는 다른 웹서비스나 AWS, 또한 AWS 클라우드에 저장된 데이터를 액세스 할 수 있는 API 를 만들 수 있습니다.
API Gateway 개발자인 당신은 당신의 클라이언트 애플리케이션을 위한 API 개발 혹은 써드파티 앱 개발자에게 이용가능한 당신만의 API 를 개발 할 수 있습니다.

내가 이해한 바로는, 간단하게 REST 한 API 를 설계 및 배포할 수 있는 서비스인 것 같다.

단순히 클릭 몇번으로 행위(method)와 자원(resource)을 통한 API 의 생성이 가능하다. 물론 네트워크 관련 지식이 어느정도는 요구되는 것 같다. CORS 라던지, stateless 통신이라던지 기본적인 통신 개념에 대한 숙지는 필요하다.

 

이제 이 두가지 서비스를 연결해서, Postman 으로 API 요청을 전송하면 람다함수의 내용이 실행되어 Amazon SNS 에 메시지가 알아서 발행될 수 있게 구성해보자.

 

lambda 설정

 

먼저 AWS lambda 콘솔에 접속한다.

그 뒤 우측 상단에 함수 생성을 클릭한다.

 

함수 생성

기존에 정의된 코드 양식을 그대로 사용해보기 위해 블루프린트 사용을 클릭 후 'sns' 를 입력한다.

 

맨 아래 'step-functions-send-to-sns' 를 클릭

 

오른쪽 하단 '구성' 클릭

함수의 기본정보를 입력한다. 원하는대로 이름과 역할이름을 작성한다.

정책은 해당 역할의 권한을 의미하며 가장 최소단위로 설정하는 것이 보안상 좋다고 한다.

메타데이터를 입력하자

 

 

해당 블루프린트 (청사진) 의 파이썬 코드는 아래와 같다.

boto3 는 이전 게시글의 java aws sdk 처럼, 아마존 서비스와의 요청 및 응답을 위해 필요한 라이브러리다.

파이썬을 알고 amazon sns 공부를 했다면 아래의 코드는 이해가 쉬울 것이다.

 

 

람다 코드

from __future__ import print_function

import json
import urllib
import boto3

print('Loading message function...')


def send_to_sns(message, context):

    # This function receives JSON input with three fields: the ARN of an SNS topic,
    # a string with the subject of the message, and a string with the body of the message.
    # The message is then sent to the SNS topic.
    #
    # Example:
    #   {
    #       "topic": "arn:aws:sns:REGION:123456789012:MySNSTopic",
    #       "subject": "This is the subject of the message.",
    #       "message": "This is the body of the message."
    #   }

    sns = boto3.client('sns')
    sns.publish(
        TopicArn=message['topic'],
        Subject=message['subject'],
        Message=message['body']
    )

    return ('Sent a message to an Amazon SNS topic.')

자바로 하다가 파이썬으로 진행하는 코드를 보니 참 심플해서 좋다.

 

여기서 파라미터인 'message' 는 API 요청에서의 request body (json data) 를 의미한다.

 

즉 평소처럼 API 요청에 메시지로 보내고자하는 body 를 담아 전송하면 된다.

 

이제 함수생성을 마치면 아래와 같이 뜨게 된다.

 

람다 함수 생성 완료. 개요를 통해 전체 구조를 볼 수 있다.

이제 아래 주황색 테스트 버튼을 눌러 동작을 확인해보자

 

 

그러면 팝업창이 뜨게 되고, 입력할 메시지의 내용을 지정가능하다.

 

lambda 함수의 인자인 message 에 담을 body 를 정의하자

위와 같이 'topic'.'subject','body' 를 명시하지않으면 파싱에러가 뜰 것이다. 

 

에러를 핸들링하는건 나중에 하도록 하고, 본인이 이전에 sns 를 통해 생성해놨던 토픽에 보낼 수 있도록 토픽 주소를 입력하자.

(이전 글 참조)

 

생성을 누르면 다시 이전 페이지로 돌아갈 것이다.

 

다시 주황색 Test 버튼을 눌러보자.

테스트 결과

 

정상적으로 동작이 되었다. 과연 토픽에도 메시지가 발행되었을까?

메시지가 전송되었다고 뜬다. 실제로 발송되었나 확인하기 위해, 해당 토픽에 구독중인 구독자에게 물어봐 확인하자.

 

webhook.site 를 이용해 확인해보겠다. 

 

잘 도착했다

 

람다를 통해서 serverless하게 내가 원하는 작업을 할 수 있는 것을 확인했다. 이제 테스트도 끝났으니 이 작업을 외부에서 API 요청을 통해 손쉽게 할 수 있도록 API Gateway 를 붙여보도록 하자.