AWS Lambdaの関数をデプロイできる「lambroll」を試す

Posts

Serverless Frameworkは次期バージョンのv4で有償化することを発表している。
Serverless Framework V4: A New Model
代替手段を探していたところ、lambrollというツールがあることを知ったので試してみる。

lambrollとは

lambrollは、AWS Lambdaの関数のデプロイに特化したツールである。

lambroll is a minimal deployment tool for AWS Lambda. - fujiwara/lambroll
GitHub

最小限の設定項目を記載した設定ファイルと関数のソースコードがあれば、コマンド1つで関数をデプロイできる。

動作を確認した環境

  • macOS Sonoma 14.1.2
  • lambroll v1.0.1

前提

  • 環境変数または~/.aws/credentialsにAWSの認証情報が設定されている
  • LambdaをデプロイするためのIAMロールが作成済みである

インストール

lambrollはHomebrewでインストールできる。

brew install fujiwara/tap/lambroll

# バージョン確認
lambroll version

lambroll v1.0.1

新規にAWS Lambdaの関数を作成する

STEP1:設定ファイルの作成

lambrollでデプロイする関数の設定ファイルを作成するには、lambroll initコマンドを実行する。
--function-nameオプションで関数名を指定する。

# ディレクトリを作成
mkdir hello-lambroll && cd $_
# lambroll用の設定ファイルを作成
lambroll init --function-name hello-lambroll

2024/02/29 17:37:53 [info] lambroll v1.0.1
2024/02/29 17:37:54 [info] function hello-lambroll is not found
2024/02/29 17:37:54 [info] creating .lambdaignore
2024/02/29 17:37:54 [info] creating function.json

「hello-lambroll」という名前のディレクトリの下に、次のファイルが生成される。

.
├── .lambdaignore
└── function.json

function.jsonはlambrollの設定ファイルで、ファイルの内容は次のとおり。

function.json
{
  "FunctionName": "hello-lambroll",
  "Handler": "index.handler",
  "MemorySize": 128,
  "Role": "arn:aws:iam::123456789012:role/YOUR_LAMBDA_ROLE_NAME",
  "Runtime": "nodejs18.x",
  "Timeout": 3
}
  • FunctionName:関数名
  • Handler:関数のエントリーポイント
  • Role: 関数のデプロイに使用するIAMロールのARN
    CloudWatch Logの作成権限をIAMロールに付与すると、関数のログをCloudWatch Logsに出力できる。

STEP2:ソースコードの作成

デプロイする関数のソースコードを作成する。
サンプルとして、「Hello 関数を実行する際に渡した名前」を返すだけの関数を記述する。

src/index.js
exports.handler = async (event) => {
  return {
    statusCode: 200,
    body: JSON.stringify(`Hello ${event.name}`),
  };
};

STEP3:エントリーポイントの修正

lambrollの設定ファイルのエントリーポイントを修正する。
デプロイする関数のソースコードファイルはsrc/index.jsで、エクスポートした関数名はhandlerなので、Handlersrc/index.handlerに修正する。

function.json
-  "Handler": "index.handler",
+  "Handler": "src/index.handler",

STEP4:関数のデプロイ

関数をデプロイするには、lambroll deployコマンドを実行する。

# 関数をデプロイ
lambroll deploy

2024/02/29 19:56:44 [info] lambroll v1.0.1 with function.json
2024/02/29 19:56:44 [info] starting deploy function hello-lambroll
2024/02/29 19:56:44 [info] creating zip archive from .
2024/02/29 19:56:44 [info] zip archive wrote 272 bytes
2024/02/29 19:56:44 [info] creating function
2024/02/29 19:56:44 [info] State:Pending LastUpdateStatus:
2024/02/29 19:56:44 [info] waiting for LastUpdateStatus Successful
2024/02/29 19:56:45 [info] State:Pending LastUpdateStatus:
2024/02/29 19:56:45 [info] waiting for LastUpdateStatus Successful
2024/02/29 19:56:48 [info] State:Pending LastUpdateStatus:
2024/02/29 19:56:48 [info] waiting for LastUpdateStatus Successful
2024/02/29 19:56:52 [info] State:Active LastUpdateStatus:Successful
2024/02/29 19:56:52 [info] deployed function version 1
2024/02/29 19:56:52 [info] creating alias set current to version 1
2024/02/29 19:56:52 [info] alias created

STEP4:ローカルでの関数の実行

AWS Lambdaにデプロイした関数をローカルで実行するには、lambroll invokeコマンドを実行する。
実行する際は、JSON文字列を渡す。
もし、event情報のJSON文字列をパイプで渡す。

# 関数を実行
echo '{"name":"chick-p"}' | lambroll invoke

2024/02/29 20:01:07 [info] lambroll v1.0.1
{"statusCode":200,"body":"\"Hello chick-p\""}
2024/02/29 20:01:08 [info] StatusCode:200
2024/02/29 20:01:08 [info] ExecutionVersion:$LATEST

STEP5:実行ログの確認

関数の実行ログを確認するには、lambroll logsコマンドを実行する。
ログを確認したい場合には、設定ファイルで指定したIAMロールにCLoudWatch Logsの権限を付与してデプロイしておく必要がある。

# 実行ログを確認
lambroll logs

2024/02/29 20:01:08 [info] lambroll v1.0.1
2024-02-29T11:48:08.181000+00:00 2024/03/01/[$LATEST]f3...de5 INIT_START Runtime Version: nodejs:18.v21  Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:46...4a
2024-02-29T11:48:08.354000+00:00 2024/03/01/[$LATEST]f3...de5 START RequestId: 79553187-ea43-49b5-bc05-1a231d8c611b Version: $LATEST
2024-02-29T11:48:08.371000+00:00 2024/03/01/[$LATEST]f3...de5 END RequestId: 79553187-ea43-49b5-bc05-1a231d8c611b
2024-02-29T11:48:08.371000+00:00 2024/03/01/[$LATEST]f3...de5 REPORT RequestId: 79553187-ea43-49b5-bc05-1a231d8c611b  Duration: 16.40 ms  Billed Duration: 17 ms  Memory Size: 128 MB  Max Memory Used: 65 MB  Init Duration: 171.54 ms

Lambda関数URLを作成する

lambrollでは、デプロイする際に--function-urlオプションを指定すると、Lambda関数URLを作成できる。

--function-urlオプションには、URLの設定情報を記載したJSONファイルを渡す。
Lambda関数URLに認証が必要ない場合は、AuthTypeNONEを指定する。

function_url.json
{
  "Config": {
    "AuthType": "NONE"
  }
}
# Lambda関数URLを作成
lambroll deploy --function-url function_url.json

2024/02/29 20:59:09 [info] lambroll v1.0.1
2024/02/29 20:59:09 [info] starting deploy function hello-lambroll
2024/02/29 20:59:09 [info] creating zip archive from .
2024/02/29 20:59:09 [info] zip archive wrote 259 bytes
2024/02/29 20:59:09 [info] updating function configuration
2024/02/29 20:59:09 [info] updating function configuration ...
2024/02/29 20:59:09 [info] State:Active LastUpdateStatus:Successful
2024/02/29 20:59:09 [info] updating function configuration accepted. waiting for LastUpdateStatus to be successful.
2024/02/29 20:59:09 [info] State:Active LastUpdateStatus:InProgress
2024/02/29 20:59:09 [info] waiting for LastUpdateStatus Successful
2024/02/29 20:59:10 [info] State:Active LastUpdateStatus:Successful
2024/02/29 20:59:10 [info] updating function configuration successfully
2024/02/29 20:59:10 [info] updating function code ...
2024/02/29 20:59:11 [info] State:Active LastUpdateStatus:Successful
2024/02/29 20:59:11 [info] updating function code accepted. waiting for LastUpdateStatus to be successful.
2024/02/29 20:59:11 [info] State:Active LastUpdateStatus:InProgress
2024/02/29 20:59:11 [info] waiting for LastUpdateStatus Successful
2024/02/29 20:59:12 [info] State:Active LastUpdateStatus:InProgress
2024/02/29 20:59:12 [info] waiting for LastUpdateStatus Successful
2024/02/29 20:59:14 [info] State:Active LastUpdateStatus:InProgress
2024/02/29 20:59:14 [info] waiting for LastUpdateStatus Successful
2024/02/29 20:59:18 [info] State:Active LastUpdateStatus:Successful
2024/02/29 20:59:18 [info] updating function code successfully
2024/02/29 20:59:18 [info] deployed version 4
2024/02/29 20:59:18 [info] updating alias set current to version 4
2024/02/29 20:59:18 [info] alias updated
2024/02/29 20:59:18 [info] deploying function url...
2024/02/29 20:59:18 [info] function url config for hello-lambroll:$LATEST not found. creating
2024/02/29 20:59:18 [info] created function url config for hello-lambroll:$LATEST
2024/02/29 20:59:18 [info] Function URL: https://YOUR_LAMBDA_FUNCTION_URL.lambda-url.ap-northeast-1.on.aws/
2024/02/29 20:59:18 [info] adding 1 permissions
2024/02/29 20:59:19 [info] added permission Sid: lambroll-8f4ec83e623a309d9ca15db9276da30b2129be9c
2024/02/29 20:59:19 [info] removing 0 permissions
2024/02/29 20:59:19 [info] deployed function url

生成されたURLは、実行結果のログに表示されるが、lambroll statusコマンドでも確認できる。

lambroll status

2024/03/01 19:26:57 [info] lambroll v1.0.1
+-----------------+----------------------------------------------------------------------------+
| FunctionName    | hello-lambroll                                                             |
| FunctionArn     | arn:aws:lambda:ap-northeast-1:123456789012:function:hello-lambroll         |
| Version         | $LATEST                                                                    |
| Runtime         | nodejs18.x                                                                 |
| PackageType     | Zip                                                                        |
| State           | Active                                                                     |
| LastUpdateState | Successful                                                                 |
| FunctionURL     | https://YOUR_LAMBDA_FUNCTION_URL.lambda-url.ap-northeast-1.on.aws/ |
+-----------------+----------------------------------------------------------------------------+

既存のAWS Lambdaの関数から設定ファイルを作成する

デプロイ済みの関数もlambrollで管理できる。
既存のLambda関数を管理する際に利用できる。

STEP1:関数名の確認

関数名を確認するには、lambroll listコマンドを実行する。
lambroll listは、デプロイ済みの関数の詳細情報が出力されるため、jqコマンドを使用すると関数名だけを抽出できる。

# 関数名を確認
lambroll list | jq '.FunctionName'

2024/02/29 22:33:38 [info] lambroll v1.0.1
"hello-lambroll"

STEP2:設定ファイルとソースコードのダウンロード

lambroll initする際に--function-nameで既存の関数名を指定すると、デプロイされている情報を元にした設定ファイル(function.json)が作成される。
コマンド実行時に--downloadオプションを指定すると、デプロイした関数のソースコードをダウンロードできる。

# 設定ファイルをダウンロードするディレクトリを作成
mkdir existing-lambda-function && cd $_

# 設定ファイルとソースコードをダウンロード
lambroll init --function-name existing-lambda-function --download

2024/02/29 22:36:49 [info] lambroll v1.0.1
2024/02/29 22:36:49 [info] function existing-lambda-function found
2024/02/29 22:37:46 [info] downloading function.zip
2024/02/29 22:36:50 [info] creating .lambdaignore
2024/02/29 22:36:50 [info] creating function.json

ソースコードはfunction.zipとして取得できる。

.
├── .lambdaignore
├── function.json
└── function.zip

function.zipを展開すると、ソースコードのファイルが含まれていることを確認できる。

# function.zipを展開
unzip function.zip

Archive:  function.zip
  inflating: src/index.js

# 構成を確認
tree .
.
├── .lambdaignore
├── function.json
├── function.zip
├── function_url.json
└── src # ソースコード
    └── index.js

Lambda関数URLを作成していた場合には、lambroll initする際に--function-urlオプションを指定することで、関数URLの設定ファイルをダウンロードできる。

# Lambda関数URLの情報をダウンロード
lambroll init --function-name existing-lambda-function-url --download --function-url

# 構成を確認
tree .
.
├── .lambdaignore
├── function.json
├── function.zip
└── function_url.json

Lambda関数を削除する

Lambda関数を削除するには、lambroll deleteコマンドを実行する。

lambroll delete

2024/03/01 20:24:58 [info] lambroll v1.0.1
2024/03/01 20:24:58 [info] deleting function hello-lambroll
Do you want to delete the function? (y/n) [n]: y}

まとめ

lambrollを使用すると、AWS Consoleで直接zipファイルをアップロードするよりも簡単にLambda関数をデプロイできるため、開発効率が向上する。
lambrollを使うための設定項目も少なく、初めてLambda関数をデプロイする人にも扱いやすい。

Serverless Frameworkでデプロイした関数は、API GatewayやAmazon EventBridgeなどのAWSリソースと連携している場合も多い。
そのため、lambrollはLambda関数の管理に、その他のAWSリソースはTerraformで管理することが候補として考えられる。