aws-lambda-python-integration
aws-lambda-python-integration について
AWS Chalice または素の Python を使った AWS Lambda 関数の構築を支援するガイドスキルです。アーキテクチャ、コールドスタートや接続管理のパターン、API Gateway または ALB との連携、デプロイ方法を扱います。
主な機能
- 01AWS Chalice と素の Python の方式
- 02コールドスタート最適化パターン
- 03クライアント再利用と接続管理
- 04API Gateway と ALB の連携ガイド
- 05サーバーレスデプロイ例
活用シーン
- 01Python Lambda 関数の作成開始
- 02Python アプリケーションの Lambda 移行
- 03コールドスタートの負荷軽減
- 04API Gateway または ALB 連携の設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-lambda-python-integrationインストール後、Claude Code で/aws-lambda-python-integrationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/chalice-lambda.mdraw-python-lambda.mdserverless-deployment.mdtesting-lambda.md詳細
AWS Lambda Python 統合
最適化されたコールドスタートとクリーンなアーキテクチャを備えた、高性能な AWS Lambda 関数を Python で作成するためのパターンです。
概要
AWS Lambda の Python 統合には、AWS Chalice(フル機能のフレームワーク)と Raw Python(オーバーヘッドを最小限に抑える方法)の 2 つのアプローチがあります。どちらも、本番環境向けの設定で API Gateway/ALB との統合をサポートします。
使用する場面
次のような場合に、このスキルを使用してください。
- Python で新しい Lambda 関数を作成する
- 既存の Python アプリケーションを Lambda に移行する
- Python Lambda のコールドスタート性能を最適化する
- フレームワークを使う方法と、最小限の Python による方法のどちらを選ぶか検討する
- API Gateway または ALB との統合を設定する
- Python Lambda 用のデプロイパイプラインを構築する
手順
1. アプローチを選択する
| アプローチ | コールドスタート | 最適な用途 | 複雑さ |
|---|---|---|---|
| AWS Chalice | < 200ms | REST API、迅速な開発、組み込みルーティング | 低 |
| Raw Python | < 100ms | シンプルなハンドラー、最大限の制御、最小限の依存関係 | 低 |
2. プロジェクト構成
AWS Chalice の構成
my-chalice-app/
├── app.py # Main application with routes
├── requirements.txt # Dependencies
├── .chalice/
│ ├── config.json # Chalice configuration
│ └── deploy/ # Deployment artifacts
├── chalicelib/ # Additional modules
│ ├── __init__.py
│ └── services.py
└── tests/
└── test_app.py
Raw Python の構成
my-lambda-function/
├── lambda_function.py # Handler entry point
├── requirements.txt # Dependencies
├── template.yaml # SAM/CloudFormation template
└── src/ # Additional modules
├── __init__.py
├── handlers.py
└── utils.py
3. 実装例
詳しい実装ガイドについては、リファレンスセクションを参照してください。簡単な例:
AWS Chalice:
from chalice import Chalice
app = Chalice(app_name='my-api')
@app.route('/')
def index():
return {'message': 'Hello from Chalice!'}
Raw Python:
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps({'message': 'Hello from Lambda!'})
}
主な概念
コールドスタートの最適化
主な戦略:
- モジュールレベルで初期化する - ウォーム状態の呼び出し間で保持されます
- 遅延読み込みを使用する - 必要になるまで重いインポートを遅らせます
- boto3 クライアントをキャッシュする - 呼び出し間で接続を再利用します
詳しいパターンについては、Raw Python Lambdaを参照してください。
接続管理
クライアントをモジュールレベルで作成し、再利用します。
_dynamodb = None
def get_table():
global _dynamodb
if _dynamodb is None:
_dynamodb = boto3.resource('dynamodb').Table('my-table')
return _dynamodb
環境設定
class Config:
TABLE_NAME = os.environ.get('TABLE_NAME')
DEBUG = os.environ.get('DEBUG', 'false').lower() == 'true'
@classmethod
def validate(cls):
if not cls.TABLE_NAME:
raise ValueError("TABLE_NAME required")
ベストプラクティス
メモリとタイムアウトの設定
- メモリ:シンプルなハンドラーでは 256MB、複雑な処理では 512MB から始めます
- タイムアウト:想定される処理時間に基づいて設定します
- シンプルなハンドラー:3~5 秒
- DB 呼び出しを伴う API:10~15 秒
- データ処理:30~60 秒
依存関係
requirements.txt を最小限に抑えます。
# Core AWS SDK - always needed
boto3>=1.35.0
# Only add what you need
requests>=2.32.0 # If calling external APIs
pydantic>=2.5.0 # If using data validation
エラー処理
リクエスト ID とともに適切な HTTP コードを返します。
def lambda_handler(event, context):
try:
result = process_event(event)
return {'statusCode': 200, 'body': json.dumps(result)}
except ValueError as e:
return {'statusCode': 400, 'body': json.dumps({'error': str(e)})}
except Exception as e:
print(f"Error: {str(e)}") # Log to CloudWatch
return {'statusCode': 500, 'body': json.dumps({'error': 'Internal error'})}
構造化エラー処理のパターンについては、Raw Python Lambdaを参照してください。
ロギング
CloudWatch Insights 用に構造化ロギングを使用します。
import logging, json
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Structured log
logger.info(json.dumps({
'eventType': 'REQUEST',
'requestId': context.aws_request_id,
'path': event.get('path')
}))
高度なパターンについては、Raw Python Lambdaを参照してください。
デプロイオプション
クイックスタート
検証チェックポイント: 設定エラーを早期に検出するため、デプロイ前に必ず
serverless printまたはsam validateを実行してください。
Serverless Framework:
# serverless.yml
service: my-python-api
provider:
name: aws
runtime: python3.12 # or python3.11
functions:
api:
handler: lambda_function.lambda_handler
events:
- http:
path: /{proxy+}
method: ANY
AWS SAM:
# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
ApiFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./
Handler: lambda_function.lambda_handler
Runtime: python3.12 # or python3.11
Events:
ApiEvent:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY
AWS Chalice:
chalice new-project my-api
cd my-api
chalice local 8080 # Test locally before deploying
chalice deploy --stage dev
検証チェックポイント: 本番環境にデプロイする前に、
chalice localまたはsam local invokeでローカルテストを行ってください。
CI/CD、環境ごとの設定、高度な SAM/Serverless パターンを含む完全なデプロイ設定については、Serverless Deploymentを参照してください。
制約と警告
Lambda の制限
- デプロイパッケージ:展開後は最大 250MB(圧縮後は 50MB)
- メモリ:128MB~10GB
- タイムアウト:最大 15 分
- 同時実行数:デフォルトで 1000(調整可能)
- 環境変数:合計サイズ 4KB
Python 固有の考慮事項
- コールドスタート:Python はコールドスタート性能に優れています。モジュールレベルで重いインポートを行わないようにしてください
- 依存関係:
requirements.txtを最小限に抑え、共有する依存関係には Lambda Layers を使用してください - ネイティブ依存関係:Amazon Linux 2 向け(x86_64 または arm64)にコンパイルする必要があります
よくある落とし穴
- モジュールレベルで重いライブラリをインポートする - 常に必要でない場合は、関数内に移動します
- Lambda コンテキストを処理しない - タイムアウトを考慮するため、
context.get_remaining_time_in_millis()を使用します - 入力を検証しない - イベントデータは必ず検証し、サニタイズします
- 機密データを出力する - ログや CloudWatch の取り扱いには注意します
エラー復旧: デプロイに失敗した場合は、CloudWatch のログで初期化エラーを確認し、sam logs を実行して問題を診断します。
セキュリティに関する考慮事項
- 認証情報をハードコードせず、IAM ロールと環境変数を使用します
- すべての入力データを検証します
- 最小権限の IAM ポリシーを使用します
- 監査ログ用に CloudTrail を有効にします
リファレンス
特定のトピックの詳細なガイダンスについては、以下を参照してください。
- AWS Chalice - Chalice のセットアップ、ルーティング、ミドルウェア、デプロイの完全なガイド
- Raw Python Lambda - 最小限のハンドラーパターン、モジュールキャッシュ、パッケージング
- Serverless Deployment - Serverless Framework、SAM、CI/CD パイプライン
- Testing Lambda - pytest、moto、SAM Local、localstack
例
例 1:AWS Chalice REST API を作成する
入力:
Create a Python Lambda REST API using AWS Chalice for a todo application
手順:
chalice new-projectで Chalice プロジェクトを初期化します- CRUD 操作用のルートを設定します
- DynamoDB との連携を設定します
- デプロイステージを設定します
chalice deployでデプロイします
出力:
- Chalice プロジェクトの完全な構成
- CRUD エンドポイントを備えた REST API
- DynamoDB テーブルの設定
- デプロイ設定
例 2:Raw Python のコールドスタートを最適化する
入力:
My Python Lambda has slow cold start, how do I optimize it?
手順:
- インポートと初期化コードを分析します
- 重いインポートを関数内に移動します(遅延読み込み)
- boto3 クライアントをモジュールレベルでキャッシュします
- 不要な依存関係を削除します
- 必要に応じてプロビジョニング済み同時実行を使用します
出力:
- 遅延読み込みを適用したリファクタリング済みコード
- 最適化されたコールドスタート(< 100ms)
- 依存関係の分析
例 3:GitHub Actions でデプロイする
入力:
Configure CI/CD for Python Lambda with SAM
手順:
- GitHub Actions ワークフローを作成します
- Python 環境と依存関係を設定します
- カバレッジを測定しながら pytest を実行します
- SAM でパッケージ化します
- dev/prod ステージにデプロイします
出力:
- 完全な
.github/workflows/deploy.yml - マルチステージパイプライン
- 統合されたテスト自動化
バージョン
バージョン:1.0.0