🐏

AWS Lambda デプロイツール lambroll - fujiwara-ware advent calendar 2024 day 3

2024/12/03に公開

この記事は fujiwara-ware advent calendar 2024 の3日目です。

lambroll とは

https://github.com/fujiwara/lambroll

lambroll は、AWS Lambda の関数(function)をコードで管理し、デプロイするためのツールです。「ラムロール」と読みます。

昨日紹介した ecspresso の Lambda 版、ともいえます。開発開始は2019年10月、リリースして5年が経ちました。ecspressoと並んでfujiwara-wareの代表的なツールです。

なぜ作ったのか

lambroll を開発した動機は、当時の AWS Lambda をデプロイするのに使っていた Apex (github.com/apex/apex) の開発が停止し、メンテナンスされなくなったためです。

他のツールも試したのですが (SAMとかServerlessとか)、どちらも Lambda 関数のみのデプロイは主眼ではなく、他のリソースも一緒にデプロイすることが前提でした。関数以外のインフラ的な要素は Terraform で管理していたので、関数だけをデプロイするシンプルなツールが欲しかったのです。

そのあたりの経緯は以下のエントリに書いています。

https://sfujiwara.hatenablog.com/entry/lambroll

lambroll の便利な機能

lambroll は、Lambda 関数のコードを zip してアップロードし、Lambda 関数を作成・更新する機能がメインですが、他にも便利な機能があります。

lambroll が持っているサブコマンドを並べて、それぞれ簡単に説明してみます。

lambroll init

lambroll の初期化を行います。既存の Lambda 関数を指定すると、その関数の設定を読み込んで lambroll の設定ファイルを生成します。つまり、他のツールで作成したり手作業で構築した関数を、lambroll で管理するように変換することができます。

lambroll list

Lambda 関数の一覧を表示します。

lambroll deploy

これがメインの機能です。Lambdaにデプロイするzipの作成とアップロード、関数の作成・更新を行います。

関数の定義は function.json (または function.jsonnet) というファイルで行います。このファイルは、基本的には Lambda の CreateFunction API が受け付ける引数とおなじ構造を持っています。また、テンプレート関数を使って設定を記述することもできます。

利用できるテンプレート関数 (詳しくは README を参照してください)

  • env 環境変数を参照します
  • must_env 環境変数を参照します。存在しない場合はエラーになります
  • caller_identity AWSアカウントの情報を取得します。caller_identity.Account などでアクセスできます
  • tfstate Terraform の state ファイルを読み込み、リソースの情報を取得します。実装には tfstate-lookup を使っています
    • 複数の tfstate ファイルを読み込むこともできます
  • ssm AWS Systems Manager のパラメータストアの値を取得します

Lambda では zip が50MBを超えると直接アップロードができません。その場合は S3 にアップロードしてから Lambda に渡す必要がありますが、lambroll はその辺りの処理を自動で行ってくれます。Deploy via S3 を参照してください。

また、コンテナイメージのデプロイにも対応しています。Deploy container images

lambroll rollback

Lambda 関数のロールバックを行います。最新のバージョンを削除して、以前のバージョンに戻すことができます。

lambroll invoke

Lambda 関数を実行します。関数に与えるpayloadは、コマンドライン引数や標準入力から指定できます。

$ lambroll invoke --payload '{"key": "value"}'
$ lambroll invoke < payload.json

payload には、複数のJSONを単に連結して与えることで、複数回関数を実行することもできます。

lambroll archive

Lambda 関数のアーカイブを作成します。アーカイブは、Lambda 関数のコードと設定を zip にしたものです。デプロイ前に zip の内容を確認したいときに使います。

lambroll logs

Lambda 関数のログを表示します。CloudWatch Logs に保存されているログを取得します。

内部では実は aws-cli v2 を呼び出しているだけなので、aws-cli がインストールされている必要があります。--follow オプションをつけると、リアルタイムでログを追尾して表示できるため、デバッグに便利です。

lambroll diff

Lambda 関数の設定差分を表示します。デプロイ前に、どのような変更があるかを確認できます。

lambroll render

Lambda 関数の設定を表示します。function.json を、テンプレート関数を適用後の状態で表示します。function.jsonfunction.jsonnet では、テンプレート関数を使って設定を記述できます。また、特に Jsonnet を利用する場合に複雑な Jsonnet になってしまった場合、JSON にレンダリングした結果を確認できます。
(最悪の場合、この JSON からリファクタリングすることもできますね)

lambroll status

Lambda 関数のステータスを表示します。関数の名前、ARN、バージョン、ランタイム、パッケージタイプ、状態、最終更新状態などを表示します。

$ lambroll status
+-----------------+-----------------------------------------------------------+
| FunctionName    | hello                                                     |
| FunctionArn     | arn:aws:lambda:ap-northeast-1:123456789012:function:hello |
| Version         | $LATEST                                                   |
| Runtime         | python3.9                                                 |
| PackageType     | Zip                                                       |
| State           | Active                                                    |
| LastUpdateState | Successful                                                |
+-----------------+-----------------------------------------------------------+

lambroll delete

Lambda 関数を削除します。

lambroll versions

Lambda 関数のバージョン一覧を表示します。各バージョンの最終更新日時、エイリアス、ランタイムを表示します。

--delete--keep-versions オプションを組み合わせることで、指定した世代より古いバージョンを削除することができます。この場合、エイリアスが指定されているバージョンは削除されません。

$ lambroll versions
+---------+---------------------------+---------+-----------+
| VERSION |       LAST MODIFIED       | ALIASES |  RUNTIME  |
+---------+---------------------------+---------+-----------+
|      92 | 2023-11-29T11:27:20+09:00 |         | python3.9 |
|      93 | 2024-04-06T01:03:30+09:00 |         | python3.9 |
|      97 | 2024-08-10T00:44:20+09:00 | latest  | python3.9 |
|      98 | 2024-09-02T17:45:21+09:00 | current | python3.9 |
| $LATEST | 2024-09-02T17:45:21+09:00 |         | python3.9 |
+---------+---------------------------+---------+-----------+

Lambda Function URLs サポート

lambroll は v1 から Lambda Function URLs をサポートしています。Lambda Function URLs は、Lambda 関数を HTTP エンドポイントとして公開する機能です。

function_url.json (jsonnet) というファイルで設定を記述します。IAM 認証などの設定も行えます。

詳しくは Lambda function URLs support を参照してください。

https://sfujiwara.hatenablog.com/entry/lambroll-v1

なお、Go で実装した net/http.Server で動くアプリケーションを Lambda Function URLs で動かすためのライブラリ ridge も fujiwara-ware です。ridgeについては後日紹介する予定です。

https://github.com/fujiwara/ridge

まとめ

lambroll は、Lambda 関数のコードを zip してアップロードし、Lambda 関数を作成・更新するためのツールです。ecspresso と同様に、Lambda 関数をデプロイすることに特化しています。

Terraform などと組み合わせて使うことで、Lambda 関数のみをデプロイするシンプルなワークフローを実現できます。ecspresso が気に入った方は、ぜひ lambroll もお試しください。

それでは、明日もお楽しみに!

Discussion