aws-cloudformation-lambda について
CloudFormation で AWS Lambda を構築する開発者向けのスキルです。関数やイベント、関連リソースの設定に加え、検証・デプロイ・確認の手順を扱います。
主な機能
- 01関数パラメーターと設定の定義
- 02イベントソースと API Gateway の設定
- 03IAM ロールと最小権限の設定
- 04監視、バージョン、エイリアスの設定
- 05スタックの検証、デプロイ、確認
活用シーン
- 01CloudFormation による Lambda のデプロイ
- 02S3、SQS などのイベントトリガー設定
- 03Lambda と API Gateway の連携
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-cloudformation-lambdaインストール後、Claude Code で/aws-cloudformation-lambdaを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/constraints.mdexamples.mdreference.md詳細
AWS CloudFormation Lambda 関数
概要
CloudFormation テンプレートを使用して、検証とデプロイのワークフローを備えた、本番環境に対応する Lambda 関数を作成します。
使用する場面
- CloudFormation で Lambda 関数を作成する場合
- イベントソース(S3、SQS、DynamoDB、Kinesis)を設定する場合
- Lambda レイヤーとコールドスタートの最適化を実装する場合
- Lambda を API Gateway と統合する場合
- 検証を伴う Lambda インフラストラクチャをデプロイする場合
デプロイのワークフロー
デプロイでは、必ず次のワークフローに従ってください。
1. テンプレートを検証する
aws cloudformation validate-template --template-body file://template.yaml
2. スタックをデプロイする
aws cloudformation deploy \
--template-file template.yaml \
--stack-name my-lambda-stack \
--capabilities CAPABILITY_IAM \
--parameter-overrides Environment=prod
3. スタックのイベントを監視する
aws cloudformation describe-stack-events \
--stack-name my-lambda-stack \
--query 'StackEvents[?ResourceStatus==`CREATE_FAILED`||ResourceStatus==`UPDATE_FAILED`]'
4. リソースを確認する
aws lambda get-function --function-name my-lambda-stack-function
aws cloudformation describe-stacks --stack-name my-lambda-stack \
--query 'Stacks[0].StackStatus'
5. 失敗した場合にロールバックする
aws cloudformation delete-stack --stack-name my-lambda-stack
aws logs describe-log-groups --log-group-name-prefix "/aws/lambda/my-lambda"
手順
CloudFormation で Lambda 関数を作成するには、次の手順に従ってください。
1. Lambda 関数のパラメーターを定義する
ランタイム、メモリ、タイムアウト、環境変数を指定します。
Parameters:
FunctionMemory:
Type: Number
Default: 256
AllowedValues:
- 128
- 256
- 512
- 1024
- 2048
Description: Lambda function memory in MB
FunctionTimeout:
Type: Number
Default: 30
MinValue: 1
MaxValue: 900
Description: Function timeout in seconds
Runtime:
Type: String
Default: nodejs20.x
AllowedValues:
- nodejs20.x
- python3.11
- java21
- dotnet8
- go1.x
Description: Lambda runtime environment
2. Lambda 関数を作成する
基本的な関数設定を定義します。
Resources:
LambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: !Sub "${AWS::StackName}-function"
Runtime: !Ref Runtime
Handler: index.handler
Role: !Ref ExecutionRole
MemorySize: !Ref FunctionMemory
Timeout: !Ref FunctionTimeout
Code:
S3Bucket: !Ref CodeBucket
S3Key: !Ref CodeKey
Environment:
Variables:
LOG_LEVEL: INFO
DATABASE_URL: !Ref DatabaseUrl
Tags:
- Key: Environment
Value: !Ref Environment
3. 実行ロールを設定する
最小権限の IAM ポリシーを適用します。
Resources:
ExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Policies:
- PolicyName: S3ReadAccess
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- s3:GetObject
Resource: !Sub "${DataBucket.Arn}/*"
4. イベントソースを追加する
Lambda を呼び出すトリガーを設定します。
Resources:
# S3 event source
S3EventSource:
Type: AWS::Lambda::EventSourceMapping
Properties:
EventSourceArn: !GetAtt DataBucket.Arn
FunctionName: !Ref LambdaFunction
# SQS event source
SQSEventSource:
Type: AWS::Lambda::EventSourceMapping
Properties:
EventSourceArn: !GetAtt Queue.Arn
FunctionName: !Ref LambdaFunction
BatchSize: 10
MaximumBatchingWindowInSeconds: 5
5. API Gateway との統合を設定する
REST API または HTTP API との統合を設定します。
Resources:
# HTTP API integration
HttpApi:
Type: AWS::ApiGatewayV2::Api
Properties:
Name: !Sub "${AWS::StackName}-api"
ProtocolType: HTTP
Target: !Ref LambdaFunction
ApiIntegration:
Type: AWS::ApiGatewayV2::Integration
Properties:
ApiId: !Ref HttpApi
IntegrationType: AWS_PROXY
IntegrationUri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunction.Arn}/invocations"
6. バージョンとエイリアスを実装する
関数のバージョンとエイリアスを作成します。
Resources:
LambdaVersion:
Type: AWS::Lambda::Version
Properties:
FunctionName: !Ref LambdaFunction
Description: !Sub "Version ${AWS::StackName} v1"
LambdaAlias:
Type: AWS::Lambda::Alias
Properties:
FunctionName: !Ref LambdaFunction
FunctionVersion: !GetAtt LambdaVersion.Version
Name: live
7. モニタリングを設定する
CloudWatch ログ記録と X-Ray トレースを有効にします。
Resources:
LambdaFunction:
Type: AWS::Lambda::Function
Properties:
LoggingConfig:
LogGroup: !Ref LogGroup
TracingConfig:
Mode: Active
LogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub "/aws/lambda/${LambdaFunction}"
RetentionInDays: 7
8. デッドレターキューを設定する
失敗した呼び出しに対する DLQ を設定します。
Resources:
DeadLetterQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub "${AWS::StackName}-dlq"
LambdaFunction:
Type: AWS::Lambda::Function
Properties:
DeadLetterConfig:
TargetArn: !GetAtt DeadLetterQueue.Arn
例
Lambda スタックテンプレートの全体例
AWSTemplateFormatVersion: '2010-09-09'
Description: Lambda function with monitoring and DLQ
Parameters:
FunctionMemory:
Type: Number
Default: 256
AllowedValues: [128, 256, 512, 1024]
FunctionTimeout:
Type: Number
Default: 30
Resources:
ExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal: { Service: lambda.amazonaws.com }
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
LambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: !Sub "${AWS::StackName}-function"
Runtime: nodejs20.x
Handler: index.handler
Role: !GetAtt ExecutionRole.Arn
MemorySize: !Ref FunctionMemory
Timeout: !Ref FunctionTimeout
Code:
S3Bucket: !Ref CodeBucket
S3Key: !Ref CodeKey
Environment:
Variables:
LOG_LEVEL: INFO
LambdaVersion:
Type: AWS::Lambda::Version
Properties:
FunctionName: !Ref LambdaFunction
LambdaAlias:
Type: AWS::Lambda::Alias
Properties:
FunctionName: !Ref LambdaFunction
FunctionVersion: !GetAtt LambdaVersion.Version
Name: live
Outputs:
FunctionArn:
Value: !GetAtt LambdaFunction.Arn
FunctionName:
Value: !Ref LambdaFunction
ベストプラクティス
パフォーマンスの最適化
- Java 関数では SnapStart を使用してコールドスタートをなくします
- 低レイテンシーが必要な重要な関数には、プロビジョニング済み同時実行を使用します
- デプロイパッケージは小さく保ちます(ZIP 圧縮時に 50 MB 未満)
- 関数の要件に応じてメモリサイズを最適化します
- 適切なタイムアウト値を設定します(最大タイムアウトは避けてください)
- スロットリングを防ぐため、予約済み同時実行を設定します
コストの最適化
- コスト効率を高めるため、メモリ割り当てを適正化します
- プロビジョニング済み同時実行は戦略的に使用します(アイドル時にもコストが発生します)
- Lambda の実行時間を監視し、実行を高速化するよう最適化します
- エフェメラルストレージ(/tmp)を効率的に使用します
- 使用していない Lambda 関数とバージョンを削除します
- 最適なメモリ/電力設定には、Lambda PowerTuning の利用を検討します
セキュリティ
- 実行ロールには最小権限の IAM ポリシーを適用します
- 保存時の環境変数を暗号化します
- プライベートな AWS サービスへのアクセスには VPC エンドポイントを使用します
- IAM 認証情報を定期的にローテーションします
- 関数へのプライベートアクセスには VPC 設定を実装します
- 機密データの暗号化には AWS KMS を使用します
信頼性
- 非同期呼び出しにはデッドレターキューを設定します
- 指数バックオフによる再試行ロジックを実装します
- エラー監視には CloudWatch アラームを使用します
- デプロイ前に Lambda 関数を十分にテストします
- 下流サービスの障害に備えてサーキットブレーカーを実装します
- Lambda エイリアスを使用したカナリアデプロイを行います
モニタリングと可観測性
- すべての関数で CloudWatch Logs を有効にします
- 分散トレースには X-Ray トレースを使用します
- パフォーマンス監視用に CloudWatch メトリクスを設定します
- エラー、スロットリング、実行時間に関するアラームを設定します
- デバッグには Lambda Insights を使用します
- 同時実行数とスロットリングを監視します
バージョン管理とデプロイ
- 本番環境(live、staging)では Lambda エイリアスを使用します
- 重み付きエイリアスを使用したカナリアデプロイを実装します
- イミュータブルなデプロイには関数バージョンを作成します
- Lambda のデプロイを簡素化するには SAM または AWS CDK を使用します
- Lambda エイリアスを使用したブルー/グリーンデプロイを実装します
- 関数の変更は、まず開発環境でテストします
制約事項と警告
- タイムアウト制限:Lambda のタイムアウトは最大 900 秒(15 分)です。孤立した実行を避けるため、適切な値を設定してください。
- デプロイパッケージのサイズ:圧縮パッケージは最大 50 MB、解凍後は最大 250 MB(レイヤーを含む)です。
- レイヤーの制限:関数ごとに最大 5 レイヤーで、各レイヤーは解凍後最大 50 MB です。
- 環境変数:すべての変数を合わせて最大 4 KB です。機密性の高い値は KMS で暗号化してください。
- コールドスタート:Java および .NET の関数はコールドスタートが長くなります。レイテンシが重要なワークロードでは、SnapStart または Provisioned Concurrency を使用してください。
- 同時実行:リージョンごとのデフォルト上限は 1000 です。トラフィックの多い関数では、上限の引き上げを申請してください。
- VPC ネットワーキング:VPC 内の Lambda では、初回呼び出しのコールドスタートに 10~30 秒のオーバーヘッドが追加されます。
- IAM 権限:Resource ポリシーで
*を使用しないでください。必ず特定のリソースに範囲を限定してください。 - デッドレターキュー:非同期呼び出しでは必須です。DLQ が関数と同じリージョンにあることを確認してください。
- コストのモニタリング:請求アラートを有効にしてください。Lambda の料金は呼び出し回数と実行時間に応じて発生します。
参考資料
詳細な実装ガイダンスについては、以下を参照してください。
- constraints.md - リソース制限(関数の制限、同時実行、タイムアウト、メモリ)、デプロイの制約(関数のサイズ、レイヤーのサイズ、環境変数)、運用上の制約(コールドスタート、VPC ネットワーキング、イベントソース、DLQ)、セキュリティ上の制約(実行ロール、リソースポリシー、VPC エンドポイント)、コストに関する考慮事項(プロビジョニングされた同時実行数、実行時間、メモリ、データ転送)、パフォーマンスの制約(SnapStart、レイヤーバージョニング、X-Ray トレーシング、非同期呼び出し)
関連リソース
コメント
Markdown 対応