Run Python3 App without Server Using AWS Lambda

Background & Motivation

요즈음 프로그래밍 경험이 전혀 없는 학생들을 대상으로 Python(파이썬) 기초를 가르치고 있다. 나는 항상 이론보다는 실전에 가치를 두고 있는 편이다. 그런 이유로 강의 첫날, “Python을 포함한 프로그래밍 언어를 배우면 모든 것을 자동화 시킬 수 있을테니… 하고싶은 것을 생각해서 강의 마지막날에 집에 가져갈 수 있도록 하자”고 얘기했다.

학생들이 떠올린 프로젝트는 다음과 같았다.

  • Google Form을 이용한 설문조사를 많이 진행하는데, 누군가가 응답을 하면 거기에 알맞게 맞춤형 이메일을 전송해주고 싶다
  • 관심있는 기업 공시 정보가 정부사이트에 매일 올라오는데, 내가 관심있는 기업의 정보가 올라오면 그 내용을 내 이메일로 받고 싶다

프로그램 설계의 관점에서 보면 모두 다음 형태로 환원된다.

  • A라는 이벤트가 발생하면, B라는 이벤트를 발생시켜라

하지만 A라는 이벤트가 발생하는지 알 수 있는 방법은 서비스에 따라 제공하기도 하지만(예, Github의 경우 소스코드 commit이 올라오면 WebHook을 제공해서 Push 알림을 줄 수 있다. 이것을 이용해서 새로운 소스코드 commit시점에 자동화된 빌드 스크립트를 돌려서 빌드, 테스트, deploy까지 자동화 할 수 있다), 제공하지 않는 경우가 더 많기 때문에 우리는 주기적으로 이벤트가 발생했는지를 체크하는 방식을 이용한다. 그렇다면 다음 형태로 다시 쓸 수 있다.

  • 매 시간 A라는 이벤트가 발생했는지 확인 후, 발생했다면 B라는 이벤트를 발생시켜라.

매 시간이라는 간격이 대부분의 경우 프로젝트를 완성시키는데 충분한 시간간격일 수 있으며, 원하는 경우 매시간을 매분, 매초로 변경하면 실시간 시스템까지 만들 수 있다. 하지만 “실시간”이라는 단어가 들어가는 순간 복잡한 엔지니어링의 영역으로 들어갈 수 있고, 이 글이 도움이 될만한 예상 독자들의 수준을 고려한다면, 이 글에서는 다루지 않으려고 한다.

그럼 누가 매 시간  이벤트 A가 발생했음을 체크할껀데?

학생들은 내가 가르친 파이썬 기초강의와 실습시간에 배운것을 활용하여 python script를 만들어냈다. 이 Script를 실행하기만 하면 이벤트  A를 확인한 후 여기에 알맞는 이벤트 B를 발생시키는 것까지 자동으로 할 수 있었다. 하지만 학생들이 처음 생각한 프로젝트를 완성했다고 말하려면 누군가는 매 시간 이 Script를 실행시켜야 했다.

컴퓨터를 조금 배웠다는 사람이라면 서버(Server)라는 개념을 알고 있을것이다. 게임서버, 웹서버, 미디어서버 등등 서버는 어떤 요청(Request)이 왔을때 거기에 해당하는 응답(Response)을 줄 수 있는, 일반적으로 24시간 7일 내내 켜져있는 컴퓨터를 말한다.  나는 서버 셋팅하는 법을 알려주면 되겠다고 생각하고 강의자료를 준비하다가 큰 문제점을 깨달았다.

서버를 준비하려면 우선 Linux를 설치해야하고, 컴퓨터 초보에게는 너무 답답한 검정화면 CLI기반으로 각종 프로그램을 설치해야하며, 익숙하지 않은 vi Editor로 환경설정 파일을 바꿔가며, SSH 접속 설정을 해야하고, 여기에 새로운 cron문법을 익혀서 스케쥴링을 하면 되긴 하는데… 어찌어찌 여기까지 하더라도, 서버가 돌고있는 중에 예상치 못한 일이라도 발생하면 과연 한달 전에는 프로그래밍과 컴퓨터에 대해 거의 아는것이 없었던 내 학생들이 대응할 수 있을까? (아니오 ㅠ)

하지만 누가 이 스크립트를 실행할 것인가에 대해 “서버셋팅은 어려울테니, 그냥 네가 한시간에 한번씩 실행시키면 돼!” 라고 말하는 것은 지금까지 우리가 달성하고자 한 자동화의 노력을 모두 물거품으로 만드는 말이었다. 하지만 갑자기 내 머릿속에는 AWS Lambda가 떠올랐다. 이것은 2015년도에 나온 기술같은데, 서버 없이 서버가 하는 역할을 할 수 있도록 만든 서비스이다. (응?)

Introduction

Amazon Web Service(AWS) Lambda 서비스를 이용하면 내가 만든 Python Script를 실행하는것이 가능하다. 원리를 간단히 설명하기에 앞서 서버의 역할이 무엇인지를 다시 살펴보자.

서버는 어떤 요청(Request)이 왔을때 거기에 해당하는 응답(Response)을 줄 수 있는, 일반적으로 24시간 7일 내내 켜져있는 컴퓨터를 말한다.

하지만 Lambda의 개념은 24시간 7일 내내 켜져있는 컴퓨터를 없애버렸다. 요청이 들어오면 그 즉시 클라우드 컴퓨터 (EC2 Instance)를 할당하여, 미리 업로드한 코드를 deploy(복사, 설치라고 생각하면 된다)하고 요청을 처리한다음, 그 결과를 반환한 뒤 할당된 컴퓨터를 없애버린다.

즉 요청이 없으면 서버의 존재이유도 없다는 것 아이디어에 요청이 들어오는 순간 실시간으로 컴퓨터 자원을 할당하고 해제할 수 있는 기술력을 얹어서 탄생한 서비스가 AWS Lambda인것이다.

아쉽게도 현재 Lambda는 Node.js와 Python2.7만을 지원하고 있어 Python3로 작성한 프로그램은 약간의 우회 방법을 써야한다.

본 글에서는 서버에 대한 개념이 없더라도  “매 시간 A라는 이벤트가 발생했는지 확인 후, 발생했다면 B라는 이벤트를 발생시켜라” 라는 목표를 달성할 수 있도록 예시 소스코드(Github 주소: https://github.com/insikk/aws-lambda-scheduled-python3-script)와 함께 설정방법을 단계별로 설명한다.

우선 “A라는 이벤트가 발생했는지 확인 후, 발생했다면 B라는 이벤트를 발생시켜라”를 수행하는 python script가 있다고 가정한다. 우리의 예시 코드에서는 “Naver IT News 속보칸의 기사 목록을 읽어서, 이것을 내 이메일로 보낸다.”를 수행하는 코드가 myrobot.py에 작성되어있다.

최종 목표는 AWS의 스케쥴링 서비스를 이용해서 매 시간 이벤트를 발생시키고, 이 이벤트가 발생하면 Lambda Function을 통해 myrobot.py를 실행시키는 것이 이다. 그럼 내 메일함에는 자동으로 1시간마다 IT News속보가 도착하게 된다.

Preparation

AWS를 쓰려면 당연히 Amazon의 계정이 있어야 한다. https://aws.amazon.com/ 에 접속하여 계정을 만든다. 신용카드를 연결해야 할 수도 있는데, 지금 할 작업에서는 과금이 되더라도 $1 미만일테니 큰 걱정은 하지 말고 카드를 연결시킨다. 그리고 새로 가입하는 경우 어쩌면 무료 쿠폰같은것을 받을 수도 있으니 이것을 활용해서 다양한 실험을 해보아도 좋다.

예시코드를 업로드하기 위해서는 당연히 예시코드도 다운로드 받아야 한다. 다음의 Github Repository에 접속해서 소스코드를 다운로드 받자. 이 예시코드는 Google Email, password를 필요로 하는데, Gmail을 통해 메일을 발송하기 때문에 필요하다. 내 계정을 쓰는 것이 찜찜하다면 Google ID를 새로 만들어서 쓰자.

앞으로 우리가 하나씩 할 단계는 다음과 같다.

  1. Amazon Instance 만들고 Lambda에 올릴 소스코드 준비하기
  2. Lambda 만들고, 테스트 실행을 통해 Python script가 제대로 실행되나 확인하기
  3. 스케쥴러를 통해 매 시간 Lambda Function을 실행하도록 설정하기

이제 시작하도록 하겠다.

1. Amazon Instance 만들고 Lambda에 올릴 소스코드 준비하기

AWS Lambda가 Python3를 지원해서 그냥 소스코드를 올리면 좋으련만, 2017년 2월 기준으로도 아직 지원하지 않는다. 하지만 다행히도 Python3로 작성한 프로그램은 약간의 우회 방법을 써서 돌릴 수 있다는 것이 알려져있으므로 이 과정을 설명하려고 한다.

우리가 하고자 하는 것은 Lambda Function 을 통해 Python2로 작성된 보조 프로그램 lambda.py를 실행시킨다. 그러면 lambda.py는 Python3를 이용해서 평소 우리가 검정화면 (CLI) 에 다음과 같은 명령 python3 myrobot.py [arguments] 을 쳐서 실행하듯이 우리가 원하는 스크립트를 실행시켜준다.

이를 위해 우리는 소스코드에 Python3 기반의 VirtualEnv를 구성할 것이고 이것을 통채로 Lambda 소스코드로 업로드할 것이다.

VirtualEnv를 구성하고 소스코드를 올리기 위해서는 동일한 환경 (리눅스, 파일의 실행 경로)을 준비하는 것이 필요하다. 간단하게 생각하면 “내 컴퓨터에서 잘 돌아가는 피카추배구.exe 프로그램은 내 친구 컴퓨터에서도 잘 돌아갈 것이다. 왜냐하면 똑같은 윈도우 컴퓨터니까.”와 같은 논리다.

Lambda가 실행될 때 순간적으로 할당되는 컴퓨터도 결국은 AWS EC2 Instance이다. 여기에서 잘 돌아가는 프로그램을 준비하면 그대로 옮겼을 때 Lambda에서도 잘 돌아갈 거라고 생각할 수 있다. (그리고 필자가 직접 실행해서 확인해보았다.)

이제 실제로 시작해보자. EC2 Instance를 하나 할당해서 우리가 업로드할 소스코드를 준비할 리눅스 서버를 만들 것이다.

잠깐! 서버 없이 하는법을 알려준다면서 서버를 만들겠다고?

여러분은 서버라고 해서 너무 걱정할 것 없다. 아래에 설명된 방법만 차근차근 따라하면 원하는 바를 이룰 수 있고, 그 이후에는 이 컴퓨터를 버려버릴것이기 때문이다. 이렇게 필요한 작업만을 위해 컴퓨터를 할당하고, 버리는 것이 클라우드 컴퓨팅의 장점이다. 그럼 이제 소스코드 준비용 리눅스 서버를 만들어보자.

먼저 클라우드 자원을 관리할 수 있는 콘솔에 접속한다. https://console.aws.amazon.com/

 

여기에서 Compute 밑에 위치한 EC2를 클릭한다.

 

여기에서는 왼쪽에 Instances를 클릭한다.

 

여기에 필자는 이미 2개의 인스턴스를 가지고 있다. 하지만 여러분은 아무것도 없을테니 새로 만드는 것을 보여주겠다. 왼쪽에 파란 Launch Instance를 누른다.

 

여기에서 중요한 것은 Amazon Linux AMI 라고 써진 항목을 Select하는 것이다. 지금은 가장 상위에 떴기에 선택하면 되지만, 아래에 있을 수도 있으니 스크롤바를 움직여서 Amazon Linux AMI 찾아서 선택하자.

 

다음 화면에서는 어떤 성능의 컴퓨터를 쓸지 고르는건데 처음 회원가입 시 무료쿠폰을 받았다면 Free tier eligible이 표시되있는 t2.micro type을 선택한다. 무료쿠폰이 없더라도 잠깐 쓰고 없앨 것이기 때문에 100원도 과금되지 않을 것이다. 화면 아래에 위치한 Review and Launch라고 써진 파란색 버튼을 눌러 검토화면으로 넘어간다.

 

검토화면에서 확인할 것은 AMI Detail에 Amazon Linux AMI라고 되어있는가와 Instance Type이 t2.micro 또는 t2.nano인가이다. 이 두개는 잠깐 써도 몇백원 수준의 과금이 일어나지만, 혹시 엄청난 사양의 컴퓨터를 사용했다면 몇천원에서 몇만원까지고 과금될 수 있으니 주의하여야한다. 확인을 완료했다면 우측 하단의 Launch라고 적힌 파란색 버튼을 클릭한다.

 

Key를 만들라는 창이 뜨는데, 이 Key는 지금 만든 서버에 Key를 통해 접속하는데에 쓰인다. (서버에 들어가는 현관문 열쇠라고 생각하면 된다.) ID/Password를 입력하는 방식보다 더 강력한 수준의 보안을 제공하니 키를 만들어서 진행한다. key이름은 아무거나 진행해도 되지만, 여기에서는 lambda_prep_server 라는 이름을 사용하겠다.  이름 입력 후 Download Key Pair 버튼을 클릭하면 lambda_prep_server.pem파일이 다운로드 된다. 이것을 잘 보관하고 있자. 곧 서버를 접속할 때 사용된다. 마지막으로 Launch Instances라고 써진 파란 버튼을 클릭한다. 그러면 잠시 후 Your instances are now launching 이라는 문구가 써진 페이지로 이동되며 아래 우측하단의 View Instances라고 써진 파란 버튼을 눌러서 컴퓨터의 부팅 상태를 확인한다.

 

 

이전에 못보던 새로운 항목의 instance가 추가된 것을 볼 수 있다. 이름을 지정하지 않았으므로 이름은 빈칸이며, 현재 running상태이고 initializing 중임을 알 수 있다. 최대 5분정도 기다리면 initializing이 끝나니, 잠깐 기다리는 동안 다음 작업을 준비한다.

이제 서버컴퓨터는 클라우드에서 만들어진 것이고, 우리는 접속할 준비를 해야한다. 접속 방법은 SSH를 통해 접속하는 건데 익숙한 사람은 알아서 진행하면 되고, 초심자를 위해 여기에 또 단계별로 설명하겠다.  참고글: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html?icmpid=docs_ec2_console

이 글을 읽는 사람은 Windows 운영체제를 사용한다고 가정하고 Putty.exe파일을 다운로드 하겠다. Putty는 Windows에서 리눅스 서버에 접속할 때 가장 널리 쓰이는 프로그램으로써 공식 사이트(http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)에 들어가서 다운로드 받을 수 있다.

 

여기에서 Alternative binary files부분으로 내려가면 실행파일만 따로 받을 수 있다. 우리는 설치하는것도 번거롭고 귀찮으니 최대한 간단하게 필요한 실행파일만 딱 다운로드해서 진행하겠다.

 

putty.exe와 puttygen.exe 두가지를 다운로드 받는다. 32bit, 64bit는 자기 컴퓨터에 맞추어 받으면 된다. (아직도 32bit컴퓨터를 쓰는 사람이 있을까?) 잘 모르겠으면 둘다 다운받고 실행되는것으로 따라하면 된다.

프로그램을 실행하려고 하면 경고가 뜰 수도 있는데 이것은 널리 사용되고, 공식사이트에서 다운로드 받았으므로 일단은 안전하다고 볼 수 있다. (더 안전한 방법을 찾고 싶은 사람은 다른 방식으로 ssh에 접속하는 것을 찾아서 따라하기 바란다. 구글검색 키워드 ssh client)

먼저 puttygen.exe를 실행시킨다. 이것은 우리가 이전에 받은 lambda_prep_server.pem이라는 key파일을 putty에서 사용할 수 있는 형식으로 바꿔준다.

 

Load 버튼을 눌러서 아까 다운받은 lambda_prep_server.pem을 선택하자.

 

나는 Download폴더에 key파일을 저장해두었는데 여기에 너무 많은 파일이 있어서 찾기 힘들 수 있다. 그럴때는 File name부분에 그림과 같이 *.pem 이라고 친 후 Enter를 치면 .pem으로 끝나는 파일만 남는다. lambda_prep_server.pem을 선택하자. 그러면 Successfully imported foreign key 라는 문구가 뜰수도 안뜰 수도 있는데 OK버튼을 눌러준다. 아까 Load버튼 바로 밑에 있었던 Save Private key버튼이 활성화되었다. 이것을 눌러 파일을 저장한다. passphrase 없이 저장하겠냐는 경고가 뜨면 Yes를 눌러주자. 이 key파일을 도난당하지 않는한 충분히 강력한 보안방법이므로 굳이 설정할 필요가 없다. 필자는 바탕화면에 lambda_prep_server.ppk 라는 이름으로 저장하였다. 이제 프로그램을 꺼도 된다. 이제 키도 준비되었으니 서버에 접속을 해보자.

다시 EC2 Instances가 보이는 창을 킨다 .

aws_ec2_connect

여기에 방금 만든 컴퓨터 상태가 initializing에서 2/2 checks… 으로 바뀐것을 볼 수 있다. 이제 부팅이 끝나고 사용 가능한 상태가 되었단 뜻이다. 여기에 마우스를 가져가 오른쪽 버튼을 누르면 검정배경의 창이 뜨고, Connect를 누른다.

ec2_connect_popup

위와 같은 창이 뜨면 우리가 볼 정보는 Public DNS라고 써있는

이다. 이것이 우리가 방금 만든 서버 주소이다. 이제 Key도 준비되었고 접속할 주소도 알았으니 다운받은 putty.exe를 킨다.

putty_main

화면을 키면 Host Name(or IP address)라고 써있는 칸에 우리가 접속할 서버의 주소를 입력한다. 필자는 ec2-54-161-71-81.compute-1.amazonaws.com를 입력하였다. 그리고 우리는 key를 이용해 접속할 것이니 왼쪽의 Connection -> SSH -> Auth 를 눌러준다.

putty_auth

아래쪽에 Browse라고 써진 버튼을 눌러서 우리가 아까 바탕화면에 만든 lambda_prep_server.ppk파일을 찾아서 선택하자.

마지막으로 Open을 누르면 서버 접속이 시작된다. 처음 접속하는 경우, 진짜 여기로 접속하는게 맞냐는 Security Alert이 뜨는데 Yes를 눌러준다.

ssh_connect

검정화면에 login-as: 라고 써있으면 여기에 ec2-user 라고 입력 후 Enter친다. 접속이 성공하면 위와 같은 화면을 볼 수 있다. 이제 서버 접속도 완료되었다. 서버로 우리가 준비한 소스코드를 옮겨서 Lambda를 위한 준비를 시작해보자.

 

소스코드를 원격서버로 업로드하는데에는 여러가지 방법이 있지만, 우리에게 가장 편리한 방법은 FTP Client를 이용하는 것이다. 이것이 기존에 탐색기에서 파일을 옮길 때 느낌과 가장 비슷하다. 우선 FTP Client를 다운로드 받자. 필자는 FileZilla라는 프로그램을 사용하겠다. https://filezilla-project.org/ 에 접속하면 메인에 위치한 Download FileZilla Client를 눌러서 받는다. 평소에 하듯이 프로그램 설치 후 실행시키면 탐색기와 유사한 화면이 뜬다.

sftp_connect

윈쪽 상단의 File바로 밑에 있는 Site Manager아이콘을 누르면 위와 같은 팝업이 뜬다. 여기에 왼쪽에 위치한 New Site를 만들어 우리의 AWS EC2 Instance의 설정을 기입하자. 여기에선 lambda라는 이름으로 설정을 만들었다. Host에는 위에서 사용한 Public DNS를 입력하고, Protocol은 SFTP, LogonTpye은 Key file, User는 ec2-user, Key File은 바탕화면에 있는 lambda_prep_server.ppk 찾아 선택 후 Connect를 누른다.

 

sftp_copy

https://github.com/insikk/aws-lambda-scheduled-python3-script에 접속해서 clone or download라고 적힌 초록색 버튼을 눌러서 압축을 풀면 소스코드가 나온다. 위 사이트에 나오는 설명대로 소스코드를 실행가능하게 myrobot.py를 수정해서 준비해두어야 한다.

필자는 바탕화면에 준비된 소스코드가 담긴 폴더 lambda_example을 마우스로 끌어다가 Remote Site라고 써진 곳의 위치에 가져다 놓는다.

조금 기다리면 복사가 완료된다. 다시 putty.exe 창으로 돌아와서 진짜 복사가 되었는지 확인하자. 검정색 화면에 ls를 입력해본다.

ssh_ls

lambda_example 디렉토리가 생긴것을 확인했고, cd명령을 통해 그 내부도 들어가보니 역시 모든 파일이 제대로 복사되었다. 이제 다음 명령을 순서대로 실행한다.

파이썬 설치

sudo yum install python34

Is this ok? 질문이 나오면 y를 누르고 엔터.

 

업로드할 소스코드 준비하기

pwd를 입력해 내 현재 위치가 /home/ec2-user/lambda_example인지 확인하고, mkdir deploy를 입력해 deploy할 결과물이 저장될 디렉토리를 만든다.

make 를 쳐서 업로드할 소스코드를 만들자.

sftp_result_back

뭔가 막 실행되고 최종적으로 deploy폴더 안에 python3_crawl.zip파일이 만들어졌을 것이다. 그러면 이제 준비가 끝난 것이다. 이것을 내 컴퓨터로 복사하기 위해 다시 FileZilla를 켜서 바탕화면으로 끌어 복사하자.

2. Lambda 만들고, 테스트 실행을 통해 Python script가 제대로 실행되나 확인하기

이제 우리는 Lambda에 올릴 코드인 python3_crawl.zip가 준비되어있다. AWS Console에 들어가 Lambda를 새로 만들자.

https://console.aws.amazon.com/

aws_console

여기에서 Compute 밑에 위치한 Lambda를 클릭한다.

lambda_console

필자는 지금 여러개의 lambda function을 가지고 있지만, 여러분은 아무것도 없을 수 있다. 여러분을 위해 새로 만드는 과정을 보여주겠다. 먼저 왼쪽 상단의 Create a Lambda function 파란 버튼을 클릭한다.

create_canary

blueprint를 선택하라는 곳에서 lambda-canary를 선택하기 위해 canary라고 검색하였다. lambda-canary항목 아래에 python2.7이라고 써진 것을 확인 후 클릭한다.

lambda_trigger

여기에서는 매 간격마다 이벤트를 발생시키기 위해 규칙을 설정하는 창이다. Rule name에 기억하기 쉬운 이름으로 규칙을 만든다. 필자는 CheckEveryInterval이라고 명명하였고, 설명으로는 Check Event on Every Interval에 rate 매 1시간마다로 설정하였다. Enable trigger는 빈칸으로 놔둔 상태로 next 파란버튼을 누른다.

lambda_configure

이제 Lambda함수 설정을 해야하는데, 이름은 myFirstLambda로 하였다. description에 알아보기 쉬운 설명을 적고, runtime은 python2.7임을 확인한다.

Lambda function code는 우리가 위에서 준비한 바탕화면에 있는 python3_crawl.zip을 업로드한다.

밑으로 내리다보면 Lambda function handler and role이 있는데 Handler는 lambda.lambda_handler, Role은 Create new role from template을 선택해 role name에 기억하기 쉽게 입력한다. 필자는 checkPeriodically라고 하였다. 나머지 값들은 있는 그대로 두고 우측 하단의 Next 파란 버튼을 누른다. 그러면 검토화면이 나오고 제대로 되었나 확인 후 우측 하단의 Create function버튼을 누른다.

lambda_function

성공적으로 진행하였다면 위와 같은 화면을 볼 수 있다. 이제 정말 실행이되는지 보기위해 테스트를 진행하자. 위의 파란색 Test 버튼을 누른다.

lambda_test_event

그러면 위와 같은 팝업창이 뜨는데 여기에서 Sample event template이라고 써진 부분에 Hello World를 눌러서 Scheduled Event로 바꿔준다. 우측 하단의 Save and Test를 눌러서 계속 진행한다.

lambda_success

잠시 기다리면 로그 출력에 평소에 스크립트가 정상적으로 실행되면 뜨던 로그가 찍히는 것을 알 수 있다. 성공의 느낌이 온다. 그러면 내 이메일에 들어가서 실제로 이메일이 왔는지 확인해보자.

naver_news

email

스크린샷을 찍는 사이에 디즈니 관련 속보가 하나 더 올라와서 약간의 오차는 존재하지만 무시할 수준이다. 우리의 예상대로 네이버 뉴스 화면을 읽어서 이메일을 보내주는 스크립트가 실행되었다. 그러면 테스트는 끝이다.

3. 스케쥴러를 통해 매 시간 Lambda Function을 실행하도록 설정하기

이제 이메일을 매 시간 보내주도록 설정해보자. 다시 lambda function이 있는 화면을 띄운다.

lambda_schedule

여기에 CheckEveryInterval이라고 되어있고 오른쪽에 Enable이라고 써진 버튼이 보일 것이다. 지금은 테스트를 위해 Disabled(비활성화) 상태이므로 Enable을 눌러서 활성화 시킨다. 이제 설정은 끝났다. 이제 해지되기 전까지는  “매 시간 Naver IT News 속보칸의 기사 목록을 읽어서, 내 이메일로 보낸다” 가 영원히 수행될 것이다. (Amazon이 계속 서비스를 하고, Lambda가 실행될 때마다 과금되는 금액을 지불할 수 있다면)

lambda_schedule_result

1시간 간격으로 계속 이메일이 오는것을 확인할 수 있다.

마무리

본 글에서는 “매 시간 A라는 이벤트가 발생했는지 확인 후, 발생했다면 B라는 이벤트를 발생시켜라” 라는 목표를 달성하기위해 서버없이 AWS Lambda를 통해 구현하는 방법을 소개하였다. A에는 Naver IT News 속보칸의 기사 목록을 읽기, B에는 내 이메일로 보내기라는 실제 예시를 적용하여 살펴보았지만, 프로그래밍을 배운 분들이라면 A, B에 내가 원하는 코드를 집어넣으면 무엇이든지 만들 수 있다는 것을 알 수 있을 것이다.

본 글의 설명과 첨부된 소스코드를 통해서 컴퓨터를 잘 모르는 분들도, 조금만 변형해서 응용한다면 많은 재미있는 프로젝트들을 만들어 볼 수 있을 것이라고 기대된다.

안쓰는 클라우드 자원을 꺼서 돈을 절약하자

지금 AWS Console을 들어가면 EC2 Instance가 떠 있을 것이다. 이것을 중지하거나 삭제해야지 돈이 더이상 나가지 않는다.

ec2_terminate

중지(stop)는 일시 중지 개념이며, 나중에 동일한 server가 다시 필요할 것 같으면 중지시켜놓음으로써 EC2 비용은 지불하지 않고, 저장공간(S3)에 대한 비용만 지불하면 언제든 다시 그 상태로 불러올 수 있다.

중지안하면 t2.micro instance의 경우 한달에 1.5만원~2만원 정도 과금될 수 있다.

종료(terminate)는 앞으로 영원히 안 쓸 생각으로 종료하는 것이며, 여기에 연결된 저장공간(S3) 또한 자동으로 소멸된다. 이렇게 되면 아예 요금이 과금되지 않는다.

현재 Lambda도 매 요청마다 과금이 이루어지므로 사용하지 않는다면 Disable시켜두는것이 좋다. 가격은 100ms 마다 $0.000000208가 과금된다. 요청 하나에 4500ms정도 걸리는 것 같다. 단순히 계산하면 하루에 24번 요청 * 31일 기준으로 한달에 대략 $0.007 과금된다고 생각하면 된다. 10원 정도 나오려나.

잘못된 부분이나 궁금한 부분이 있다면 댓글로 달아주세요

참고자료

AWS 공식문서

http://www.cloudtrek.com.au/blog/running-python-3-on-aws-lambda/

https://github.com/insikk/aws-lambda-scheduled-python3-script

Leave a Reply