Lambda x Apexで、Goで書いたラムダ関数を楽に動かす
業務でAmazonLambdaを使う機会があり、Apex(Go)を試していい感じだったのでその紹介とハマりポイントを幾つか紹介しようかと。
導入
すごく簡単で、 https://github.com/apex/apex#installation に書いてある通りインストールして apex init
で対話式でプロジェクト名とか入力するだけです。
ExampleのGo実装をそのままコピって apex deploy
すれば速攻でdeployも出来ます。
exampleはこちら -> https://github.com/apex/apex/tree/master/_examples/go
package main import ( "encoding/json" "github.com/apex/go-apex" ) type message struct { Hello string `json:"hello"` } func main() { apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) { var m message if err := json.Unmarshal(event, &m); err != nil { return nil, err } return m, nil }) }
かなりシンプルに書けて楽です。
概要・Tips
- functions下がラムダ関数と1対1になります
- 下記の例だと
pdf2images
とresizeImage
になります
- 下記の例だと
- GOPATH下にプロジェクトを置けば共通の実装とかをパッケージ化して使いまわせるので便利
- 下記の例だと
resize
パッケージとaws
パッケージ
- 下記の例だと
- glide使ってライブラリ固定もできます
- ちゃんと調べてないんですが、
os.stdout
を呼び出すとNode.js側でエラーになるのでfmt.Print
ではなくlog.Print
を使いましょう - 外部ライブラリも
exec.Commnad
で呼び出せます - 環境変数の変更は
os.Setenv()
を使うとexex.Command
で呼び出すときにも反映されます /tmp
下が書き込み可能になっているので、一時ファイル系の処理で積極的に使っていきましょう
プロジェクト構成例
example_lambda ├── functions │ ├── pdf2images // PDFを画像に変換するラムダ関数 │ │ ├── main.go │ └── resizeImage // 画像を元にサムネイルを作成するラムダ関数 │ └── main.go ├── glide.lock ├── glide.yaml ├── project.json ├── resize // resizeする共通処理 │ └── resize.go ├── aws // aws-sdk-go周りの共通処理 │ ├── aws.go │ └── message.go └── vendor // vendoring