AWS Lambdaの関数をデプロイできる「lambroll」を試す
Serverless Frameworkは次期バージョンのv4で有償化することを発表している。
Serverless Framework V4: A New Model
代替手段を探していたところ、lambrollというツールがあることを知ったので試してみる。
lambrollとは
lambrollは、AWS Lambdaの関数のデプロイに特化したツールである。
最小限の設定項目を記載した設定ファイルと関数のソースコードがあれば、コマンド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の設定ファイルで、ファイルの内容は次のとおり。
{
"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 関数を実行する際に渡した名前
」を返すだけの関数を記述する。
exports.handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify(`Hello ${event.name}`),
};
};
STEP3:エントリーポイントの修正
lambrollの設定ファイルのエントリーポイントを修正する。
デプロイする関数のソースコードファイルはsrc/index.js
で、エクスポートした関数名はhandler
なので、Handler
をsrc/index.handler
に修正する。
- "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に認証が必要ない場合は、AuthType
にNONE
を指定する。
{
"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で管理することが候補として考えられる。