AWS Lambda専用のデプロイツールlambrollの備忘録

はじめに

Lambda専用のデプロイツールとしてlambroll(ラムロール)というものがあることを最近知りました。

github.com

備忘を兼ねて、使い方などを記しておきます。

インストール

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とし、Runtimeruby3.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
$