3行で
開発の経緯
AWS Lambda を管理、デプロイするのに数年来 Apex を使っていましたが、最近更新がないと思っていたら案の定というか、残念ながら No longer maintained となってしまいました。
で、代替を探したのですが…
Lambda管理、Apexがお亡くなりになってServerlessかSAMになるんだけど、本当は関数だけdeployできればよくて(IAMとか関連リソースはTerraformでやるんで)、それなら裏でCloudFormationが動くようなのじゃないシンプルなのがいいなあ。作れば作れるけどデプロイツールばっかり書くことになるな…
SAM も Serverless もどちらも結局 CloudFormation がお出ましになるし、自分としては関連リソースは別に Terraform で管理しているし、悩ましいなあ、という状況でした。
とはいえ aws-cli だけでやるのもちょっと面倒なことがあり、仕方ないので先週金曜にえいやっと書き始めたのが lambroll です。
"lamb roll"で検索すると美味しそうですね。
lambroll は何をして、何をしないのか
README に書いてありますが、こんなかんじです。
やること
- zip archive の作成
- Lambda 関数の設定とコード、alias、タグの作成、更新
やらないこと
Lambda の API で叩ける範囲以外は基本しません (S3 へファイル上げる以外)。Runtime や Layer もなにも関知しないので、zip に入れるものは自分でいい感じにビルドしてください。個人的には最近 Go / bash layer しか使わないのでビルドに困ってないというのもあります。
Quick Start
インストールは mac なら brew install fujiwara/tap/lambroll でできます。Linux はリリースバイナリを適当に落としてください。
既存の Lambda 関数を lambroll init で持ってきて管理できます。--download を付けると $LATEST で動いている zip もダウンロードしてきます。
$ mkdir hello
$ cd hello
$ lambroll init --function-name hello --download
2019/10/26 01:19:23 [info] function hello found
2019/10/26 01:19:23 [info] downloading function.zip
2019/10/26 01:19:23 [info] creating function.json
2019/10/26 01:19:23 [info] completed
$ unzip -l function.zip
Archive: function.zip
Length Date Time Name
--------- ---------- ----- ----
408 10-26-2019 00:30 index.js
--------- -------
408 1 file
$ unzip function.zip
Archive: function.zip
extracting: index.js
$ rm function.zip
あとは lambroll deploy すると、
- カレントディレクトリを zip にまとめる
.lambdaignoreファイルで除外指定できます
- 関数の設定、コード、タグを更新
- alias
currentを設定
が行われてデプロイされます。簡単ですね!
rollback のための alias 設定は Apex のと互換仕様のつもりです。
command
現在 init, list, deploy, rollback, delete, invoke, archive があります。
function.json
Lambda 関数の設定は function.json に書かれているので、設定を変えたいときはそこをいじってください。構造は CreateFunction API + Tags です。
kayac/go-config による環境変数の展開記法が使えるので、可変にしたい部分に {{ must_env }} {{ env }} 記法を入れておくと、lambroll 実行時の環境変数を埋め込むことができます。stg と prod を別関数にする、などに使ってください。
{ "Description": "hello function for {{ must_env `ENV` }}", "Environment": { "Variables": { "BAR": "baz", "FOO": "{{ env `FOO` `default for FOO` }}" } }, "FunctionName": "{{ must_env `ENV` }}-hello", "Handler": "index.js", "MemorySize": 128, "Role": "arn:aws:iam::123456789012:role/hello_lambda_function", "Runtime": "nodejs10.x", "Tags": { "Env": "{{ must_env `ENV` }}" }, "Timeout": 5 }
実際どうなの
一昨日から社内で dog fooding していて、いままで Apex や SAM でデプロイされていたものをどんどこ移行していますが、なにしろものが単純なので普通に動いてます (動かない理由がない)。
Apex の後継とはおこがましいので言いませんが、こういうシンプル (not easy) なやつをお好みなかたはどうぞご利用ください。
fujiwaraさんの新作、lambroll使ってみてるけれど、apexにあったGoのコンパイルやlogsはutern使ったりMakefileにgo build書けば良くて、小さいパーツ組み合わせる感じで好み。あとkayac/go-configが入ったのでlambdaの設定ファイルにローカルの環境変数が使えるようになった https://github.com/fujiwara/lambroll …

