
【VPC外リージョンサービス / ENIでVPC接続】
Lambda は、サーバーレスアーキテクチャを実現する FaaS(Function as a Service) 型のサービスです。
インフラの管理を不要にし、Event Source(イベントソース) からのトリガーに応じて自動的にコードを実行します。
Lambda は多様な Event Source に対応しており、例えば API Gateway からの HTTP リクエスト、S3 バケットへのファイルアップロード、EventBridge によるイベントスケジュール、SNS メッセージの受信、DynamoDB Streams の更新イベントなどを契機に処理を実行できます。これにより、完全なイベント駆動型アーキテクチャを簡単に構築できます。
関数実行時には、エントリーポイントとなる Handler(ハンドラー) が呼び出され、リクエスト内容に応じて処理が実行されます。Lambda の実行環境はリクエスト数に応じて自動的に コンカレンシー(並列スケール) し、サーバー容量を意識せず高負荷にも対応します。
Provisioned Concurrency(プロビジョンドコンカレンシー) を利用すれば、関数をあらかじめ一定数の環境でウォームアップしておき、Cold Start(コールドスタート) による起動遅延を防ぐことができます。
課金は100ミリ秒単位で行われるため、コスト効率に優れた運用が可能です。Lambda では、実行ロール(Execution Role / IAM Role) を利用してアクセス権限を細かく制御し、環境変数や SSM(AWS Systems Manager)パラメータストア を用いて設定情報を安全に外部化できます。
Layers(レイヤー) 機能によって共通ライブラリや依存パッケージを共有化し、複数関数間で効率的に利用することが可能です。
Lambda 関数は コンテナイメージ にも対応しており、最大10GBまでのイメージを ECR(Elastic Container Registry) からデプロイできます。これにより、DockerベースのアプリケーションをLambda上で実行し、開発環境との一貫性を保つことができます。
Lambda は VPC(Virtual Private Cloud)接続 に対応しており、プライベートサブネット内の RDS(Relational Database Service) や ElastiCache、内部APIへのアクセスも安全に行うことができます。
ワークフロー管理では、Step Functions と統合することで、複数のLambda関数を順序制御・分岐・例外処理を含めてオーケストレーションできます。また、失敗時には DLQ(Dead Letter Queue) に未処理イベントを送信し、Retry Policy(再試行ポリシー) と組み合わせることで、再試行やエラーハンドリングを柔軟に制御できます。
Lambda 関数はデプロイ時に Version(バージョン)とAlias(エイリアス) を管理でき、安定版リリースの固定化やBlue/Greenデプロイ(段階的なロールアウト)を容易に実現します。これにより、運用中の関数を安全かつ効率的に更新することが可能です。
重要用語
ユースケース
| イベント駆動のサーバーレスAPI | API Gatewayと組み合わせて、リクエストが来たときだけLambda関数を起動するサーバーレスなREST APIやWebhookエンドポイントを構築する。 |
| S3アップロードトリガーでの処理自動化 | S3にファイルがアップロードされたタイミングでLambdaを自動起動し、画像のサムネイル生成やCSVの整形などの処理を行う。 |
| 定期ジョブ・メンテナンスタスクの自動化 | EventBridgeのスケジュールルール(cron)からLambdaを定期的に呼び出し、ログの整理やヘルスチェックなどの軽量なバッチ処理を行う。 |
ベストプラクティス
| 最小権限のIAMロール | 関数ごとに必要最小限の権限のみを付与した実行ロールを使用する。 |
| タイムアウトとメモリの適切な設定 | 処理内容に応じてメモリとタイムアウトを調整し、性能とコストをバランスさせる。 |
| 並列実行数の制御 | 同時実行制限を設定して下流システムへの過負荷を防ぐ。 |
高可用性・バックアップ・リトライ
| 高可用性・バックアップ・リトライ設計のポイント |
|---|
| 【デフォルト】AWS内部で冗長化 ・コントロールプレーン ・関数コード(デプロイパッケージ) ・実行環境 ・イベントソース統合(トリガー管理層) ・ログ・メトリクス基盤(CloudWatch統合) ・ |
| VPC内配置時のマルチAZ設計(サブネットを複数AZに分散して指定する) |
| 【自動リトライ】同期呼び出し(API Gateway) なし(リトライは呼び出し元で実装する) |
| 【自動リトライ】非同期呼び出し(S3イベント、SNS通知トリガー、EventBridgeルール) Lambda関数がエラーを返す(例外発生、タイムアウトなど)と再試行は最大 2回(数秒後、数分後) |
| 【自動リトライ】イベントソースマッピング(SQS) Lambda関数がエラーを返すと可視性タイムアウト後に再配信、再試行は無限リトライ メッセージを捨てたい場合は DLQ (Dead Letter Queue) を設定 |
| 【自動リトライ】イベントソースマッピング(Kinesis Data Streams / DynamoDB Streams) Lambdaが処理失敗すると、同じバッチを最大7日間リトライ。 7日を超えても成功しない場合は、そのレコードは破棄される。 |
セキュリティ
| 関連サービス | 設定内容 |
|---|---|
| KMS(データの暗号化と鍵の安全管理) | - |
| Secrets Manager(機密情報の安全管理) | シークレット(秘密情報)の作成が推奨 関数で使うAPIキー・DB接続情報 |
| SSM Parameter Store(設定情報の一元管理) | パラメータ(Parameter)の作成が推奨 関数の環境変数・設定値・APIエンドポイント |
| CloudTrail(操作履歴の記録・監査・追跡) | 【自動記録】 作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI) 【記録有効化を推奨】 データ操作(関数のInvoke)(データプレーンAPI) |
| Config(リソースの構成状態・設定変更を記録) | 【Configが有効な場合】 関数/エイリアス/レイヤー設定変更履歴・暗号化/ネットワーク/ロギング準拠評価 |
| GuardDuty(脅威を自動検出) | 【GuardDutyが有効な場合】 関数操作や実行異常のAPI検知(重複でも重要) 【追加オプション】 Lambda Protection導入を推奨 Lambda 関数の呼び出しやネットワーク接続を監視し、脅威検出を行う Lambda 関数単位 Lambda={Enable=true} で有効化(CloudTrailデータが必要) |
Lambdaが実行ロールを引き受ける典型的な連携パターン
| 実行ロールを介して連携するサービス | 実行ロールにアタッチするポリシー |
|---|---|
| CloudWatch Logs | AWSLambdaBasicExecutionRole (CloudWatch Logs権限) |
| VPC接続 | AWSLambdaVPCAccessExecutionRole (CloudWatch Logs権限を含む) |
| ECR | ecr:GetAuthorizationToken ecr:BatchGetImage ecr:GetDownloadUrlForLayer ecr:BatchCheckLayerAvailability |
| RDS/Aurora | rds-db:connect |
DynamoDB | dynamodb:GetItem dynamodb:PutItem dynamodb:UpdateItem dynamodb:DeleteItem dynamodb:Query dynamodb:Scan |
| S3 | s3:ListBucket s3:GetObject s3:PutObject s3:DeleteObject* |
| ECS | ecs:RunTask ecs:DescribeTasks iam:PassRole |
| EventBridge(Event Bus) | events:PutEvents |
| Step Functions | states:StartExecution |
| Lambda | lambda:InvokeFunction |
| Kinesis Data Streams | kinesis:PutRecord kinesis:PutRecords |
| Athena | athena:StartQueryExecution athena:GetQueryExecution athena:GetQueryResults s3:GetObject s3:PutObject s3:ListBucket glue:GetDatabase glue:GetTable |
| Glue | glue:GetTable glue:StartJobRun glue:GetDatabase glue:GetPartitions |
| SQS(送信) | sqs:SendMessage |
| SNS | sns:Publish |
| SES | ses:SendEmail ses:SendRawEmail |
| X-Ray | xray:PutTraceSegments xray:PutTelemetryRecords |
| Comprehend | comprehend:DetectSentiment |
| Rekognition | rekognition:DetectLabels |
| Textract | textract:AnalyzeDocument |
| Secrets Manager | secretsmanager:GetSecretValue |
| SSM Run Command | ssm:SendCommand ssm:GetCommandInvocation |
| SSM Parameter Store | ssm:GetParameter |
| KMS | kms:Encrypt kms:Decrypt kms:GenerateDataKey kms:DescribeKey |
| 【イベントソースマッピング】 DynamoDB Streams | dynamodb:GetRecords dynamodb:GetShardIterator dynamodb:DescribeStream dynamodb:ListStreams |
| 【イベントソースマッピング】 Kinesis Data Streams | kinesis:GetRecords kinesis:GetShardIterator kinesis:DescribeStream kinesis:ListShards |
| 【イベントソースマッピング】 SQS | sqs:ReceiveMessage sqs:DeleteMessage sqs:GetQueueAttributes sqs:ChangeMessageVisibility |
信頼ポリシー: Lambda
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Lambda が使用する SLR の連携パターン
SLR名 : AWSServiceRoleForLambdaReplicator
| SLR が操作するサービス | 用途 |
|---|---|
| EC2 | VPC内での関数実行用のENI作成と管理 |
| CloudWatch Logs | 関数実行ログの出力 |
| X-Ray | 分散トレーシングデータの送信 |
リソースベースポリシーによる補完
実行ロールで不足する権限をLambda のリソースベースポリシーで補うパターン
| リソースベースポリシーのPrincipal | リソースベースポリシーのAction |
|---|---|
| 【API Gateway】 apigateway.amazonaws.com | lambda:InvokeFunction |
| 【ALB】 elasticloadbalancing.amazonaws.com | lambda:InvokeFunction |
| 【S3】 s3.amazonaws.com | lambda:InvokeFunction |
| 【SNS】 sns.amazonaws.com | lambda:InvokeFunction |
| 【CloudWatch Logs】 llogs.amazonaws.com | lambda:InvokeFunction |
| 【Cognito】 cognito-idp.amazonaws.com | lambda:InvokeFunction |
| 【CloudFormation】 cloudformation.amazonaws.com | lambda:InvokeFunction |
| 【Config】 config.amazonaws.com | lambda:InvokeFunction |
| 【Alexa】 alexa-appkit.amazon.com | lambda:InvokeFunction |
| 【Lex】 lexv2.amazonaws.com | lambda:InvokeFunction |
| 【IoT Core】 iot.amazonaws.com | lambda:InvokeFunction |
ログ・監視
| ログ出力先 | ログの種類 |
|---|---|
| CloudWatch Logs | 関数実行ログ |
標準メトリクス
| メトリクス名 | 説明 |
|---|---|
| Duration | 実行時間 |
| Invocations | 呼び出し回数 |
| IteratorAge | イテレーター経過時間 |
| PostRuntimeExtensionsDuration | ランタイム拡張後の実行時間 |
| ProvisionedConcurrencyInvocations | プロビジョニング済み同時実行呼び出し数 |
| ProvisionedConcurrencySpilloverInvocations | プロビジョニング済み同時実行溢れ呼び出し数 |
| ConcurrentExecutions | 同時実行数 |
| ProvisionedConcurrencyUtilization | プロビジョニング済み同時実行使用率 |
| ProvisionedConcurrentExecutions | プロビジョニング済み同時実行数 |
| UnreservedConcurrentExecutions | 予約なし同時実行数 |
| DeadLetterErrors | デッドレターエラー数 |
| DestinationDeliveryFailures | 宛先配信失敗数 |
| Errors | エラー数 |
| Throttles | スロットル数 |
制限値(固定値/ハードリミット/ソフトリミット)
| 固定値 | 制限値 |
|---|---|
| レイヤー数 | 5/関数 |
| ファイルディスクリプタ | 1,024 |
| 実行プロセス/スレッド | 1,024 |
| ハードリミット | 制限値 |
|---|---|
| 実行時間 | 900秒(15分) |
| メモリ割り当て | 128 MB - 10,240 MB(1 MB単位) |
| デプロイパッケージサイズ(ZIP圧縮時) | 50 MB(直接アップロード)、250 MB(S3経由) |
| デプロイパッケージサイズ(解凍後) | 250 MB |
| コンテナイメージサイズ | 10 GB(解凍後) |
| 環境変数の合計サイズ | 4 KB |
| レイヤーの合計サイズ(解凍後) | 250 MB |
| 同期呼び出しのペイロードサイズ | 6 MB(リクエスト・レスポンス) |
| 非同期呼び出しのペイロードサイズ | 256 KB |
| スケーリング速度 | 1,000実行環境/10秒 |
| ソフトリミット | 制限値 |
|---|---|
| 同時実行数 | 1,000(デフォルト) |
| リージョンあたりの関数コードストレージ | 75 GB |
AWS CLIのサンプルコード
SG を作成する(VPC ID 指定)
aws ec2 create-security-group \
--group-name lambda-sg \
--vpc-id vpc-xxxxxxxxx \
--tag-specifications 'ResourceType=security-group,Tags=[{Key=Name,Value=lambda-sg}]'
SG ID を表示する
aws ec2 describe-security-groups
アウトバウンドルールを追加する(SG ID 指定)
aws ec2 authorize-security-group-egress \
--group-id sg-xxxxxxxxx \
--protocol tcp \
--port 443 \
--cidr 0.0.0.0/0
SG を削除する(SG ID 指定)
aws ec2 delete-security-group \
--group-id sg-xxxxxxxxx
実行ロールを作成する
aws iam create-role \
--role-name my-lambda-role \
--assume-role-policy-document file://trust-policy.json
実行ロールを表示する
aws iam list-roles
実行ロールを削除する(IAMロール名 指定)
aws iam list-attached-role-policies \
--role-name my-lambda-role
実行ロールにIAMポリシーをアタッチする(実行ロール名 指定)
aws iam attach-role-policy \
--role-name my-lambda-role \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
実行ロールにIAMポリシーをデタッチする(実行ロール名 指定)
aws iam detach-role-policy \
--role-name my-lambda-role \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Lambda関数(VPC外)を作成する(実行ロールのARN 指定)
aws lambda create-function \
--function-name my-lambda-function \
--runtime python3.12 \
--role arn:aws:iam::123456789012:role/my-lambda-role \
--handler lambda_function.lambda_handler \
--zip-file fileb://lambda-function.zip \
--timeout 30 \
--memory-size 128
Lambda関数(VPC内)を作成する(実行ロールのARN、マルチAZのSubnet、SG ID 指定)
aws lambda create-function \
--function-name my-lambda-function \
--runtime python3.12 \
--role arn:aws:iam::123456789012:role/my-lambda-role \
--handler lambda_function.lambda_handler \
--zip-file fileb://lambda-function.zip \
--vpc-config SubnetIds=subnet-xxxxx,subnet-yyyyy,SecurityGroupIds=sg-xxxxx
Lambda関数の一覧を表示する
aws lambda list-functions
Lambda関数を表示する(Lambda関数名 指定)
aws lambda get-function \
--function-name my-lambda-function
Lambda関数を削除する
aws lambda delete-function \
--function-name my-lambda-function
Lambda関数を実行する
aws lambda invoke \
--function-name my-lambda-function \
--payload '{"key":"value"}' response.json
イベントソースマッピングを作成する(イベントソースのARN 指定)
aws lambda create-event-source-mapping \
--function-name my-lambda-function \
--event-source-arn arn:aws:sqs:ap-northeast-1:123456789012:order-processing-queue \
--batch-size 10
Lambda関数のUUIDを表示する(Lambda関数名 指定)
aws lambda list-event-source-mappings \
--function-name my-lambda-function
イベントソースマッピングを表示する(Lambda関数のUUID 指定)
aws lambda get-event-source-mapping \
--uuid 12345678-1234-1234-1234-123456789012
イベントソースマッピングを削除する(Lambda関数のUUID 指定)
aws lambda delete-event-source-mapping \
--uuid 12345678-1234-1234-1234-123456789012
CloudFormationのサンプルコード
Terraformのサンプルコード
料金計算
| 課金項目 | 説明 |
|---|---|
| リクエスト数 | 関数の呼び出し回数 |
| 実行時間 | GB-秒単位の実行時間(メモリ×実行時間) |
| データ転送 | インターネットへのデータ転送量 |