きょこみのーと

技術に関係ないほうのブログ

Lambda x Apexで、Goで書いたラムダ関数を楽に動かす

業務でAmazonLambdaを使う機会があり、Apex(Go)を試していい感じだったのでその紹介とハマりポイントを幾つか紹介しようかと。

github.com

導入

すごく簡単で、 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になります
    • 下記の例だと pdf2imagesresizeImage になります
  • 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