最近はインフラエンジニアな仕事しているから YAML ばっかり書いてて、すっかりプログラム書かなくなって久しいです。
ちょっと Lambda で遊ぼうとして「せっかくなら Go で書くか」ということで、チュートリアル終わらせるのにも思い出すこと多かったので備忘録を残します。
GitHub
この README のサンプルを動かすだけです。
開発環境
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H1419 $ go version go version go1.17 darwin/amd64
Getting Started
作業ディレクトリ作って、main.go
ファイル作成して、ソースをコピペ。
$ mkdir sample && cd sample $ touch main.go
go mod init
で初期化して、go get
で module 取得。
Go のバージョン上げて、この辺りのお作法が変わってたので調べるところからでした。
$ go mod init sample go: creating new go.mod: module sample go: to add module requirements and sums: go mod tidy $ go get -u github.com/aws/aws-lambda-go/lambda go get: added github.com/aws/aws-lambda-go v1.27.0
Building your function
ビルドして圧縮して、sha256 ハッシュ値確認。
$ GOOS=linux GOARCH=amd64 go build -o main main.go $ zip main.zip main adding: main (deflated 47%) $ shasum -a 256 main.zip | awk '{print $1}' | xxd -r -p | base64 MQAIpPIIhoWIxBdTk1sv0x9hIxUZ29Qn4MBap+cFwUg=
Lambda 作成と確認
sample
の Lambda を、ランタイム Go 1.x
で作成。
「コード」タブの「コードソース」-「アップロード元」-「.zip ファイル」から、main.zip
をアップロード。
SHA256 ハッシュが正しいか確認。
「テスト」タブの「テスト」をそのまま実行して確認すると、見事にエラーがでましたね。
{ "errorMessage": "fork/exec /var/task/hello: no such file or directory", "errorType": "PathError" }
hello
が無いから実行できないようです。
対応策その1
「コード」タブの「ランタイム設定」がデフォルトで hello
になっているので、main
に修正して再度テストしてみます。
そうすると無事成功しました。
"Hello ƛ!"
対応策その2
「コード」タブの「ランタイム設定」がデフォルトで hello
になっているのでここは直さずに、バイナリを hello
で作ります。
$ GOOS=linux GOARCH=amd64 go build -o hello main.go $ zip hello.zip hello adding: hello (deflated 47%)
再度アップロードして試すと、こちらでも成功しました。
バイナリはファイル名が違うだけで中身は同じなのに、圧縮するとサイズが倍ぐらい違ってるのが気になってしまった。
ファイル名だけなのにここまで圧縮率変わるんだ。
$ shasum -a 256 main | awk '{print $1}' | xxd -r -p | base64 dEvHQRrM2vEsi2cH0ghONFIHIUl6KnztHLAA6bNARbA= $ shasum -a 256 hello | awk '{print $1}' | xxd -r -p | base64 dEvHQRrM2vEsi2cH0ghONFIHIUl6KnztHLAA6bNARbA= $ ls -la *.zip -rw-r--r-- 1 omuron staff 4446178 10 21 21:24 hello.zip -rw-r--r-- 1 omuron staff 8892332 10 21 21:23 main.zip
さいごに
Go のバージョン上げて、モジュールの管理方法とかが変わったから「初期化どうするんだっけ?」とか、README 通りに動かしたはずなのに初回エラーになって少し悩んでしまったりしたので、忘れないためにメモっておきます。