AWS는 신이고 Lambda는 무적이다
AWS Lambda는 서버 없이 (serverless) 웹 서비스를 제공할 수 있다.
Lambda 함수의 실행 시간과 용량만으로 요금이 나오므로(등록해놓고 사용 하지않으면 비용도 발생하지 않는다), 이 글처럼 트래픽이 없다시피 한 서비스는 무료에 가까운 금액으로 동작시킬 수 있다.
AWS 접속 후 관리 콘솔로 이동한다.
여기서 잠깐
AWS 국가 설정을 먼저 확인해야 한다. 최초 가입 시 미국 쪽 서버로 연결되어 있는 경우가 있는데, 먼 거리의 서버를 사용할 경우 속도가 느려진다. 상황에 맞는 지역을 선택해야 한다.
검색창에 Lambda를 검색한다.
함수 생성
을 눌러 새 Lambda 함수를 생성한다.
함수 이름은 규칙에 맞게 원하는 대로 짓고, 런타임은 python을 선택한다.
이 글에서는 python으로 제작하였는데, goㆍjavaㆍRubyㆍnodejsㆍ.NET Core도 지원하므로 다른 언어로 만들고 싶다면 해당 언어를 선택한다.
몇 초 정도 기다리면 함수가 생성된다.
생성되면 아래와 같이 초기화 된다.
아래 주소로 가서 예제를 다운로드 해보자.
오른쪽 Code
버튼을 눌러보자.
그러면 아래처럼 몇 가지 선택지가 나오는데, AWS Lambda에 업로드 하기위해서 Download ZIP
을 눌러 zip 파일로 다운받는다.
다운이 잘 되었다.
다시 AWS로 돌아가서 에서 업로드
목록에서 .zip파일
을 클릭한다.
왼쪽의 업로드
버튼으로 다운받은 zip파일을 선택하고, 저장
버튼을 누른다.
만약 10MB가 넘는 파일은 적혀있는대로 AWS S3를 이용하거나, 도커 기반의 AWS ECR을 이용해야 한다. ECR은 무려 10GB까지 지원한다.
참고자료 : https://aws.amazon.com/ko/blogs/korea/new-for-aws-lambda-container-image-support/
업로드가 완료되면 zip 안의 파일들이 표시된다. 그런데 빨간색 파일들은 최상위 폴더에 있어야 하므로 옮겨줘야 한다.
AWS Lambda는 각 런타임 별 실행 규칙을 갖고있다.
런타임이 python인 경우, lambda를 실행시키면 최상위 폴더에 있는 lambda_function.py를 찾고 그 내부의 lambda_handler 함수를 호출한다. 만약 해당 파일이 없거나, 함수가 없다면 정상 동작하지 않는다.
런타임이 node.js인 경우 최상위 폴더 index.js 파일 내부의 exports.handler를 호출한다.
직접 드래그해서 옮겨주면 된다. 옮기고 난 뒤 random-cleaning-duty-to-slack-main
폴더는 삭제해도 되고 안해도 된다.
까먹고
Deploy
버튼을 누르지 않아 아래에 있는 이미지들은 변경 사항이 저장되지 않았다고 표시되어있다.
함수에 변경 사항이 있을 때 마다 항상Deploy
를 눌러 변경 사항을 저장해주어야 한다.
lambda_function.py를 더블 클릭 해보면 실행할 코드를 볼 수 있다.
구성
으로 가보자.
왼쪽 메뉴판에서 환경 변수
카테고리에 가보면 등록한 환경 변수를 볼 수 있다.
아직은 아무것도 없다. 편집
을 클릭하자.
여기서 환경 변수를 등록ㆍ수정ㆍ삭제 할 수 있다.
환경 변수 추가
로 필요한 환경 변수들을 등록한다.
일단 'MEMBERS'를 등록해보자.
코스피4000기원
멍하니 따라 하다가 원래 뭐 하려 했는지 까먹었을 수도 있는데, 청소 당번 정하려했다.
키에 MEMBERS를 입력하고, 값에는 청소 당번 멤버들 이름을 쉼표로 끊어서 넣어주면 된다.
그리고 SLACK_TOKEN과 SLACK_CHANNEL을 등록해줘야 한다.
일단 SLACK_TOKEN을 찾기 위해 1편에서 만들었던 슬랙 봇으로 다시 가보자.
OAuth & Permissions
카테고리에서 Bot User OAuth Token
을 확인 할 수 있다.
Copy
를 눌러 복사하고, 위에서 처럼 "SLACK_TOKEN"을 키에 넣고 값에 Token 값을 붙여넣기한다.
SLACK_CHANNEL은 슬랙에서 확인해야 한다. 메세지를 보내려는 채널을 우클릭 하고, 채널 세부정보를 연다.
세부정보 아래에 보면 채널 ID가 나와있다.
빨간색 박스가 되어있는 곳을 클릭하면 복사가 된다.
그리고 똑같이 "SLACK_CHANNEL"을 키에, 복사한 내용을 값에 넣어준다.
환경 변수 3가지를 잘 입력했다. 저장해주자.
2 ~ 6 : 실행에 필요한 라이브러리들을 호출한다.
8 : 환경 변수 중 'SLACK_TOKEN'를 가져와서 token 값으로 설정하고 WebClient 객체를 생성한다. 이 객체를 client라는 이름으로 지정한다.
9 : 환경 변수 중 'MEMBERS'를 가져와서 쉼표 단위로 분할하고 이것을 duty_member_list라는 이름으로 지정한다.
11 ~ 19 : try-except문으로 try 내부 코드를 실행하고, 예외(오류) 발생 시 실행을 멈추고 except 내용을 실행한다.
12 ~ 15 : client에 chat_postMessage 함수를 이용해 슬랙에 메세지를 날린다. 보낼 channel은 환경 변수의 'SLACK_CHANNEL' 값을 가져오고, 보낼 내용은 duty_member_list 중 랜덤하게 한명을 뽑는다. 보낸 후 리턴 값을 response 변수에 저장한다.
19 : 에러 발생 시 에러 내용을 확인한다.
이제 AWS Lambda도 다 만들었다. 이제 동작시키러 가보자.