AWS Sam with Golang
AWS Lambda 를 작성하는 방법, 정확하게는 Serverless 의 API 를 작성하는 방법으로 SAM 을 사용한다. 그런데, SAM 을 이용해서 Runtime 을 Golang 으로 하려고 할 경우에 잘 안되는 경우가 발생한다. 2023년 말에 변화가 있었다.
이 문서는 위 문서의 내용을 요약한 것이다.
Error: There are no Template options available to be selected.
SAM 명령어를 이용해 Golang 런타임으로 생성할려고 하면 다음과 같이 오류가 발생한다.
1 2 3 4 5 6 |
]$ sam init --runtime go1.x Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Error: There are no Template options available to be selected. |
SAM 명령어에 옵션으로 –runtime go1.x 를 지정하면 위와같은 오류가 발생한다. AWS 공식문서에 따르면 이제 go1.x 는 없어졌다. 대신에 provided.al2 를 사용해야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
]$ sam init --runtime provided.al2 Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example 2 - Infrastructure event management 3 - Multi-step workflow 4 - Lambda Response Streaming 5 - DynamoDB Example Template: 1 Which runtime would you like to use? 1 - go (provided.al2) 2 - graalvm.java11 (provided.al2) 3 - graalvm.java17 (provided.al2) 4 - rust (provided.al2) Runtime: 1 |
Template.yml 파일 변화
–runtime 옵션에 provided.al2 를 사용하면 template.yml 파일에도 변화가 생긴다.
1 2 3 4 5 6 7 |
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Metadata: BuildMethod: go1.x Properties: CodeUri: hello-world/ Handler: bootstrap Runtime: provided.al2 |
Metadata 가 추가 된다. Runtime 이야 옵션으로 제공한 그대로 인데, Handler 가 bootstrap 이다. 이것을 바꿔서는 안된다. 또, Runtime 을 provided.al2 로 할 경우에 Lambda 의 Go 바이너리 실행 파일의 이름은 반드시 bootstrap 이여야 한다.
실행파일 이름은 반드시 bootstrap
Golang 의 람다 실행파일은 반드시 bootstrap 이어야 한다. 따라서 다음과 같이 컴파일해야 한다.
1 |
]$ GOARCH=amd64 GOOS=linux go build -o bootstrap main.go |
bootstrap 이 아닌 경우에는 실행되지 않는다.
-tags lambda.norpc 빌드 옵션 추가
bootstrap 바이너리를 빌드할때에는 반드시 -tags lambda.norpc 를 주어야 한다. AWS 공식 문서에 따르면 go1.x 에서는 필요했지만 provided.al2 로 런타임이 변경되면서 rpc 가 필요 없어졌다고 한다. 따라서 빌드할때에는 반드시 norpc 가 되도록 옵션을 지정해 줘야 한다.
1 |
]$ GOARCH=amd64 GOOS=linux go build -tags lambda.norpc -o bootstrap main.go |
변경사항이 많지는 않지만 위에 서술한 옵션들을 지키지 않을 경우에 문제가 된다. 실행파일 이름과 norpc 는 반드시 해줘야 하며 template.yml 에서도 필요한 내용이 있어야 한다. 그렇지 않으면 별것도 아닌 것으로 인해서 많은 시간을 허비하게 될 것이다.