omuronの備忘録

個人的な備忘録

Lambda で Go のめっちゃ基礎

最近はインフラエンジニアな仕事しているから YAML ばっかり書いてて、すっかりプログラム書かなくなって久しいです。
ちょっと Lambda で遊ぼうとして「せっかくなら Go で書くか」ということで、チュートリアル終わらせるのにも思い出すこと多かったので備忘録を残します。

GitHub

github.com

この 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 で作成。

f:id:omron:20211021113507p:plain

「コード」タブの「コードソース」-「アップロード元」-「.zip ファイル」から、main.zip をアップロード。
SHA256 ハッシュが正しいか確認。

f:id:omron:20211021113523p:plain

「テスト」タブの「テスト」をそのまま実行して確認すると、見事にエラーがでましたね。

{
  "errorMessage": "fork/exec /var/task/hello: no such file or directory",
  "errorType": "PathError"
}

hello が無いから実行できないようです。

対応策その1

f:id:omron:20211021113550p:plain

「コード」タブの「ランタイム設定」がデフォルトで 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 通りに動かしたはずなのに初回エラーになって少し悩んでしまったりしたので、忘れないためにメモっておきます。