この記事は
Go(その1) Advent Calendar 2017の、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 に行ってきまして、そこでちょこっとだけ聞いてきたAWS LambdaのGoサポートについて書きます。
そして、まだサービスリリースもされてないんで公開情報だけで書きます。詳しい人は殆ど知ってる内容だろうけど許していただきたい。
まあ、このセッションの動画見ればこの記事みなくてもわかります。
AWS re:Invent 2017: What's New in Serverless (SRV305) - Youtube
小品だしふわっとしてますが、お付き合いください。
AWS Lambdaって何?
AWS Lambda (サーバーレスでコードを実行・自動管理) | AWS
自分の書いたプログラム(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の追加が発表されました。
Announcing 4 new features for AWS Lambda! #reInvent pic.twitter.com/UkM3vqBlKM
— AWS re:Invent (@AWSreInvent) 2017年11月30日
5! @werner also announces support for Go. #reInvent https://t.co/MyHutoewgB
— AWS re:Invent (@AWSreInvent) 2017年11月30日
先行研究
LambdaでGoを動かそうと頑張った人たちをご紹介。
-
APEX(http://apex.run/)
- AWS Lambdaのビルドやデプロイを簡単に行えるサービスで、おまけでGoもサポートしてる
- 中身はNode.jsからGoのバイナリを叩いていると聞きます
-
Ridge(https://github.com/fujiwara/ridge)
- APIGateway Objectとnet/httpの橋渡しパッケージ。くわしくはこちら
-
Eawsy AWS Lambda Go Shim(https://github.com/eawsy/aws-lambda-go-shim)
- Goをc-shared libraryとしてビルドして、Pythonから読み込んでるっぽい。ロマンある
実際はどういうふうに動かすの?
https://youtu.be/WrPOz2dx8XY?t=55m45s
ここのハンズオンデモでやってます。
コードはこんな感じ
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は
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
の第2引数とかで受けてくれるんですかね。
まだgithub.com/aws/aws-lambda-go/lambda
がプライベートリポジトリなようで、オープンになってたら中読んでどういう処理してるか書きたいと思ってたんですが、残念。
Node.jsやPythonみたいに、素のライブラリだけならWebコンソールだけで完結、外部パッケージとのリンクが必要だったりするとビルドしてアップしなきゃいけない感じですかね。パブリックパッケージなら、コンソールからコードアップするだけでよしなにビルドまでやってくれると嬉しいなあ。
いつから使えるの?
Launching early 2018 !
とのこと
座して待つ。(かわいい)
気になる点
動かすまでは解決しなそうなので列挙するだけで棚上げ。
- 最新バージョンにどのくらいのスピードで追随するんだろうか
- 多言語の実績だと、
- 2016-12-23にリリースされたPython3.6が2017-04-16に対応。
- 2017-02-22にリリースされたNode.js v6.10が、2017-03-22に対応。
- 結構ちゃんと追随してくれてはいるみたい。
- 多言語の実績だと、
- パッケージやビルド周りはどうなるんだろう
まとめ
サマリー
- AWS LambdaのGoを動かすには、既存のコードに最低2行の追加が必要
- 利用するためのパッケージはオープンソースになるらしい(まだ)
-
Comming Soon!
Launching early 2018 !
とのこと - とにかく楽しみ
感想
界隈ではGCP派に押されて肩身が狭い思いをしており、LambdaでGoを頑張るの辛い手法が多かったんですが、Lambdaがネイティブに対応してくれるのは本当に嬉しい。プロダクト全体のコードベースがGoなのに、しょうがなくPythonで書いてるLambda Functionや、ECSとかで動いてる小さい処理のバッチとかどんどん移していきたいです。可能な限り管理する部分を無くしたい。
はよ使いたいですね!Previewとか来たらできるかぎり早く触って記事書きたいと思います。