AWS LambdaのGoサポートについて今知れるいくつかのこと

## この記事は
[Go(その1) Advent Calendar 2017](https://qiita.com/advent-calendar/2017/go)の、2017/12/14の記事です。

## 注意
### 正式リリース来ましたね
https://aws.amazon.com/jp/about-aws/whats-new/2018/01/aws-lambda-supports-go/
技術的な内容はこちらが詳しい。
https://aws.amazon.com/jp/blogs/compute/announcing-go-support-for-aws-lambda/
ここより下は、2017/12時点の情報で、つまり **リリースが来る前の情報** です。ご注意下さい。
別の記事でハンズオン的なやつ書きたいなと思っています。

## 導入
### AWS LambdaのGoサポートについて書きます 
この記事では、こないだ[AWS re:Invent2017](https://reinvent.awsevents.com/) に行ってきまして、そこでちょこっとだけ聞いてきたAWS LambdaのGoサポートについて書きます。
そして、まだサービスリリースもされてないんで公開情報だけで書きます。詳しい人は殆ど知ってる内容だろうけど許していただきたい。

まあ、この[セッションの動画](
https://www.youtube.com/watch?v=WrPOz2dx8XY)見ればこの記事みなくてもわかります。
[AWS re:Invent 2017: What's New in Serverless (SRV305) - Youtube](
https://www.youtube.com/watch?v=WrPOz2dx8XY)

小品だしふわっとしてますが、お付き合いください。


### AWS Lambdaって何？
[AWS Lambda (サーバーレスでコードを実行・自動管理) | AWS](https://aws.amazon.com/jp/lambda/)
自分の書いたプログラム(AWS Lambda関数)をサーバレスに実行でき、AWS API GatewayやAWS IoT、AWS SMS、Alexa Skillと連携できるエンドポイントにもなるというやつです。GCPでいうGoogle Cloud Functionsみたいなやつ。
今までは、Node.js (JavaScript)、Python、Java (Java8互換)、C# (.NET Core)の4種類の言語に対応していましたが、今回のre:Invent 2017で、Goと.Net Core2.0の追加が発表されました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Announcing 4 new features for AWS Lambda! <a href="https://twitter.com/hashtag/reInvent?src=hash&amp;ref_src=twsrc%5Etfw">#reInvent</a> <a href="https://t.co/UkM3vqBlKM">pic.twitter.com/UkM3vqBlKM</a></p>&mdash; AWS re:Invent (@AWSreInvent) <a href="https://twitter.com/AWSreInvent/status/936301179222425600?ref_src=twsrc%5Etfw">2017年11月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">5! <a href="https://twitter.com/Werner?ref_src=twsrc%5Etfw">@werner</a> also announces support for Go. <a href="https://twitter.com/hashtag/reInvent?src=hash&amp;ref_src=twsrc%5Etfw">#reInvent</a> <a href="https://t.co/MyHutoewgB">https://t.co/MyHutoewgB</a></p>&mdash; AWS re:Invent (@AWSreInvent) <a href="https://twitter.com/AWSreInvent/status/936301451566972930?ref_src=twsrc%5Etfw">2017年11月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 先行研究
LambdaでGoを動かそうと頑張った人たちをご紹介。

- [APEX](http://apex.run/)(http://apex.run/)
    - AWS Lambdaのビルドやデプロイを簡単に行えるサービスで、おまけでGoもサポートしてる
    - 中身はNode.jsからGoのバイナリを叩いていると聞きます
- [Ridge](https://github.com/fujiwara/ridge)(https://github.com/fujiwara/ridge)
    - APIGateway Objectとnet/httpの橋渡しパッケージ。[くわしくはこちら](https://speakerdeck.com/fujiwara3/go-mitainafalse-on-aws)
- [Eawsy AWS Lambda Go Shim](https://github.com/eawsy/aws-lambda-go-shim)(https://github.com/eawsy/aws-lambda-go-shim)
    - Goをc-shared libraryとしてビルドして、Pythonから読み込んでるっぽい。ロマンある

## 実際はどういうふうに動かすの？
https://youtu.be/WrPOz2dx8XY?t=55m45s
ここのハンズオンデモでやってます。

### コードはこんな感じ
```go

package main

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

func HandleRequest(name string) (string, error) {
	result := fmt.Sprintf("Hello %s!", name)
	fmt.Println(result) // log to console
	return name, null
}

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

```
叩いたAWS CLIは

```sh
aws lambda invoke --region us-west-1 \
--invocation-type RequestResponse \
--function-name goDemo 
--payload '"re:Invent"' \
--log-type None output
```

って感じで、これは普通にlambda叩いてるだけって感じ。



ソースに関しては、`lambda.Start`で関数名を指定するところがオッという感じですね。Goの言語仕様とあいまって他の言語と比べてちょっと特殊な書き方になっているような。
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/programming-model-v2.html
contextの概念はあるので、他の言語に倣うと`HandleRequest`の第２引数とかで受けてくれるんですかね。

まだ`github.com/aws/aws-lambda-go/lambda`がプライベートリポジトリなようで、オープンになってたら中読んでどういう処理してるか書きたいと思ってたんですが、残念。

Node.jsやPythonみたいに、素のライブラリだけならWebコンソールだけで完結、外部パッケージとのリンクが必要だったりするとビルドしてアップしなきゃいけない感じですかね。パブリックパッケージなら、コンソールからコードアップするだけでよしなにビルドまでやってくれると嬉しいなあ。




### いつから使えるの？
`Launching early 2018 !`とのこと
![IMG_2617.jpg](https://qiita-image-store.s3.amazonaws.com/0/57824/2832a733-a205-2607-9028-b7b50a0b40fe.jpeg)
座して待つ。(かわいい)


### 気になる点
動かすまでは解決しなそうなので列挙するだけで棚上げ。

- 最新バージョンにどのくらいのスピードで追随するんだろうか
    - 多言語の実績だと、
        - [2016-12-23にリリースされたPython3.6](https://www.python.org/downloads/release/python-360/)が[2017-04-16](https://aws.amazon.com/jp/about-aws/whats-new/2017/04/aws-lambda-supports-python-3-6/)に対応。
        - [2017-02-22にリリースされたNode.js v6.10](https://nodejs.org/en/blog/release/v6.10.0/)が、[2017-03-22](https://aws.amazon.com/jp/about-aws/whats-new/2017/03/aws-lambda-supports-node-js-6-10/)に対応。
        - 結構ちゃんと追随してくれてはいるみたい。
- パッケージやビルド周りはどうなるんだろう


## まとめ
### サマリー
- AWS LambdaのGoを動かすには、既存のコードに最低2行の追加が必要
- 利用するためのパッケージはオープンソースになるらしい（まだ）
- `Comming Soon!` `Launching early 2018 !`とのこと
- とにかく楽しみ

### 感想
界隈ではGCP派に押されて肩身が狭い思いをしており、LambdaでGoを頑張るの辛い手法が多かったんですが、Lambdaがネイティブに対応してくれるのは本当に嬉しい。プロダクト全体のコードベースがGoなのに、しょうがなくPythonで書いてるLambda Functionや、ECSとかで動いてる小さい処理のバッチとかどんどん移していきたいです。可能な限り管理する部分を無くしたい。

はよ使いたいですね！Previewとか来たらできるかぎり早く触って記事書きたいと思います。