AWS Lambda デプロイツール lambroll - fujiwara-ware advent calendar 2024 day 3
この記事は fujiwara-ware advent calendar 2024 の3日目です。
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 で管理していたので、関数だけをデプロイするシンプルなツールが欲しかったのです。
そのあたりの経緯は以下のエントリに書いています。
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.json
や function.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 を参照してください。
なお、Go で実装した net/http.Server で動くアプリケーションを Lambda Function URLs で動かすためのライブラリ ridge も fujiwara-ware です。ridgeについては後日紹介する予定です。
まとめ
lambroll は、Lambda 関数のコードを zip してアップロードし、Lambda 関数を作成・更新するためのツールです。ecspresso と同様に、Lambda 関数をデプロイすることに特化しています。
Terraform などと組み合わせて使うことで、Lambda 関数のみをデプロイするシンプルなワークフローを実現できます。ecspresso が気に入った方は、ぜひ lambroll もお試しください。
それでは、明日もお楽しみに!
Discussion