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 …