Lambda

【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デプロイ(段階的なロールアウト)を容易に実現します。これにより、運用中の関数を安全かつ効率的に更新することが可能です。

重要用語

ユースケース

イベント駆動のサーバーレスAPIAPI 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が実行ロールを引き受ける典型的な連携パターン
実行ロールを介して連携するサービス実行ロールにアタッチするポリシー
VPC接続AWSLambdaVPCAccessExecutionRole
CloudWatch Logslogs:CreateLogGroup
logs:CreateLogStream
logs:PutLogEvents
ECRecr:GetAuthorizationToken
ecr:BatchGetImage
ecr:GetDownloadUrlForLayer
ecr:BatchCheckLayerAvailability
RDS/Aurorards-db:connect

DynamoDB
dynamodb:GetItem
dynamodb:PutItem
dynamodb:UpdateItem
dynamodb:DeleteItem
dynamodb:Query
dynamodb:Scan
S3s3:ListBucket
s3:GetObject
s3:PutObject
s3:DeleteObject*
ECSecs:RunTask
ecs:DescribeTasks
iam:PassRole
EventBridge(Event Bus)events:PutEvents
Step Functionsstates:StartExecution
Lambdalambda:InvokeFunction
Kinesis Data Streamskinesis:PutRecord
kinesis:PutRecords
Athenaathena:StartQueryExecution
athena:GetQueryExecution
athena:GetQueryResults
s3:GetObject
s3:PutObject
s3:ListBucket
glue:GetDatabase
glue:GetTable
Glueglue:GetTable
glue:StartJobRun
glue:GetDatabase
glue:GetPartitions
SQS(送信)sqs:SendMessage
SNSsns:Publish
SESses:SendEmail
ses:SendRawEmail
X-Rayxray:PutTraceSegments
xray:PutTelemetryRecords
Comprehendcomprehend:DetectSentiment
Rekognitionrekognition:DetectLabels
Textracttextract:AnalyzeDocument
Secrets Managersecretsmanager:GetSecretValue
SSM Run Commandssm:SendCommand
ssm:GetCommandInvocation
SSM Parameter Storessm:GetParameter
KMSkms: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 が操作するサービス用途
EC2VPC内での関数実行用の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関数実行ログ
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-秒単位の実行時間(メモリ×実行時間)
データ転送インターネットへのデータ転送量
料金計算ツール

公式ページ

AWSドキュメント Lambda