mcpField
L
lambda

lambda

github.com/itsmostafaクラウド・DevOps1.2k176 回インストール2 日前に更新
リポジトリ

lambda について

AWS Lambda 関数を管理する開発者向けのリファレンススキルです。概念、AWS CLI と boto3 の例に加え、運用上の指針やトラブルシューティングをまとめています。

主な機能

  1. 01関数の作成と呼び出し
  2. 02S3 と SQS のイベント連携
  3. 03レイヤーと環境設定の管理
  4. 04パフォーマンス・セキュリティ・コストの指針
  5. 05CLI コマンドとトラブルシューティング

活用シーン

  1. 01Lambda 関数の作成と呼び出し
  2. 02S3 または SQS のイベントを関数に接続
  3. 03タイムアウト・メモリ・権限エラーの調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itsmostafa/aws-agent-skills --skill lambda

インストール後、Claude Code で/lambdaを入力して読み込まれたか確認します。

同梱ファイルdebugging.mddeployment.md

詳細

AWS Lambda

AWS Lambda は、サーバーをプロビジョニングすることなくコードを実行します。料金が発生するのは、使用したコンピューティング時間に対してのみです。Lambda は、1 日に数件のリクエストから毎秒数千件まで自動的にスケールします。

目次

基本概念

関数

設定とともにパッケージ化されたコードです。ランタイム、ハンドラー、メモリ、タイムアウト、IAM ロールが含まれます。

呼び出しタイプ
タイプ説明ユースケース
同期呼び出し元は応答を待ちますAPI Gateway、直接呼び出し
非同期呼び出して応答を待ちませんS3、SNS、EventBridge
ポーリングベースLambda がソースをポーリングしますSQS、Kinesis、DynamoDB Streams
実行環境

Lambda は、関数を実行するための実行環境を作成します。構成要素:

  • コールドスタート:新しい環境の初期化
  • ウォームスタート:既存の環境の再利用
  • ハンドラー:エントリーポイントとなる関数
  • コンテキスト:ランタイム情報
レイヤー

ライブラリ、依存関係、カスタムランタイムを再利用可能なパッケージにしたものです(関数ごとに最大 5 個)。

一般的なパターン

Python 関数を作成する

AWS CLI:

# Create deployment package
zip function.zip lambda_function.py

# Create function
aws lambda create-function \
  --function-name MyFunction \
  --runtime python3.12 \
  --role arn:aws:iam::123456789012:role/lambda-role \
  --handler lambda_function.handler \
  --zip-file fileb://function.zip \
  --timeout 30 \
  --memory-size 256

# Update function code
aws lambda update-function-code \
  --function-name MyFunction \
  --zip-file fileb://function.zip

boto3:

import boto3
import zipfile
import io

lambda_client = boto3.client('lambda')

# Create zip in memory
zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, 'w') as zf:
    zf.writestr('lambda_function.py', '''
def handler(event, context):
    return {"statusCode": 200, "body": "Hello"}
''')
zip_buffer.seek(0)

# Create function
lambda_client.create_function(
    FunctionName='MyFunction',
    Runtime='python3.12',
    Role='arn:aws:iam::123456789012:role/lambda-role',
    Handler='lambda_function.handler',
    Code={'ZipFile': zip_buffer.read()},
    Timeout=30,
    MemorySize=256
)
S3 トリガーを追加する
# Add permission for S3 to invoke Lambda
aws lambda add-permission \
  --function-name MyFunction \
  --statement-id s3-trigger \
  --action lambda:InvokeFunction \
  --principal s3.amazonaws.com \
  --source-arn arn:aws:s3:::my-bucket \
  --source-account 123456789012

# Configure S3 notification (see S3 skill)
SQS イベントソースを追加する
aws lambda create-event-source-mapping \
  --function-name MyFunction \
  --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
  --batch-size 10 \
  --maximum-batching-window-in-seconds 5
環境変数
aws lambda update-function-configuration \
  --function-name MyFunction \
  --environment "Variables={DB_HOST=mydb.cluster-xyz.us-east-1.rds.amazonaws.com,LOG_LEVEL=INFO}"
レイヤーを作成してアタッチする
# Create layer
zip -r layer.zip python/

aws lambda publish-layer-version \
  --layer-name my-dependencies \
  --compatible-runtimes python3.12 \
  --zip-file fileb://layer.zip

# Attach to function
aws lambda update-function-configuration \
  --function-name MyFunction \
  --layers arn:aws:lambda:us-east-1:123456789012:layer:my-dependencies:1
関数を呼び出す
# Synchronous invoke
aws lambda invoke \
  --function-name MyFunction \
  --payload '{"key": "value"}' \
  response.json

# Asynchronous invoke
aws lambda invoke \
  --function-name MyFunction \
  --invocation-type Event \
  --payload '{"key": "value"}' \
  response.json

CLI リファレンス

関数の管理
コマンド説明
aws lambda create-function新しい関数を作成します
aws lambda update-function-code関数のコードを更新します
aws lambda update-function-configuration設定を更新します
aws lambda delete-function関数を削除します
aws lambda list-functionsすべての関数を一覧表示します
aws lambda get-function関数の詳細を取得します
呼び出し
コマンド説明
aws lambda invoke関数を呼び出します
aws lambda invoke-async非同期で呼び出します(非推奨)
イベントソース
コマンド説明
aws lambda create-event-source-mappingイベントソースを追加します
aws lambda list-event-source-mappingsマッピングを一覧表示します
aws lambda update-event-source-mappingマッピングを更新します
aws lambda delete-event-source-mappingマッピングを削除します
権限
コマンド説明
aws lambda add-permissionリソースベースのポリシーを追加します
aws lambda remove-permission権限を削除します
aws lambda get-policyリソースポリシーを表示します

ベストプラクティス

パフォーマンス
  • メモリを適切なサイズにする:メモリを増やすと CPU も増え、実行が速くなります
  • コールドスタートを最小限にする:関数をウォーム状態に保ち、プロビジョニング済み同時実行を使用します
  • パッケージサイズを最適化する:パッケージが小さいほど、デプロイが速くなります
  • 共有依存関係にはレイヤーを使用する
  • ハンドラーの外部で初期化する:呼び出し間で接続を再利用します
# GOOD: Initialize outside handler
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('MyTable')

def handler(event, context):
    # Reuses existing connection
    return table.get_item(Key={'id': event['id']})
セキュリティ
  • 最小権限の IAM ロール — 必要な権限のみを付与します
  • 機密データにはSecrets Manager を使用する
  • 必要な場合にのみVPC を有効にする(レイテンシーが増加します)
  • 環境変数をKMS で暗号化する
コストの最適化
  • 適切なタイムアウトを設定する — 最大 15 分を不必要に使用しないでください
  • ARM アーキテクチャ(Graviton2)を使用すると、価格性能比が 34% 向上します
  • 可能な場合はバッチ処理する
  • コストを制限するには予約済み同時実行を使用する
信頼性
  • 非同期呼び出し用にDLQ を設定する
  • 再試行に対応する — 非同期イベントは 2 回再試行されます
  • ハンドラーを冪等にする
  • 構造化ロギングを使用する

トラブルシューティング

タイムアウトエラー

症状: Task timed out after X seconds

原因:

  • 関数の実行にタイムアウト時間を超える時間がかかっている
  • 到達不能なリソースへのネットワーク呼び出し
  • VPC の設定に関する問題

デバッグ:

# Check function configuration
aws lambda get-function-configuration \
  --function-name MyFunction \
  --query "Timeout"

# Increase timeout
aws lambda update-function-configuration \
  --function-name MyFunction \
  --timeout 60
メモリ不足

症状: 関数がメモリエラーでクラッシュする

修正方法:

aws lambda update-function-configuration \
  --function-name MyFunction \
  --memory-size 512
コールドスタートのレイテンシー

原因:

  • デプロイパッケージが大きい
  • VPC の設定
  • 読み込む依存関係が多い

解決策:

  • プロビジョニング済み同時実行を使用する
  • パッケージサイズを削減する
  • 依存関係にレイヤーを使用する
  • Graviton2(ARM)を検討する
# Enable Provisioned Concurrency
aws lambda put-provisioned-concurrency-config \
  --function-name MyFunction \
  --qualifier LIVE \
  --provisioned-concurrent-executions 5
アクセス拒否

症状: AccessDeniedException

デバッグ:

# Check execution role
aws lambda get-function-configuration \
  --function-name MyFunction \
  --query "Role"

# Check role policies
aws iam list-attached-role-policies \
  --role-name lambda-role
VPC 接続の問題

症状: インターネットまたは AWS サービスにアクセスできない

原因:

  • インターネットアクセス用の NAT ゲートウェイがない
  • AWS サービス用の VPC エンドポイントがない
  • セキュリティグループがアウトバウンド通信をブロックしている

解決策:

  • インターネット接続用に NAT ゲートウェイを追加する
  • AWS サービス用の VPC エンドポイントを追加する
  • セキュリティグループのルールを確認する

参考資料

コメント