AWS Lambda で Go が使えるようになったので試してみた

2018.01.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも!大阪オフィスの西村祐二です。

2018年1月15日、AWS Lambda が Go をサポートしました。

https://aws.amazon.com/jp/about-aws/whats-new/2018/01/aws-lambda-supports-go/

では、さっそく試してみます!

試してみる

マネージメントコンソールからLambda関数を作成していきます。

▼「一から作成」をクリックし、ランタイムを選択すると「Go 1.x」が選択できるようになっています。

▼ちなみに設計図にはないみたいです。

▼ここで注意点。関数作成を進めていくと、通常Webから利用できるエディタがでてきて、
そこから関数作成できますが、今回はまだできないみたいです。
なので、ローカルで作成していきます。

GoでLambda関数を作成

▼ローカルでGoのLambda関数用のプログラムを作成していきます。

公式ドキュメントを参考に作成していきます。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html

ドキュメントから、ざっくり作成のルールをまとめると下記になります。

  • github.com/aws/aws-lambda-go/lambdaパッケージをインクルードする必要がある。
  • ハンドラは関数でないといけない。
  • ハンドラ関数を実行するmain()を実装する必要がある。
  • ハンドラは0〜2つの引数を取ることができる。
  • 引数がある2つ場合は、最初の引数を「context.Context」として実装する必要がある。
  • ハンドラは0〜2個の値を返すことができる。
  • 戻り値が2つある場合は、2番目の値を「error」として実装する必要がある。

ハンドラのパータンとして下記のパターンがあります。

・func ()
・func () error
・func (TIn), error
・func () (TOut, error)
・func (context.Context) error
・func (context.Context, TIn) error
・func (context.Context) (TOut, error)
・func (context.Context, TIn) (TOut, error)

Goでプログラムをかく

公式ドキュメントに記載されているサンプルを参考に下記として作成します。
名前を渡したら、「Hello XXX!!」と返してくれるプログラムです。

hello.go

package main

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

type MyEvent struct {
	Name string `json:"What is your name?"`
}

type MyResponse struct {
	Message string `json:"Answer:"`
}

func hello(event MyEvent) (MyResponse, error) {
	return MyResponse{Message: fmt.Sprintf("Hello %s!!", event.Name)}, nil
}

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

パッケージをインストール

公式で配布されているSDKをダウンロードしておきます。

# go get -u github.com/aws/aws-lambda-go/lambda

ビルド

下記コマンドより、バイナリを作成します。
バイナリのファイル名はハンドラ(今回の場合はhello)と同じにしておく必要があるみたいです。

# GOOS=linux GOARCH=amd64 go build -o hello
# ls
hello    hello.go

ZIPファイルにかためる

デプロイするために、バイナリファイルをZIPファイルにかためます。

# zip handler.zip ./hello

作成したファイルをアップロード

マネージメントコンソールから、作成したZIPファイルを指定しアップロードします。
このときに、ハンドラ名を作成したものと一致させておきます。

ZIPファイルを指定したら上の方の保存ボタンをおしておきます。

動作確認

テストデータとして下記のように設定します。

{
  "What is your name?": "<名前>"
}

保存ボタンをおし、テストしてみるとプログラムどおり処理されていることがわかります。

さいごに

いかがだったでしょうか。

Go でLambda関数を作成してみました。
今回はじめてGoをさわったのですが、新しい言語にふれるのは楽しいですね。

みなさんも実行速度がはやいと言われるGoでLambda関数を作ってみてはいかがでしょうか。

誰かの参考になれば幸いです。

参考サイト

http://blog.wnotes.net/blog/article/golang-on-aws-lambda

https://qiita.com/kurkuru/items/29a8f6de6890bbc887a4