powertools-lambda
AWS Lambda Powertoolsのエキスパートとして、サーバーレス開発者が、定型コードなしで、ログ出力、分散トレース、カスタムメトリクス、冪等性、機能フラグ、パラメータ管理、イベント解析などをLambda関数に簡単に追加できるように支援するSkill。
📜 元の英語説明(参考)
You are an expert in AWS Lambda Powertools, the developer toolkit for implementing serverless best practices. You help developers add structured logging, distributed tracing (X-Ray), custom metrics (CloudWatch EMF), idempotency, feature flags, parameter management, and event parsing to Lambda functions — with zero boilerplate using decorators and middleware.
🇯🇵 日本人クリエイター向け解説
AWS Lambda Powertoolsのエキスパートとして、サーバーレス開発者が、定型コードなしで、ログ出力、分散トレース、カスタムメトリクス、冪等性、機能フラグ、パラメータ管理、イベント解析などをLambda関数に簡単に追加できるように支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o powertools-lambda.zip https://jpskill.com/download/15277.zip && unzip -o powertools-lambda.zip && rm powertools-lambda.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15277.zip -OutFile "$d\powertools-lambda.zip"; Expand-Archive "$d\powertools-lambda.zip" -DestinationPath $d -Force; ri "$d\powertools-lambda.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
powertools-lambda.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
powertools-lambdaフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
AWS Lambda Powertools — サーバーレスのベストプラクティス
AWS Lambda Powertoolsのエキスパートとして、サーバーレスのベストプラクティスを実装するための開発者向けツールキットについて説明します。デコレーターとミドルウェアを使用することで、ボイラープレートコードを記述することなく、構造化ロギング、分散トレーシング(X-Ray)、カスタムメトリクス(CloudWatch EMF)、冪等性、フィーチャーフラグ、パラメータ管理、イベント解析をLambda関数に追加するのを支援します。
主要な機能
TypeScript
// handler.ts — Powertoolsミドルウェアを使用したLambda
import { Logger } from "@aws-lambda-powertools/logger";
import { Tracer } from "@aws-lambda-powertools/tracer";
import { Metrics, MetricUnit } from "@aws-lambda-powertools/metrics";
import { injectLambdaContext } from "@aws-lambda-powertools/logger/middleware";
import { captureLambdaHandler } from "@aws-lambda-powertools/tracer/middleware";
import { logMetrics } from "@aws-lambda-powertools/metrics/middleware";
import middy from "@middy/core";
const logger = new Logger({ serviceName: "payment-service" });
const tracer = new Tracer({ serviceName: "payment-service" });
const metrics = new Metrics({ namespace: "PaymentService", serviceName: "payment-service" });
const lambdaHandler = async (event: APIGatewayProxyEvent) => {
// 相関IDを使用した構造化ロギング
logger.appendKeys({ orderId: event.pathParameters?.id });
logger.info("Processing payment", { amount: 29.99, currency: "USD" });
// カスタムメトリクス(CloudWatchに自動的に公開されます)
metrics.addMetric("PaymentProcessed", MetricUnit.Count, 1);
metrics.addMetric("PaymentAmount", MetricUnit.None, 29.99);
metrics.addDimension("PaymentMethod", "card");
// トレーシング(X-Rayサブセグメント)
const subsegment = tracer.getSegment()?.addNewSubsegment("stripe-charge");
try {
const charge = await processStripePayment(event);
subsegment?.addAnnotation("chargeId", charge.id);
tracer.addResponseAsMetadata(charge);
return { statusCode: 200, body: JSON.stringify(charge) };
} catch (error) {
subsegment?.addError(error as Error);
logger.error("Payment failed", error as Error);
metrics.addMetric("PaymentFailed", MetricUnit.Count, 1);
throw error;
} finally {
subsegment?.close();
}
};
// Middyミドルウェアスタック
export const handler = middy(lambdaHandler)
.use(injectLambdaContext(logger, { logEvent: true }))
.use(captureLambdaHandler(tracer))
.use(logMetrics(metrics));
冪等性
import { makeIdempotent, IdempotencyConfig } from "@aws-lambda-powertools/idempotency";
import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
const persistenceStore = new DynamoDBPersistenceLayer({
tableName: "idempotency-table",
});
const config = new IdempotencyConfig({
eventKeyJmesPath: "body.orderId", // イベントからの重複排除キー
expiresAfterSeconds: 3600, // 1時間のTTL
});
const processPayment = async (event: any) => {
const body = JSON.parse(event.body);
// この関数は、再試行時でもorderIdごとに正確に1回実行されます
const result = await chargeCard(body.orderId, body.amount);
return { statusCode: 200, body: JSON.stringify(result) };
};
export const handler = makeIdempotent(processPayment, {
persistenceStore,
config,
});
Python
from aws_lambda_powertools import Logger, Tracer, Metrics
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.logging import correlation_paths
logger = Logger(service="user-service")
tracer = Tracer(service="user-service")
metrics = Metrics(namespace="UserService")
app = APIGatewayRestResolver()
@app.get("/users/<user_id>")
@tracer.capture_method
def get_user(user_id: str):
logger.info("Fetching user", extra={"user_id": user_id})
user = db.get_user(user_id)
metrics.add_metric(name="UserFetched", unit="Count", value=1)
return {"user": user}
@app.post("/users")
@tracer.capture_method
def create_user():
body = app.current_event.json_body
user = db.create_user(body)
metrics.add_metric(name="UserCreated", unit="Count", value=1)
return {"user": user}, 201
@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)
@tracer.capture_lambda_handler
@metrics.log_metrics(capture_cold_start_metric=True)
def lambda_handler(event: dict, context: LambdaContext) -> dict:
return app.resolve(event, context)
インストール
# TypeScript
npm install @aws-lambda-powertools/logger @aws-lambda-powertools/tracer @aws-lambda-powertools/metrics
# Python
pip install aws-lambda-powertools
ベストプラクティス
- 構造化ロギング — 相関IDを含むJSONログには
Loggerを使用します。CloudWatch Insightsクエリを有効にします。 - 分散トレーシング — X-Rayで
Tracerを使用します。Lambda → DynamoDB → SQS → Lambdaチェーン全体でリクエストをトレースします。 - カスタムメトリクス — EMF形式で
Metricsを使用します。API呼び出しなしでCloudWatchが取得し、コストオーバーヘッドはゼロです。 - 冪等性 — 支払い/注文ハンドラーに使用します。Lambdaの再試行時に重複処理を防ぎます。
- イベント解析 — API Gateway、SQS、S3イベントにはイベントハンドラーリゾルバーを使用します。型安全で検証も可能です。
- コールドスタートメトリクス —
capture_cold_start_metricを有効にします。関数ごとのコールドスタートを追跡および最適化します。 - 相関ID — API Gateway、ALB、またはカスタムヘッダーから自動的に挿入します。リクエストをエンドツーエンドでトレースします。
- Middyミドルウェア — TypeScriptでPowertoolsをmiddyミドルウェアとしてスタックします。関心の分離を明確にします。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
AWS Lambda Powertools — Serverless Best Practices
You are an expert in AWS Lambda Powertools, the developer toolkit for implementing serverless best practices. You help developers add structured logging, distributed tracing (X-Ray), custom metrics (CloudWatch EMF), idempotency, feature flags, parameter management, and event parsing to Lambda functions — with zero boilerplate using decorators and middleware.
Core Capabilities
TypeScript
// handler.ts — Lambda with Powertools middleware
import { Logger } from "@aws-lambda-powertools/logger";
import { Tracer } from "@aws-lambda-powertools/tracer";
import { Metrics, MetricUnit } from "@aws-lambda-powertools/metrics";
import { injectLambdaContext } from "@aws-lambda-powertools/logger/middleware";
import { captureLambdaHandler } from "@aws-lambda-powertools/tracer/middleware";
import { logMetrics } from "@aws-lambda-powertools/metrics/middleware";
import middy from "@middy/core";
const logger = new Logger({ serviceName: "payment-service" });
const tracer = new Tracer({ serviceName: "payment-service" });
const metrics = new Metrics({ namespace: "PaymentService", serviceName: "payment-service" });
const lambdaHandler = async (event: APIGatewayProxyEvent) => {
// Structured logging with correlation IDs
logger.appendKeys({ orderId: event.pathParameters?.id });
logger.info("Processing payment", { amount: 29.99, currency: "USD" });
// Custom metrics (published to CloudWatch automatically)
metrics.addMetric("PaymentProcessed", MetricUnit.Count, 1);
metrics.addMetric("PaymentAmount", MetricUnit.None, 29.99);
metrics.addDimension("PaymentMethod", "card");
// Tracing (X-Ray subsegments)
const subsegment = tracer.getSegment()?.addNewSubsegment("stripe-charge");
try {
const charge = await processStripePayment(event);
subsegment?.addAnnotation("chargeId", charge.id);
tracer.addResponseAsMetadata(charge);
return { statusCode: 200, body: JSON.stringify(charge) };
} catch (error) {
subsegment?.addError(error as Error);
logger.error("Payment failed", error as Error);
metrics.addMetric("PaymentFailed", MetricUnit.Count, 1);
throw error;
} finally {
subsegment?.close();
}
};
// Middy middleware stack
export const handler = middy(lambdaHandler)
.use(injectLambdaContext(logger, { logEvent: true }))
.use(captureLambdaHandler(tracer))
.use(logMetrics(metrics));
Idempotency
import { makeIdempotent, IdempotencyConfig } from "@aws-lambda-powertools/idempotency";
import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
const persistenceStore = new DynamoDBPersistenceLayer({
tableName: "idempotency-table",
});
const config = new IdempotencyConfig({
eventKeyJmesPath: "body.orderId", // Dedup key from event
expiresAfterSeconds: 3600, // 1 hour TTL
});
const processPayment = async (event: any) => {
const body = JSON.parse(event.body);
// This function runs EXACTLY ONCE per orderId, even on retries
const result = await chargeCard(body.orderId, body.amount);
return { statusCode: 200, body: JSON.stringify(result) };
};
export const handler = makeIdempotent(processPayment, {
persistenceStore,
config,
});
Python
from aws_lambda_powertools import Logger, Tracer, Metrics
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.logging import correlation_paths
logger = Logger(service="user-service")
tracer = Tracer(service="user-service")
metrics = Metrics(namespace="UserService")
app = APIGatewayRestResolver()
@app.get("/users/<user_id>")
@tracer.capture_method
def get_user(user_id: str):
logger.info("Fetching user", extra={"user_id": user_id})
user = db.get_user(user_id)
metrics.add_metric(name="UserFetched", unit="Count", value=1)
return {"user": user}
@app.post("/users")
@tracer.capture_method
def create_user():
body = app.current_event.json_body
user = db.create_user(body)
metrics.add_metric(name="UserCreated", unit="Count", value=1)
return {"user": user}, 201
@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)
@tracer.capture_lambda_handler
@metrics.log_metrics(capture_cold_start_metric=True)
def lambda_handler(event: dict, context: LambdaContext) -> dict:
return app.resolve(event, context)
Installation
# TypeScript
npm install @aws-lambda-powertools/logger @aws-lambda-powertools/tracer @aws-lambda-powertools/metrics
# Python
pip install aws-lambda-powertools
Best Practices
- Structured logging — Use Logger for JSON logs with correlation IDs; enables CloudWatch Insights queries
- Distributed tracing — Use Tracer with X-Ray; trace requests across Lambda → DynamoDB → SQS → Lambda chains
- Custom metrics — Use Metrics with EMF format; CloudWatch picks up without API calls, zero cost overhead
- Idempotency — Use for payment/order handlers; prevents duplicate processing on Lambda retries
- Event parsing — Use event handler resolvers for API Gateway, SQS, S3 events; type-safe with validation
- Cold start metric — Enable
capture_cold_start_metric; track and optimize cold starts per function - Correlation IDs — Inject automatically from API Gateway, ALB, or custom headers; trace requests end-to-end
- Middy middleware — Stack Powertools as middy middleware in TypeScript; clean separation of concerns