Windows環境でAWS Lambdaで動くGolangのZIPを作る
#Golang #Windows #AWS #Lambda
AWS LambdaのQiita記事とかをみてると、Node.jsで書かれているものがほとんどで、たまにPythonで書いてる人がおるんかなーくらいの感じですね。
C#とかRubyの記事はほとんど見ませんが、同じくらいGolangの記事も見かけない気がします。
Golangの記事を見つけた!と思っても、だいたいMacOSが前提だったりして、なんかなーって思うこともしばしば。
ってことで、備忘もかねて、Windows環境でGolangのZIPを作る手順のメモを残しておきます。
ついでに、Gatewayとの兼ね合いのあたりも書けたらなーと思ってます。
環境
Windows 10 Pro
Golang 1.12
ソースコード編
以下の定義に従っている必要があります。
packageはmainにする
エントリーポイントとしてmain関数を用意する
main関数内では lambda.Start() を呼び、Startの引数にリクエストを操作する処理を書く
ビルド時には github.com/aws/aws-lambda-go/lambda をパッケージに含んでおく
詳しくはここに書いてます。
Go の AWS Lambda 関数ハンドラー - AWS Lambda
これに加えて、API Gatewayからのリクエストを処理する場合は、下記にも従っている必要があります。
リクエストを処理する関数の引数は、events.APIGatewayProxyRequest
リクエストを処理する関数の戻り値は(events.APIGatewayProxyResponse, error)
ほかにもAuthorizationとか、いくつかるみたいですけど、それは必要に応じて調べてみてください。
eventsパッケージは、github.com/aws/aws-lambda-go/events なので、go get github.com/aws/aws-lambda-goしておけばどうにかなると思います。
リクエストの本文は、events.APIGatewayProxyRequest.Bodyにあります。jsonで来ることが分かっているのであれば、適当なstructにマッピングしてあげるといいと思います。
もしかしたらもっといい方法があるかもしれませんが、HTTPリクエストのbodyを取り出す方法でぱっと見つかったのはそれでした。
レスポンスの形は、ヘッダーを気にしないのであれば、
code:golang
events.APIGatewayProxyResponse{
StatusCode: http.StatusOK,
Body: "Success",
}
こんなかんじ。
StatusCodeを明示的に返さないと、API Gatewayは502を返してしまいます。
この辺を踏まえると、こんな感じになります。
ビルドとZIP化
Lambdaにアップロードするには、go buildで作られたバイナリファイルを含む、ZIPファイルにしておく必要があります。
ここに罠があります。
Windowsで普通にバイナリを作るとexeファイルになる
Windowsで普通にZIPを作ると、Permissionがない
Linuxとしてビルドする
まず、普通にbuildするとこんな感じです。
go build main.go
ですが、これだとexeファイルになってしまうので、linuxとしてビルドします
GOOS=linux go build main.go
さらに、エントリーポイントとしてのバイナリファイルを明示的に指定する必要があるので、分かりやすい名前でビルドします。
GOOS=linux go build -o HOGEHOGE main.go
ってことで、GOOS=linux go build -o HOGEHOGE main.goな感じでビルドすれば、まず第一ステップはOKです。
ZIPファイルを生成する
Linux系やUnix系OSであればPermissionを変更できますが、WindowsのPermissionはそれらとは違います。
なので、WindowsでそのままZIPを作ったとしても、適切な実行権限が与えられず、Permission deniedで怒られます。
これらを解決してくれるのが、build-lambda-zipです。
build-lambda-zipはgo getで取得できます。
go get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip
あとは、build-lambda-zipに放り込むだけで、いい感じにやってくれます。
build-lambda-zip.exe -o HOGEHOGE.zip HOGEHOGE
これで吐き出されたZIPをLambdaにアップロードすれば完了です!!
zipに関してはここに書いています。
Go の AWS Lambda デプロイパッケージ - AWS Lambda
おわりに
LambdaでGolangで使う方法や、WindowsでZIP圧縮する方法、API Gatewayと連携する方法など、必要な情報が散在していて探すのにほんと苦労します。
この辺をまとめているサイトや記事があるわけでもないので、ぐぐりまくってなんとか到達できるといった感じでした。
この記事がGoogleのインデックスに登録されることはないと思いますが、誰かの助けになれればいいなーと思います。
最終更新日 : 2019/08/13