AWS Lambda とは?基本的な使い方や関数の作成を学ぼう
アプリケーション開発ではサーバーの管理や起動・停止の自動化など、コード以外の作業が増えがちです。AWS Lambda はサーバーのプロビジョニングや管理を気にしないで、コードの実行だけに集中できるサーバーレスコンピューティングサービスです。本記事では Lambda の基本概念から実際の関数作成・実行手順まで説明します。
AWS Lambda とは
Lambda は AWS が提供するサーバーレスのコンピューティングサービスです。コードをアップロードするだけで実行環境が自動的に準備され、リクエストに応じてスケールします。サーバーの管理や容量のプロビジョニングを自分で行う必要はないです。
実行したいコードを「関数」という単位で管理し、HTTP リクエスト・S3 へのファイルアップロード・DynamoDB のストリームなど、さまざまなイベントをトリガーにして実行できます。料金はコードが実行されている時間にのみ発生するため、常時稼働のサーバーと比較してコストを抑えやすいです。
AWS Lambda とは - AWS Lambda
AWS Lambda を使用すると、サーバーをプロビジョニングまたは管理しなくてもコードを実行できます。
主な特徴
Lambda にはサーバーレスならではの特徴があります。それぞれの特徴を把握しておきましょう。
| 特徴 | 概要 |
|---|---|
| サーバー管理不要 | OS のパッチ適用や容量の管理は AWS が行うため、コードの開発に集中できる |
| 自動スケーリング | リクエスト数に応じて自動でスケールし、急なトラフィック増加にも対応する |
| 従量課金 | 関数が実行された時間(1 ms 単位)とリクエスト数に応じた課金で、アイドル時間はコストが発生しない |
| イベント駆動 | S3・API Gateway・DynamoDB など AWS の各サービスやカスタムイベントをトリガーにして実行できる |
| タイムアウト制限 | 最大実行時間は 15 分のため、長時間処理が必要なバッチ処理などには向かない場合がある |
コールドスタートと呼ばれる、初回実行時や一定時間アイドル後の起動遅延が発生することがある点も頭に入れておきましょう。プロビジョニング済み同時実行数とは、あらかじめ指定した数の実行環境を初期化した状態で待機させておく機能です。レスポンスタイムが重要な用途では、この機能を有効にすることでコールドスタートを回避できます。
関数に対するプロビジョニングされた同時実行数の設定 - AWS Lambda
Lambda での 同時実行 は、関数が現在処理している未完了のリクエストの数です。利用できる同時実行コントロールには、次の 2 種類があります。
サポートするランタイム
Lambda は多くのプログラミング言語のランタイムをサポートしています。サポート外の言語が必要な場合はカスタムランタイムを用意することもできます。
| ランタイム | 対応バージョン(例) |
|---|---|
| Python | 3.9 / 3.10 / 3.11 / 3.12 / 3.13 |
| Node.js | 18.x / 20.x / 22.x |
| Java | 11 / 17 / 21 |
| Go | 1.x(provided.al2023) |
| Ruby | 3.2 / 3.3 |
| .NET | 8 |
各ランタイムには AWS が管理するマネージドランタイムと、カスタムランタイム(provided.al2023)の 2 種類があります。マネージドランタイムはセキュリティパッチの適用を AWS が行いますが、サポートが終了したランタイムは廃止されるため定期的なバージョンアップが必要になります。
Lambda ランタイム - AWS Lambda
Lambda がランタイムでサポートする言語について説明します。
環境変数
関数の設定値は環境変数として管理でき、コードを変更せずに接続先や動作モードを切り替えられます。たとえば開発環境と本番環境で接続先データベースを変えたい場合、環境変数にステージ名を持たせておき、コード側でその値を参照する形にすると、コードそのものは共通化できます。
データベースのパスワードや API キーなどの機密情報は、環境変数に平文で入れるべきではないです。AWS Secrets Manager や Systems Manager パラメータストアに保存し、実行時に取得する構成にしましょう。
Lambda 環境変数の操作 - AWS Lambda
Lambda で環境変数を使用する方法を説明します。 環境変数を使用して、コードを更新することなく関数を調整します。
Lambda 関数 URL
API Gateway を経由せず、Lambda 関数に直接 HTTPS エンドポイントを割り当てる機能です。シンプルな Webhook や社内向けツールなど、API Gateway が持つ高度なルーティングや認証機能が不要な用途では、関数 URL を使うことで構成をシンプルにできます。
認証方式には、IAM 認証を必須にする AWS_IAM と、認証なしでアクセスできる NONE があります。NONE を選んだ場合でも、関数 URL を作成しただけでは匿名アクセスは許可されず、別途アクセス許可を追加する必要があります。
Lambda 関数 URL の作成と管理 - AWS Lambda
Lambda 関数の URL を設定して、他の AWS のサービスとの統合を必要とせずに、HTTP エンドポイントを Lambda 関数に割り当てます。
AWS CLI で Lambda を使ってみる
AWS CLI を使って Python の Lambda 関数を作成し、実行するまでの流れを確認します。関数には実行に必要な権限を持つ IAM ロールが必要なため、まずロールを作成してから関数を作成する手順になります。
IAM ロールの作成
Lambda 関数が実行時に使用する IAM ロールを作成します。まず、Lambda がロールを引き受けられるようにするための信頼ポリシーファイルを作成します。
❯ cat << 'EOF' > trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
作成したファイルを使って IAM ロールを作成します。
❯ aws iam create-role \
--role-name exrecord-lambda-role \
--assume-role-policy-document file://trust-policy.json
{
"Role": {
"Path": "/",
"RoleName": "exrecord-lambda-role",
"RoleId": "AROA0a1b2c3d4e5f67890",
"Arn": "arn:aws:iam::123456789012:role/exrecord-lambda-role",
"CreateDate": "2026-04-18T04:00:35+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
}
}
次に、CloudWatch Logs へのロググループ・ストリームの作成とログ書き込みを許可するマネージドポリシーをアタッチします。AWSLambdaBasicExecutionRole は CloudWatch Logs への書き込みのみを許可するポリシーで、Lambda からログを記録するために必要です。
❯ aws iam attach-role-policy \
--role-name exrecord-lambda-role \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
関数コードの準備
シンプルな Python 関数を作成し、zip ファイルにまとめます。
❯ cat << 'EOF' > lambda_function.py
def lambda_handler(event, context):
print("Hello from Lambda!")
return {
"statusCode": 200,
"body": "Hello, World!"
}
EOF
作成したファイルを zip に圧縮します。
❯ zip function.zip lambda_function.py
adding: lambda_function.py (deflated 21%)
関数の作成
IAM ロールの ARN と zip ファイルを指定して Lambda 関数を作成します。--handler には ファイル名.関数名 の形式でエントリーポイントを指定します。
❯ aws lambda create-function \
--function-name exrecord-hello \
--runtime python3.12 \
--role arn:aws:iam::123456789012:role/exrecord-lambda-role \
--handler lambda_function.lambda_handler \
--zip-file fileb://function.zip
実行結果
{
"FunctionName": "exrecord-hello",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:exrecord-hello",
"Runtime": "python3.12",
"Role": "arn:aws:iam::123456789012:role/exrecord-lambda-role",
"Handler": "lambda_function.lambda_handler",
"CodeSize": 302,
"Description": "",
"Timeout": 3,
"MemorySize": 128,
"LastModified": "2026-04-18T04:01:54.411+0000",
"CodeSha256": "0a1b2c3d4e5f67890abcdef1234567890abcdef1234567890abcdef1234567890",
"Version": "$LATEST",
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "0a1b2c3d-4e5f-6789-0abc-def123456789",
"State": "Pending",
"StateReason": "The function is being created.",
"StateReasonCode": "Creating",
"PackageType": "Zip",
"Architectures": [
"x86_64"
],
"EphemeralStorage": {
"Size": 512
},
"SnapStart": {
"ApplyOn": "None",
"OptimizationStatus": "Off"
},
"RuntimeVersionConfig": {
"RuntimeVersionArn": "arn:aws:lambda:ap-northeast-1::runtime:0a1b2c3d4e5f67890"
},
"LoggingConfig": {
"LogFormat": "Text",
"LogGroup": "/aws/lambda/exrecord-hello"
}
}
関数の実行
作成した関数を AWS CLI から実行します。実行結果は指定したファイルに書き込まれます。
❯ aws lambda invoke \
--function-name exrecord-hello \
--payload '{}' \
response.json
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
レスポンスの中身を確認します。
❯ cat response.json
{"statusCode": 200, "body": "Hello, World!"}
関数が正常に実行され、定義したレスポンスが返ってきています。ログは CloudWatch Logs の /aws/lambda/exrecord-hello グループに記録されます。
環境変数の設定
関数の設定に環境変数を追加します。ここでは STAGE という環境変数に production を設定します。
❯ aws lambda update-function-configuration \
--function-name exrecord-hello \
--environment "Variables={STAGE=production}"
実行結果
{
"FunctionName": "exrecord-hello",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:exrecord-hello",
"Runtime": "python3.12",
"Role": "arn:aws:iam::123456789012:role/exrecord-lambda-role",
"Handler": "lambda_function.lambda_handler",
"Environment": {
"Variables": {
"STAGE": "production"
}
},
"LastUpdateStatus": "InProgress"
}
設定した環境変数は、関数コード内で os.environ["STAGE"] のように取得できます。
関数 URL の作成
まず認証なし(NONE)で関数 URL を作成します。
❯ aws lambda create-function-url-config \
--function-name exrecord-hello \
--auth-type NONE
{
"FunctionUrl": "https://0a1b2c3d4e5f67890abcdef1234567890.lambda-url.ap-northeast-1.on.aws/",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:exrecord-hello",
"AuthType": "NONE",
"CreationTime": "2026-04-18T04:10:00.000000000Z"
}
作成しただけではまだ匿名アクセスができないため、add-permission でアクセス許可を追加します。関数 URL 経由の呼び出しを許可するには、lambda:InvokeFunctionUrl と lambda:InvokeFunction の 2 つの許可が必要です。
❯ aws lambda add-permission \
--function-name exrecord-hello \
--statement-id FunctionURLAllowPublicAccess \
--action lambda:InvokeFunctionUrl \
--principal "*" \
--function-url-auth-type NONE
❯ aws lambda add-permission \
--function-name exrecord-hello \
--statement-id FunctionURLAllowInvoke \
--action lambda:InvokeFunction \
--principal "*" \
--invoked-via-function-url
両方の許可を追加すると、関数 URL に直接アクセスできるようになります。
❯ curl https://0a1b2c3d4e5f67890abcdef1234567890.lambda-url.ap-northeast-1.on.aws/
Hello, World!
関数の削除
不要になった関数とロールは削除しましょう。関数を先に削除してから、IAM ロールのポリシーをデタッチしてロールを削除する順番で進めます。
❯ aws lambda delete-function \
--function-name exrecord-hello
{
"StatusCode": 204
}
IAM ロールを削除する前に、アタッチしたポリシーをデタッチします。
❯ aws iam detach-role-policy \
--role-name exrecord-lambda-role \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
ポリシーをデタッチしてからロールを削除します。
❯ aws iam delete-role \
--role-name exrecord-lambda-role
まとめ
AWS Lambda の基本概念と AWS CLI を使った関数の作成・実行手順について説明しました。
- Lambda はサーバーのプロビジョニングや管理が不要なサーバーレスコンピューティングサービス
- イベント駆動で動作し、リクエスト数に応じて自動的にスケールする
- 料金はコードの実行時間とリクエスト数に基づく従量課金で、アイドル時間のコストは発生しない
- Python・Node.js・Java など多くのランタイムをサポートしており、カスタムランタイムも利用できる
- 関数の実行には信頼ポリシーを設定した IAM ロールが必要で、CloudWatch Logs にログを記録するにはログ書き込み権限を持つマネージドポリシーをアタッチする
- 環境変数を使えばコードを変更せずに設定値を切り替えられるが、機密情報はシークレット管理サービス経由で扱う
- 関数 URL を使えば API Gateway を経由せずに Lambda 関数へ直接アクセスできるが、匿名アクセスを許可するには追加の権限設定が必要