Hello, Go! – AWS LambaでGoを書く

今年はじめにAWS LambdaでGoをサポートされるようになりました。

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

AWS Lambdaで自動化の仕組みを作りたいこともあって、今回は前々からGoで関数を書いてみたいと思います。

最近大量の蚊に悩まされ睡眠を阻害されている台湾大好きエンジニアの三宅です。

いきなり自動化するためのコードを書こうと思ったのですが、そもそもGoでコードを書いたことが全く無いので、まずはGoに触れてみることにしました。

インストール

公式サイトにはバイナリをダウンロードしてインストールする方法が書かれているのですが、今回はhomebrewを使ってインストールすることにしました。

$ brew install go

バイナリからインストールする方は以下のURLからどうぞ。

https://golang.org/dl/

$ go version
go version go1.10.2 darwin/amd64

正常にインストールされていることが確認できました。

Hello, World

では定番のHello, Worldを出力するプログラミングを書いてみたいと思います。

まずはワークスペースを用意します。

$ mkdir ~/path/to/hello

その中で同名のファイルhello.goを作成してコードを書いていきます。

$ cd ~/path/to/hello
$ vim hello.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello, World!\n")
}

コードを書き終えたらコマンドでビルドを実行します。

$ go build

helloという実行ファイルが生成されるので実行してみます。

$ ./hello
Hello, World!

無事Hello, World!と表示されました。

Hello, World on AWS Lambda

せっかくなのでAWS Lambda上でもHello, Goしてみたいと思います。

ドキュメントのサンプルコードをそのまま動かしてみます。

$ mkdir /path/to/hello_lambda
$ vim hello_lambda.go
package main

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

type MyEvent struct {
  Name string `json:"name"`
}

func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
  return fmt.Sprintf("Hello %s!", name.Name), nil
}

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

コードをビルドしてzipファイルにします。

$ go build
$ zip handler.zip ./hello_lambda

それからAWS Lambdaにファイルをアップロードします。関数パッケージよりzipファイルを選択し、ハンドラ名を入力して、最後に「保存」を実行します。

では、さっそく実際に動くのかテストしてみましょう。

まずは「テストイベントの設定」でテストイベントを作成します。

テストイベントを作成できたら、「テスト」を実行してみます。

失敗してしまいました…

どうやらMacでbuildしてAWS Lambdaで動かすにはOSを指定してビルドする必要があるようです。

https://blog.rowanudell.com/aws-sam-local-error-with-golang/

ということで、早速ビルドし直してアップロードしてみます。

$ GOOS=linux go build ./hello_lambda.go

再度テストを実行してみます。

無事成功しました。

まとめ

今回は初めてのGo、初めてのAWS Lambdaということで超初歩的なことを試してみました。これからGoを使いつつ開発作業で定型化した作業を自動化するのにAWS Lambdaを利用してみたいなと思います。

 

TimeCrowdに戻る