lambda について
AWS Lambda 関数を管理する開発者向けのリファレンススキルです。概念、AWS CLI と boto3 の例に加え、運用上の指針やトラブルシューティングをまとめています。
主な機能
- 01関数の作成と呼び出し
- 02S3 と SQS のイベント連携
- 03レイヤーと環境設定の管理
- 04パフォーマンス・セキュリティ・コストの指針
- 05CLI コマンドとトラブルシューティング
活用シーン
- 01Lambda 関数の作成と呼び出し
- 02S3 または SQS のイベントを関数に接続
- 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 エンドポイントを追加する
- セキュリティグループのルールを確認する
参考資料
コメント
Markdown 対応