はじめに
Lambda専用のデプロイツールとしてlambroll(ラムロール)というものがあることを最近知りました。
備忘を兼ねて、使い方などを記しておきます。
インストール
macOSの場合はbrewを使うのが一番楽かと思います。
$ brew install fujiwara/tap/lambroll
また、AWS CLIも必要となります。今回使用したバージョンはv1.3.2でした。
準備
Lambdaに付与するロールを準備しておきます。今回はAWSLambdaBasicExecutionRoleポリシーを含んだロールを作り、そのARNを控えておきます。
設定ファイルの作成
適当なディレクトリで以下のようにlambroll initを実行することでfunction.jsonや.lambaignoreが作成されます。
$ lambroll init --function-name testFunction
このとき、内部の処理でAWS環境にアクセスしています。アクセスできない場合は以下のメッセージが出力されます。
2025/11/21 21:41:12 [error] FAILED. failed to GetFunction testFunction: operation error Lambda: GetFunction, exceeded maximum number of attempts, 3, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, exceeded maximum number of attempts, 3, request send failed, Get "http://169.254.169.254/latest/meta-data/iam/security-credentials/": dial tcp 169.254.169.254:80: connect: no route to host
profileは--profileオプションで指定します。
$ lambroll init --function-name testFunction
function-nameで指定した関数名が既に存在する場合は、その内容に合わせてfunction.jsonが作られます。
設定ファイルの修正(Rubyの場合)
作成されたfunction.jsonを編集します。
{ "FunctionName": "testFunction", "Handler": "hello_world.handler", "MemorySize": 128, "Role": "あらかじめ作成していたRoleのARN", "Runtime": "ruby3.4", "Timeout": 5 }
今回は、Rubyランタイムで以下のようなLambda関数を作りました。
# ファイル名はhello_world.rb require 'json' def handler(event:, context:) { statusCode: 200, body: JSON.generate('Hello from Lambda!') } end
このためHandlerはファイル名.メソッド名であるhello_world.handlerとし、Runtimeはruby3.4とします。
デプロイ
作成したLambda関数をAWS環境にデプロイします。lambroll deployを使います。
$ lambroll deploy --function function.json --src . 2025/11/21 21:49:16 [info] lambroll v1.3.2 with function.json 2025/11/21 21:49:16 [info] loading Function from function.json 2025/11/21 21:49:16 [info] starting deploy function testFunction 2025/11/21 21:49:19 [info] creating zip archive from . 2025/11/21 21:49:19 [info] zip archive wrote 1329 bytes 2025/11/21 21:49:19 [info] creating function 2025/11/21 21:49:20 [info] State:Pending LastUpdateStatus: 2025/11/21 21:49:20 [info] waiting for LastUpdateStatus Successful 2025/11/21 21:49:21 [info] State:Pending LastUpdateStatus: 2025/11/21 21:49:21 [info] waiting for LastUpdateStatus Successful 2025/11/21 21:49:23 [info] State:Pending LastUpdateStatus: 2025/11/21 21:49:23 [info] waiting for LastUpdateStatus Successful 2025/11/21 21:49:27 [info] State:Active LastUpdateStatus:Successful 2025/11/21 21:49:27 [info] deployed function version 1 2025/11/21 21:49:27 [info] creating alias set current to version 1 2025/11/21 21:49:27 [info] alias created $
成功すると、AWS上にも作成されています。

実行すると当然動きます。

実行
上では、コンソール上で動かしましたが、lambrollでも実行することができます。
echo '{"event": "aaa"}' | lambroll invoke 2025/11/21 21:52:04 [info] lambroll v1.3.2 2025/11/21 21:52:04 [info] loading Function from function.json {"statusCode":200,"body":"\"Hello from Lambda!\""} 2025/11/21 21:52:04 [info] StatusCode:200 2025/11/21 21:52:04 [info] ExecutionVersion:$LATEST
設定ファイルの修正(Javaの場合)
上ではRubyの場合でやりましたが、Javaでもlambrollでデプロイ可能です。注意が必要なのは、function.jsonの記述です。具体的には、Codeブロックにzipファイルを格納するS3バケットとキーを記述します。
{ "FunctionName": "testFunction", "Handler": "パッケージ名.クラス名::メソッド名", "MemorySize": 128, "Role": "あらかじめ作成していたRoleのARN", "Runtime": "java21", "Code": { "S3Bucket": "xxxxxxxxxxxxxxxxxxxx", "S3Key": "java-lambda-1.0.0.zip" }, "Timeout": 10 }
zipファイルの作成
S3にアップロードするzipファイルを作ります。Gradleの場合build.gradleを以下のように記述します。
plugins {
id 'java'
}
group = 'com.example'
version = '1.0.0'
repositories {
mavenCentral()
}
dependencies {
implementation 'com.amazonaws:aws-lambda-java-core:1.4.0'
implementation 'com.amazonaws:aws-lambda-java-events:3.16.1'
}
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
task packageJar(type: Zip) {
into('lib') {
from(jar)
from(configurations.runtimeClasspath)
}
}
build.dependsOn packageJar
あとは、./gradlew clean buildを実行するとbuild/distributions以下にzipファイルが作成されます。
デプロイ
デプロイは以下のようにします。
$ lambroll deploy --function function.json --src ./build/distributions/java-lambda-1.0.0.zip 2025/11/22 15:43:50 [info] lambroll v1.3.2 with function.json 2025/11/22 15:43:50 [info] loading Function from function.json 2025/11/22 15:43:50 [info] starting deploy function testFunction 2025/11/22 15:43:51 [info] reading zip archive from ./build/distributions/java-lambda-1.0.0.zip 2025/11/22 15:43:51 [info] zip archive 986888 bytes 2025/11/22 15:43:51 [info] uploading function 986888 bytes to s3://xxxxxxxxxxxxxxxxxxxx/java-lambda-1.0.0.zip 2025/11/22 15:43:51 [info] object created 2025/11/22 15:43:51 [info] creating function 2025/11/22 15:43:52 [info] State:Pending LastUpdateStatus: 2025/11/22 15:43:52 [info] waiting for LastUpdateStatus Successful 2025/11/22 15:43:54 [info] State:Pending LastUpdateStatus: 2025/11/22 15:43:54 [info] waiting for LastUpdateStatus Successful 2025/11/22 15:43:56 [info] State:Pending LastUpdateStatus: 2025/11/22 15:43:56 [info] waiting for LastUpdateStatus Successful 2025/11/22 15:44:00 [info] State:Active LastUpdateStatus:Successful 2025/11/22 15:44:00 [info] deployed function version 2 2025/11/22 15:44:00 [info] creating alias set current to version 2 2025/11/22 15:44:00 [info] alias created
成功するとS3にzipファイルが格納され、動作します。
echo '{"event": "test"}' | lambroll invoke 2025/11/22 15:47:17 [info] lambroll v1.3.2 2025/11/22 15:47:17 [info] loading Function from function.json null 2025/11/22 15:47:18 [info] StatusCode:200 2025/11/22 15:47:18 [info] ExecutionVersion:$LATEST $