mcpField
A
aws-cloudformation-lambda

aws-cloudformation-lambda

github.com/giuseppe-trisciuoglioクラウド・DevOps36567 回インストール7 週間前に更新
リポジトリ

aws-cloudformation-lambda について

CloudFormation で AWS Lambda を構築する開発者向けのスキルです。関数やイベント、関連リソースの設定に加え、検証・デプロイ・確認の手順を扱います。

主な機能

  1. 01関数パラメーターと設定の定義
  2. 02イベントソースと API Gateway の設定
  3. 03IAM ロールと最小権限の設定
  4. 04監視、バージョン、エイリアスの設定
  5. 05スタックの検証、デプロイ、確認

活用シーン

  1. 01CloudFormation による Lambda のデプロイ
  2. 02S3、SQS などのイベントトリガー設定
  3. 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.md
examples.md
reference.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 トレーシング、非同期呼び出し)

関連リソース

コメント