AWS Lambda のミニマルなデプロイツール lambroll を書いた

3行で

  • シンプル/ミニマルな Lambda のデプロイツール lambroll を書いてるよ
  • Lambda API 以外は極力触らないやつです
  • 既存 function の移行も簡単です

開発の経緯

AWS Lambda を管理、デプロイするのに数年来 Apex を使っていましたが、最近更新がないと思っていたら案の定というか、残念ながら No longer maintained となってしまいました。

で、代替を探したのですが…

SAM も Serverless もどちらも結局 CloudFormation がお出ましになるし、自分としては関連リソースは別に Terraform で管理しているし、悩ましいなあ、という状況でした。

とはいえ aws-cli だけでやるのもちょっと面倒なことがあり、仕方ないので先週金曜にえいやっと書き始めたのが lambroll です。

github.com

"lamb roll"で検索すると美味しそうですね。

f:id:sfujiwara:20191101010814p:plain

lambroll は何をして、何をしないのか

README に書いてありますが、こんなかんじです。

やること

  • zip archive の作成
  • Lambda 関数の設定とコード、alias、タグの作成、更新

やらないこと

  • 周辺リソースの作成と管理
    • IAM Role とかトリガとか API Gateway とか…
  • Lambda 実行環境用のバイナリ(ネイティブ拡張)のビルド

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 すると、

  1. カレントディレクトリを zip にまとめる
    • .lambdaignore ファイルで除外指定できます
  2. 関数の設定、コード、タグを更新
  3. 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) なやつをお好みなかたはどうぞご利用ください。