본문 바로가기
자습

Go 코드를 AWS Lambda에서 실행해보기

by litaro 2020. 12. 31.

Go를 공부할때 누구나 시작하는 tour.golang.org/welcome/1 예제를 하나씩 따라가면 마지막 문제가 바로 Web Crawler이다. 예제는 fake data로 하는 것인데. 갑자기 진짜는 어떻게 해야하는지 궁금해졌다.

문제는 난 Web Crawler가 정확히 뭔지 모른다는 것이다. ㅠㅠ 부끄럽...

좀 찾아보니 crawling 할 base url의 페이지 가져와서 그 body에서 <a href=...> 링크의 주소들을 다 방문해서 정보를 가져오는 것이란다. 사실 성능좋은 open Go web crawler module 이 이미 있다. 하지만 난 공부하는 단계이니 일단 예제처럼 초보수준의 depth 별 url리스트만 실제로 가져오는 코드를 구현해보자. 검색하면 참조할 코드들이 많이 있다.

복잡한 코드들이라 내가 이해한 수준으로 가다듬어서 go module 을 올렸다. github.com/ryulitaro/crawler 그리고 이것을 AWS Lambda에 올려서 돌려보자

AWS 가이드 : docs.aws.amazon.com/lambda/latest/dg/lambda-golang.html

Lambda에서 내 코드를 실행 위한 main 함수 구현

  • Go가 lambda에서 실행되도록 구현한 module 인 aws-lambda-go module을 받는다.
    • imort "github.com/aws/aws-lambda-go/lambda"
  • main package의 main 함수에 lambda.Start(HandleRequest)
    • input 이 단순 string 인 경우: HandleRequest(ctx context.Context, name MyEvent) (string, error) {}
    • struct type 의 input 인 경우: HandleLambdaEvent(event MyEvent) (MyResponse, error) {}
  • 보통 input을 json 형태로 받는 것이 편리하니 두번째로 구현.

 

Go는 compile 언어라 당연히 binary 형태로 lambda에 올리게 된다. 그래서 python 시절 AWS console에서 직접 코드를 편집하던 시절이 그립기도 하다. 바로 수정하면서 확인하지 못하니 디버깅이 조금 불편하다.

Lambda에 올릴 Go 실행 파일 빌드

  • linux 빌드해야한다: "GOOS=linux go build main.go"
  • zip 파일 만들기: "zip function.zip main"

Lambda에 코드 올리기

  • AWS Lambda 페이지에 가서 Create Function > Go 1.x 선택해서 기본 lambda 함수 "myWebCrawler" 를 만든다.
  • zip 파일을 cli나 console로 올리기. (난 console 을 선호)
  • 매우 중요한것이~!! 바로 아래 Handler 설정.. : 빌드한 실행파일 이름과 handler 이름이 같아야한다.

Lambda에서 테스트 (with VSCode) 

요즘 Go를 배우면서 주로 VSCode를 사용하는데 AWS extensions를 보다보니 유용한 것이 있다. cli로 할수있지만... 

간단하게 lambda를 invoke 해서 테스트 할수가 있었다.

Summary

  • Go를 실행할 AWS Lambda module 을 import "github.com/aws/aws-lambda-go/lambda"
  • main package의 main 함수에 lambda.Start(HandleRequest) 추가 (struct type 은 HandleLambdaEvent
  • build 는 linux로 "GOOS=linux go build main.go"
  • *.zip 으로 압축하여 올리고 빌드한 실행파일명 (main) 으로 Lambda handler 를 설정