AWS LambdaでGOできないかなと思ったらあったので使ってみます。
実施環境はWindows10です。
まずはLambdaにアクセスして新しい関数を作ります。
Go.1.xがあるのでそれを選びます。
今回はテストなので他のサービスを使わないロールで作成。
node.jsのようなインライン編集はなく、ZIPを作る必要があります。
ちなみに何も変更せずにテストすると成功しました。
デフォルトでなにか入ってそう。
ここからZIPを作成します。
後の説明のためにサンプルからちょっと関数名を変えて書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import ( "fmt" "context" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"name"` } func tes(ctx context.Context, name MyEvent) (string, error) { return fmt.Sprintf("Hello %s!", name.Name ), nil } func main() { lambda.Start(tes) } |
Lambda(Linux:Amazon Linux64bit[参考元])で動くようにクロスコンパイル。
1 |
env GOOS=linux GOARCH=amd64 go build lambdaTest.go |
Windowsでのzip化はbuild-lambda-zipの使用が推奨されています。
1 2 |
go get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip build-lambda-zip -o lalala.zip lambdaTest |
私の環境では普通にZIP化する方法(送る→ZIP、圧縮ソフト)でエラーが出ました。
“errorMessage”: “fork/exec /var/task/lambdaTest: permission denied”, “errorType”: “PathError”
}
現在関数名がtest()、バイナリがlambdaTest、ZIP名がlalalaです。
ハンドラに設定するのはバイナリ名(実行ファイル名)です。
他を指定してもエラーになります。
“errorMessage”: “fork/exec /var/task/lambdaTest: no such file or directory”,
“errorType”: “PathError”
}
Lambdaを使ったことのある人ならI/Oに注意すればサーバーで処理しているものを置き換えるのも簡単そうです。
node.jsを書ける人にとってわざわざgoを使う理由がどれくらいあるかは微妙だけど、処理速度を上げて省メモリでLambdaを使えると考えればいいのかもしれない。
何か新しく定期処理とかAPIを思いついたら実運用まで試してみたい。