AWS Lambda, SNS, EventBridge, yahoo API로 원하는 종목 주식가격 이메일로 알림받기!

Namu CHO
11 min readJan 30, 2022

--

주식가격이 내려가면 메일로 받아보자!

AWS 사내 스터디에서 SQS, SNS, SES 발표를 담당하게 되어

SNS와 관련한 흥미로운 예시를 만들어보고자 만들게 된 미니 프로젝트입니다.

저는 이 프로젝트에서 원하는 종목의 주식 가격이 기준선 아래로 내려가면 저에게 매수하라는 메일을 보내보겠습니다.

작업 순서)

SNS 주제 생성 → SNS 구독 생성 (프로토콜: 이메일 선택) → 이메일 인증 →

IAM 권한 설정 (람다가 SNS을 쓸 수 있도록 권한 부여) →

Lambda 함수 생성 (생성 시 SNS Full access IAM필요) →

EventBridge로 원하는 주기마다 api fetching하도록 설정

(1. SNS

  1. IAM
  2. Lambda
  3. EventBridge 순서로 작업해주겠습니다.)

1. SNS

SQS, SNS, SES에 대한 설명은 아래 링크를 통해 더 자세한 내용을 확인하실 수 있습니다.

https://namu1105.notion.site/AWS-S-series-b8f39ae0e47945498f6703fa46f11b2d

SNS에 대해 간략히 말씀드리자면 SNS는 Simple Notification Service의 약자로,

어떤 이벤트가 발생했을 때 해당 이벤트를 다른 서비스들에게 전달하는 서비스입니다.

(주로 한 이벤트를 여러 서비스에 동시에 알릴 때 사용을 많이 하지만,

이 프로젝트의 경우에는 이벤트를 이메일에게만 알리는 1:1의 관계로 사용했습니다.)

저는 람다 함수를 통해 주식가격을 받아보고, 받아본 주식가격을 SNS를 통해 이메일로 보내는 목적으로 사용했습니다.

1.1 SNS 주제 생성

https://ap-northeast-2.console.aws.amazon.com/sns/v3/home?region=ap-northeast-2#/dashboard

SNS 페이지로 이동한 뒤 ‘주제’ 메뉴로 이동합니다.

그리고 ‘주제 생성’ 버튼을 클릭합니다.

‘유형’은 ‘표준’을 선택해줍니다.

그리고 ‘주제 생성’ 버튼을 클릭하여 주제를 생성합니다.

주제 생성이 완료되었습니다.

화면 하단의 ‘구독 생성’ 버튼을 클릭하여 구독을 생성해보겠습니다.

1.2 SNS 구독 생성

그럼 아까 생성한 주제 ARN이 자동으로 매핑되어있는 것을 확인 할 수 있습니다.

주제 ARN은 그대로 두고

(참고로 ARN은 Amazon Resource Number로 aws서비스들의 주민번호와 같은 것이라고 생각하시면 됩니다.)

프로토콜을 선택해줍니다.

이메일을 보낼 것이므로 이메일을 선택합니다. (’이메일-JSON’이 아닌 ‘이메일’로 선택)

그리고 이메일을 수신할 이메일 주소를 기재해줍니다.

이메일 인증

해당 계정으로 이메일을 보내기 위해서는 인증을 진행해야 합니다.

AWS에도 해당 내용에 대한 안내가 나와있습니다.

구독생성을 마치면

아까 기재했던 이메일계정으로 이메일 인증을 위한 메일이 도착했을 것입니다.

메일 안의 ‘Confirm subscription’ 글씨를 클릭하여 인증을 완료하면 됩니다.

이메일 인증이 완료되었습니다.

2. IAM

https://console.aws.amazon.com/iamv2/home#/roles

IAM 메뉴로 이동하여 ‘역할’을 선택한 후 ‘역할 만들기’버튼을 만들어 역할을 만들겠습니다.

저희가 하고자하는 바는 Lambda가 SNS를 쓸 수 있도록 권한을 부여하는 것이므로

‘AWS 서비스’를 선택하고

‘Lambda’를 선택합니다.

저희는 SNS관련 작업을 해야 하므로

SNS를 검색하여 ‘AmazonSNSFullAccess’를 선택합니다.

그리고 ‘다음:태그’버튼을 누릅니다.

태그는 스킵하도록 하겠습니다.

‘다음:검토’ 버튼을 누릅니다.

역할 이름을 기재하고 ‘역할 만들기’버튼을 누릅니다.

생성이 완료되었습니다.

3. Lambda

3.1 함수 생성_기본 내용 기재

화면 오른편의 ‘함수 생성’버튼을 눌러 함수를 생성해줍니다.

‘새로 작성’을 선택하고 함수 이름을 기재해줍니다.

(저는 이미 생성하고 다시 설명을 위해 같은 이름을 작성했더니 경고가 뜨고 있습니다.)

저는 node.js를 사용할 것이므로 ‘런타임’에 Node.js 14.x를 선택합니다.

그 다음 권한 설정을 해주겠습니다.

3.2 함수 생성_권한 설정

앞서 2번단계에서 만든 권한을 연결해줍니다.

이미 만들어둔 권한이 있으므로

‘기존 역할 사용’을 클릭해줍니다.

그리고 아래 뜨는 ‘기존 역할’ 셀렉트 박스를 클릭한 뒤

앞서 만든 역할을 찾아 선택합니다.

그 다음 화면 하단의 ‘함수 생성’버튼을 클릭하여 함수를 생성해줍니다.

그럼 함수 생성이 완료되었습니다.

구성’ 메뉴에서 권한이 잘 연결된 것을 확인할 수 있습니다.

3.3 실제 동작할 코드 작성

주식 가격 확인 api fetching을 위해 axios를 쓸 것입니다.

Lambda에 기본적으로 axios를 포함하고 있지 않으므로

axios (node_modules, 외부 라이브러리)를 사용하기 위해 로컬에서 axios를 포함한 패키지를 구성한 뒤 해당 코드를 람다에 업로드 하는 방식을 사용하겠습니다.

사용 라이브러리)

(api 콜을 날리기 위해 사용합니다.)

주식 가격 확인 api)

원하는 주식 종목 코드 -ticker- 찾는 곳)

외부 라이브러리를 lambda에서 사용하는 자세한 방법은 아래 링크를 확인해주세요.

AWS lambda에서 node_modules 쓰는 법)

외부 라이브러리를 사용하기 위해서는,

  1. 로컬환경에서 폴더를 만들고 (내 컴퓨터 안에 폴더를 만들고)
  2. npm init 혹은 yarn init을 통해 package.json을 만듭니다. (저는 yarn을 사용했습니다.)
  3. 그 뒤, npm i axios 혹은 yarn add axios를 통해 axios 패키지를 다운 받고,
  4. index.js 파일을 생성한 다음 해당 폴더를 zip으로 압축합니다.

이런 구조가 될 것입니다.

5. 압축한 zip폴더를 lambda에 업로드 합니다.

5.1 ’에서 업로드’ 버튼을 누릅니다.

5.2 ‘.zip 파일’을 선택합니다.

원하는 폴더를 선택한 뒤 ‘저장’버튼을 누릅니다.

그럼 이런 구조로 코드가 업로드 됩니다.

중요!!!

여기서 폴더 구조를 바꿔줘야합니다.

위 구조를 아래 구조처럼 (LambdaTest 폴더를 뺀 모습으로) 바꿔주셔야 합니다.

(드래그앤드랍으로 손쉽게 폴더 구조를 바꿔줄 수 있습니다.)

필요한 코드들은 상단으로 꺼내고 (node_modules폴더, index.js, package.json, yarn.lock) 필요없는 폴더는 삭제해줍니다.

그 뒤, index.js에 아래 코드를 복사 붙여넣기 하고 ‘Deply’버튼을 눌러 코드를 업데이트 합니다.

(애초에 해당 코드를 index.js에 넣어 빌드해도 됩니다.)

index.js에 들어갈 코드)

업데이트가 완료되었습니다.

3.4 테스트

‘Test’버튼을 눌러 테스트를 진행해보겠습니다.

그럼 ‘테스트 이벤트 구성’이라는 팝업이 뜨는데, 저희는 필요없기 때문에 아무것도 건들이지 않고

이벤트 이름만 작성한 뒤 ‘생성’버튼을 누르겠습니다.

그리고 다시 ‘Test’버튼을 눌러줍니다.

그러면 테스트 결과를 확인할 수 있습니다.

리턴하는 값이 없으므로 null이 리스폰스로 들어온 것을 확인할 수 있습니다.

메일함을 확인해보니 메일이 잘 들어온 것을 확인할 수 있습니다.

성공

4. EventBridge

EventBridge 연결 참고 영상)

동영상에서는 클라우드 워치의 이벤트 → 룰 을 통해 크론 작업을 실행할 것을 안내했지만 (2020.04기준) 2022.01기준 홈페이지에서 EventBridge 사용을 강제하고 있어서 EventBridge를 사용했습니다.

EventBridge로 이동합니다.

https://ap-northeast-2.console.aws.amazon.com/events/home?region=ap-northeast-2#/rules

오른쪽 하단의 ‘규칙 생성’ 버튼을 클릭합니다.

(이벤트 버스는 ‘default’로 둡니다.)

원하는 이름을 기재하고

‘패턴 정의’에서 어떤 경우에 이벤트를 트리거 할지 정합니다.

저는 테스트를 위해 일분에 한 번 체크하는 것을 희망하므로 ‘일정’을 선택하고 1을 인풋에 기재했습니다.

(원하신다면 직접 Cron 식으로 기재하셔도 됩니다.)

이제 ‘대상 선택’으로 넘어갑니다.

이미 만들어둔 lambda함수와 연결할 것으므로

대상은 ‘Lambda 함수’로 선택하고 ‘yahoo4’ 함수를 선택합니다.

하단의 ‘생성’ 버튼을 눌러주면 EventBridge부분은 완료입니다.

페이지를 이동하여 만들어두었던 람다함수를 확인해보면 트리거에 아까 생성하여 연결한 이벤트브릿지 룰이 추가된 것을 확인 할 수 있습니다.

이제는 직접 람다의 테스트 버튼을 누르지 않아도

아까 설정한 1분에 한 번씩 이벤트가 잘 트리거 되어 람다를 호출하는 것을 확인 할 수 있습니다.

사실 저는 주식을 잘 모르지만, 다른 분들이 관심을 가지실 것 같아서 주식이라는 주제를 골랐습니다.

yahoo api가 제공하는 주식관련 정보가 매우 많으므로,

아래 링크한 url을 보시고 본인에게 더 적합한 정보를 제공하는 api를 골라서 콜을 날리시면 됩니다.

모쪼록 도움이 되는 글이었기를 바랍니다.

--

--