Skip to Content

GoでLambdaを動かしてみた

概要

LambdaでGoを動かしてみたかった

結論

重要なところ

Lambdaのダッシュボードでハンドラに入力する値と、go buildで生成したバイナリの名前を同じにする
バイナリは適当な名前でzipに固めてアップロードする

検証

実施内容

  1. 与えた値をそのまま返すGoのバイナリ生成
  2. Lambadaにバイナリを配置
  3. テスト実行で動作確認

サンプルLambadaコード

Lambadaのテスト実行で渡した値をそのまま返す

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
	"fmt"
	"github.com/aws/aws-lambda-go/lambda"
)

// TestEvent - LambdaのテストイベントのJSONフォーマット
type TestEvent struct {
	Name string `json:"Name"`
}

// Response - 実行結果のJSONフォマーマット
type Response struct {
	Message string `json:"Message:"`
}

func main() {
	lambda.Start(testCall)
}

func testCall(event TestEvent) (Response, error) {
	return Response{Message: fmt.Sprintf("Nameをそのまま返す: %s", event.Name)}, nil
}

バイナリ化 & ZIP圧縮

maing.goがサンプルLambadaコード

1
2
3
$ tree
.
└── main.go

環境変数

Ubuntu19.10の端末なのでそのままでOK

1
2
3
$ go env | grep -e GOOS -e GOARCH
GOARCH="amd64"
GOOS="linux"

ビルド

今回はバイナリにしたlambda-go-sampleの名前が後で重要になる

1
$ go build -o lambda-go-sample

ZIP

handler.zipとしたけどなんでもいい

1
$ zip handler.zip lambda-go-sample 

完成

1
2
3
4
5
$ tree
.
├── handler.zip
├── lambda-go-sample
└── main.go

Lambda作成

バイナリの配置と設定

  1. handler.zipをアップロード
  2. ハンドラにバイナリにした名前を入力
    今回はlambda-go-sample

テストイベント設定

Nameの値を返す用に作ったので、このようにテストイベントを作成

構成確認

テスト実行だけなのでこれでOK

テスト実行

Nameで指定したbigmuramuraを返すことができた
Goのバイナリが正常に動いていることを確認できた

感想

最低限、LambdaでGo動かすことを確認できたからお試しには良かった
修正がある度にアップロードし直しは手間だから、
SAMでローカルテスト環境作らないとやりづらいことはわかった

参考

https://dev.classmethod.jp/cloud/aws/aws-lambda-supports-go/