Serverless Framework(Go) でHello worldしてみる

##　祝！Lambda Go Support

ついにAWS LambdaがGo対応されました。

https://aws.amazon.com/jp/blogs/compute/announcing-go-support-for-aws-lambda/

Serverless Frameworkも素早くGo対応を行なってくれてますので、

早速Hello worldしてみて、GoでのServerless開発を始めたいと思います。

## Serverless Framework　のインストール（アップデート）

まずはServerless Frameworkをグローバルにインストールします。
パッケージ毎に管理されている方はローカルにインストールしてください。
既にインストール済みの方もGo対応以降のバージョンにアップデートしましょう。

```shell:ServerlessFrameworkインストール
$ npm install serverless -g
```

## テンプレート作成

Go用のテンプレートを作成します。

```shell:テンプレート作成
$ serverless create -u https://github.com/serverless/serverless-golang/ -p hello-go-lambda
Serverless: Generating boilerplate...
Serverless: Downloading and installing "serverless-golang"...
Serverless: Successfully installed "hello-go-lambda"
```

`serverless`コマンド部分は `sls`コマンドでもよいです。

```shell:テンプレート作成
$ sls create -u https://github.com/serverless/serverless-golang/ -p hello-go-lambda
Serverless: Generating boilerplate...
Serverless: Downloading and installing "serverless-golang"...
Serverless: Successfully installed "hello-go-lambda"
```

## 必要パッケージの取得 ※　12/20追記

その後必要なパッケージを取得します。
今回の場合、 `github.com/aws/aws-lambda-go/lambda`ですね

@shinriyo@githubさんに教えてもらい気付きました。
ありがとう御座います！！

```shell:
$ go get github.com/aws/aws-lambda-go/lambda
```

## main.go確認

作成したテンプレートのディレクトリ内に main.goがあるので開いてみます。
Response返すだけのプログラムの様です。今回は、動かす事が目的なのでそのまま使用します。

```shell:
$ cd hello-go-lambda
$ vim main.go
```

```go:main.go
package main

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

type Response struct {
    Message string `json:"message"`
}

func Handler() (Response, error) {
    return Response{
        Message: "Go Serverless v1.0! Your function executed successfully!",
    }, nil
}

func main() {
    lambda.Start(Handler)
}
```

## build
先程のプログラムを buildします。
lambdaの動いている環境は linuxなのか、クロスコンパイル設定値 GOOSを linuxにしておきます。
**※この設定をしていないと、実行時にエラーになります。**

```
$ GOOS=linux go build -o bin/main
$ ls -R
README.md       bin/            main.go         serverless.yml

./bin:
main*
```

bin配下にmainコマンドが出来てます。

## リージョン変更

デフォルトでは`us-east-1`にデプロイされてしまうので、`serverless.yml`の設定を変更しておきます。

```
$ vim serverless.yml
```

```
# you can overwrite defaults here
#  stage: dev
#  region: us-east-1
```

↓

```
# you can overwrite defaults here
  stage: dev
  region: ap-northeast-1
```
## deploy

deploy します。

```
$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (2.98 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
................
Serverless: Stack update finished...
Service Information
service: hello-go-lambda
stage: dev
region: ap-northeast-1
stack: hello-go-lambda-dev
api keys:
  None
endpoints:
  None
functions:
  hello: hello-go-lambda-dev-hello
```

**※動作させれば良いという考えなのでAPIKeyなかったりします。ちゃんと使う人は確実に設定お願いします。**

## 実行

```
$  sls invoke -f hello
{
    "message": "Go Serverless v1.0! Your function executed successfully!"
}
```

楽勝ですね。

## まとめ
簡単なので、みなさん是非やってみましょう！

## 追記
Q.Hello worldして無くない？
A.忘れてた