Go + API Gateway + Lambda + serverless framework で Hello World

※AWSアカウント作って、aws-cli をインストールして、aws コマンドでログインしておく

aws --version
aws-cli/1.17.0 Python/3.8.1 Darwin/18.7.0 botocore/1.14.0

準備

Goインストール。

$ brew install go

Lambda 用の Go パッケージをインストール。

$ go get github.com/aws/aws-lambda-go/lambda

serverless framework インストール。

$ npm install serverless -g

テンプレート作成、デプロイなどは sls コマンドを利用するので、slsコマンドで作ったらいいです。

$ serverless create -u https://github.com/serverless/serverless-golang/ -p hello-go-lambda
or
$ sls create -u https://github.com/serverless/serverless-golang/ -p hello-go-lambda

hello-go-lambda ができています。

$ ls
hello-go-lambda

Lamdba作成

作成されたテンプレートを見ていきましょう。

$ cd hello-go-lambda
$ ls
README.md bin main.go serverless.yml

main.go が lambda にアップされるプログラムですね。

$ cat main.go
package main
import (
"github.com/aws/aws-lambda-go/lambda"
)
type Response struct {
Message string `json:"message"`
}
func Handler() (Response, error) {
return Response{
Message: "Go Serverless v1.0! Your function executed successfully!",
}, nil
}
func main() {
lambda.Start(Handler)
}

ビルドします。利用環境の Lamdba は Linux なので GOOS に指定。

GOOS=linux go build -o bin/main

bin配下に main コマンドができています。

$ ls bin
main

serverless framework の設定ファイルを修正します。リージョンを変更。

vi serverless.yml

# you can overwrite defaults here
#  stage: dev
#  region: us-east-1
stage: dev
ap-northeast-1

デプロイ、api keys は一旦なし、エンドポイントもつけていません。

$ sls deploy
Serverless: Packaging service…
Serverless: Excluding development dependencies…
Serverless: Creating Stack…
Serverless: Checking Stack create progress…
……..
Serverless: Stack create finished…
Serverless: Uploading CloudFormation file to S3…
Serverless: Uploading artifacts…
Serverless: Uploading service hello-go-lambda.zip file to S3 (5.11 MB)…
Serverless: Validating template…
Serverless: Updating Stack…
Serverless: Checking Stack update progress…
……………
Serverless: Stack update finished…
Service Information
service: hello-go-lambda
stage: dev
region: ap-northeast-1
stack: hello-go-lambda-dev
resources: 6
api keys:
None
endpoints:
None
functions:
hello: hello-go-lambda-dev-hello
layers:
None
Serverless: Run the “serverless” command to setup monitoring, troubleshooting and testing.

Lambda を無事に呼び出せました。

$ sls invoke -f hello
{
“message”: “Go Serverless v1.0! Your function executed successfully!”
}

AWS コンソールから Lambda の関数を確認すると増えています。

API Gateway 作成

curl 経由で Lambda を呼び出せるよう、API Gateway を設定します。

serverless.yml の functions を以下のように修正します。

functions:
hello:
handler: bin/main
events:
- http:
path: hello
method: get
integration: lambda

デプロイします。今度はエンドポイントが追加されましたね

$ sls deploy
………………..
Serverless: Stack update finished…
Service Information
service: hello-go-lambda
stage: dev
region: ap-northeast-1
stack: hello-go-lambda-dev
resources: 11
api keys:
None
endpoints:
GET – https://<エンドポイント>.execute-api.ap-northeast-1.amazonaws.com/dev/hello
functions:
hello: hello-go-lambda-dev-hello
layers:
None
Serverless: Run the “serverless” command to setup monitoring, troubleshooting and testing.

curl 経由で Lambda が呼び出せることを確認できました。

$ curl  https://qvribueqyh.execute-api.ap-northeast-1.amazonaws.com/dev/hello
{"message":"Go Serverless v1.0! Your function executed successfully!"}

AWS コンソール上にも新規に登録されています。

serverless framework すごい便利ですね!

{“message”: “Internal server error”}

API GatewayのLambda統合で嵌った話

こちらの記事で解決できました。

こう行ったエラーが出て response が 502 になっている!

Sun Feb 09 06:32:29 UTC 2020 : Received response. Status: 200, Integration latency: 34 ms
Sun Feb 09 06:32:29 UTC 2020 : Endpoint response headers: {Date=Sun, 09 Feb 2020 06:32:29 GMT, Content-Type=application/json, Content-Length=70, Connection=keep-alive, x-amzn-RequestId=e1b0d3aa-6469-45e3-a022-e82a133d0827, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-5e3fa77d-0865a231cb35236ab084a6f0;sampled=0}
Sun Feb 09 06:32:29 UTC 2020 : Endpoint response body before transformations: {"message":"Go Serverless v1.0! Your function executed successfully!"}
Sun Feb 09 06:32:29 UTC 2020 : Execution failed due to configuration error: Malformed Lambda proxy response
Sun Feb 09 06:32:29 UTC 2020 : Method completed with status: 502

serverless.yml に integration: lambda をつけて解決しました。

参考

Serverless Framework(Go) でHello worldしてみる

Serverless Framework でHello world

API, AWS, Go

Posted by さいき