aws-serverless-eda
AWS Well-Architected Frameworkに基づくサーバーレス・イベント駆動アーキテクチャの専門スキルです。Lambda(TypeScript/Python)、API Gateway、DynamoDB、Step Functions、EventBridge、SQS、SNSを活用したサーバーレスAPIやマイクロサービス、非同期ワークフローの構築に使用します。「サーバーレス」「Lambda」「イベント駆動」「キュー」「pub/sub」などのキーワードが挙がった際に、AWSベストプラクティスに沿ったスケーラブルな設計を提供します。
description の原文を見る
AWS serverless and event-driven architecture expert based on Well-Architected Framework. Use when building serverless APIs, Lambda functions, REST APIs, microservices, or async workflows. Covers Lambda with TypeScript/Python, API Gateway (REST/HTTP), DynamoDB, Step Functions, EventBridge, SQS, SNS, and serverless patterns. Essential when user mentions serverless, Lambda, API Gateway, event-driven, async processing, queues, pub/sub, or wants to build scalable serverless applications with AWS best practices.
SKILL.md 本文
AWS サーバーレス & イベント駆動アーキテクチャ
このスキルは、Well-Architected Framework の原則に基づいて AWS でサーバーレスアプリケーションとイベント駆動アーキテクチャを構築するための包括的なガイダンスを提供します。
AWS ドキュメント要件
回答する前に、必ず MCP ツール (mcp__aws-mcp__* または mcp__*awsdocs*__*) を使用して AWS に関する事実を検証してください。aws-mcp-setup 依存関係は自動でロードされます。MCP ツールが利用できない場合は、そのスキルのセットアップフローをユーザーにガイドしてください。
サーバーレス MCP サーバー
このスキルは、CDK MCP サーバー(aws-cdk-development 依存関係で提供)と AWS Documentation MCP を活用してサーバーレスガイダンスを提供します。
注意: 以下の AWS MCP サーバーは、Full AWS MCP Server(
aws-mcp-setupスキルを参照)を通じて別途利用可能で、このプラグインにバンドルされていません:
- AWS Serverless MCP — SAM CLI ライフサイクル(init、deploy、ローカルテスト)
- AWS Lambda Tool MCP — 直接 Lambda 呼び出し
- AWS Step Functions MCP — ワークフロー オーケストレーション
- Amazon SNS/SQS MCP — メッセージングとキュー管理
このスキルを使用する場合
このスキルを以下の場合に使用してください:
- Lambda でサーバーレスアプリケーションを構築する
- イベント駆動アーキテクチャを設計する
- マイクロサービスパターンを実装する
- 非同期処理ワークフローを作成する
- マルチサービストランザクションをオーケストレーションする
- リアルタイムデータ処理パイプラインを構築する
- 分散トランザクションの Saga パターンを実装する
- スケールと回復力に向けて設計する
AWS Well-Architected サーバーレス設計原則
1. 速く、シンプル、単一目的
関数は簡潔で単一目的である必要があります
// ✅ 良い例 - 単一目的で焦点を当てた関数
export const processOrder = async (event: OrderEvent) => {
// 注文処理のみを処理
const order = await validateOrder(event);
await saveOrder(order);
await publishOrderCreatedEvent(order);
return { statusCode: 200, body: JSON.stringify({ orderId: order.id }) };
};
// ❌ 悪い例 - 関数が多すぎる処理を行う
export const handleEverything = async (event: any) => {
// 注文、在庫、支払い、配送を処理...
// 責務が多すぎる
};
関数をスムーズで効率的に、コスト意識を持って保つ:
- コールドスタート時間を最小化する
- メモリ割り当てを最適化する
- プロビジョニングされた並行実行は必要な場合のみ使用
- 接続の再利用を活用
2. 総リクエスト数ではなく並行リクエストを考える
ボリュームではなく並行性のために設計する
Lambda は水平にスケールします。設計上の考慮事項は以下に焦点を当てるべきです:
- 並行実行制限
- ダウンストリームサービスのスロットリング
- 共有リソースの競合
- コネクションプール サイジング
// DynamoDB にアクセスする並行 Lambda 実行を考慮する
const table = new dynamodb.Table(this, 'Table', {
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, // 負荷に自動スケール
});
// またはプロビジョニングされた容量 + 自動スケーリング
const table = new dynamodb.Table(this, 'Table', {
billingMode: dynamodb.BillingMode.PROVISIONED,
readCapacity: 5,
writeCapacity: 5,
});
// 並行負荷に対して自動スケーリングを有効化
table.autoScaleReadCapacity({ minCapacity: 5, maxCapacity: 100 });
table.autoScaleWriteCapacity({ minCapacity: 5, maxCapacity: 100 });
3. 何も共有しない
関数ランタイム環境は短命です
// ❌ 悪い例 - ローカルファイルシステムに依存
export const handler = async (event: any) => {
fs.writeFileSync('/tmp/data.json', JSON.stringify(data)); // 実行後に失われる
};
// ✅ 良い例 - 永続的なストレージを使用
export const handler = async (event: any) => {
await s3.putObject({
Bucket: process.env.BUCKET_NAME,
Key: 'data.json',
Body: JSON.stringify(data),
});
};
状態管理:
- 永続状態には DynamoDB を使用
- ワークフロー状態には Step Functions を使用
- セッション状態には ElastiCache を使用
- ファイルストレージには S3 を使用
4. ハードウェア アフィニティがないと仮定する
アプリケーションはハードウェアに依存しないである必要があります
インフラストラクチャは予告なく変更できます:
- Lambda 関数は異なるハードウェアで実行できます
- コンテナインスタンスは置き換わる可能性があります
- 基礎インフラストラクチャについての想定はできません
移植性のための設計:
- 構成に環境変数を使用
- ハードウェア固有の最適化を避ける
- 異なる環境をテスト
5. 関数チェーンではなく状態マシンでオーケストレーション
オーケストレーションに Step Functions を使用する
// ❌ 悪い例 - Lambda 関数チェーン
export const handler1 = async (event: any) => {
const result = await processStep1(event);
await lambda.invoke({
FunctionName: 'handler2',
Payload: JSON.stringify(result),
});
};
// ✅ 良い例 - Step Functions オーケストレーション
const stateMachine = new stepfunctions.StateMachine(this, 'OrderWorkflow', {
definition: stepfunctions.Chain
.start(validateOrder)
.next(processPayment)
.next(shipOrder)
.next(sendConfirmation),
});
Step Functions の利点:
- ビジュアルワークフロー表現
- ビルトイン エラーハンドリングと再試行
- 実行履歴とデバッグ
- 並列実行と順序実行
- コードなしのサービス統合
6. イベントを使用してトランザクションをトリガー
同期的なリクエスト/レスポンスよりもイベント駆動
// パターン: イベント駆動処理
const bucket = new s3.Bucket(this, 'DataBucket');
bucket.addEventNotification(
s3.EventType.OBJECT_CREATED,
new s3n.LambdaDestination(processFunction),
{ prefix: 'uploads/' }
);
// パターン: EventBridge 統合
const rule = new events.Rule(this, 'OrderRule', {
eventPattern: {
source: ['orders'],
detailType: ['OrderPlaced'],
},
});
rule.addTarget(new targets.LambdaFunction(processOrderFunction));
利点:
- サービス間の疎結合
- 非同期処理
- より良い障害耐性
- 独立したスケーリング
7. 障害と重複に対して設計する
オペレーションは冪等である必要があります
// ✅ 良い例 - 冪等オペレーション
export const handler = async (event: SQSEvent) => {
for (const record of event.Records) {
const orderId = JSON.parse(record.body).orderId;
// 既に処理されているか確認(冪等性)
const existing = await dynamodb.getItem({
TableName: process.env.TABLE_NAME,
Key: { orderId },
});
if (existing.Item) {
console.log('Order already processed:', orderId);
continue; // 重複をスキップ
}
// 注文を処理
await processOrder(orderId);
// 処理済みとしてマーク
await dynamodb.putItem({
TableName: process.env.TABLE_NAME,
Item: { orderId, processedAt: Date.now() },
});
}
};
指数バックオフを使用して再試行ロジックを実装:
async function withRetry<T>(fn: () => Promise<T>, maxRetries = 3): Promise<T> {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
if (i === maxRetries - 1) throw error;
await new Promise(resolve => setTimeout(resolve, Math.pow(2, i) * 1000));
}
}
throw new Error('Max retries exceeded');
}
アーキテクチャパターン
完全なコード例を含む詳細な実装パターンについては、リファレンスドキュメントを参照してください:
イベント駆動アーキテクチャパターン
ファイル: references/eda-patterns.md
- EventBridge を使用したイベント ルーター(カスタムイベントバス、スキーマレジストリ、ルールベースのルーティング)
- SQS を使用したキューベース処理(標準/FIFO、DLQ、Lambda コンシューマー)
- SNS + SQS によるパブ/サブ ファンアウト(マルチコンシューマー、フィルタリング)
- Step Functions を使用した Saga パターン(分散トランザクション、補償アクション)
- DynamoDB Streams を使用したイベントソーシング(追記のみのイベントストア、プロジェクション)
サーバーレス アーキテクチャパターン
ファイル: references/serverless-patterns.md
- API 駆動マイクロサービス(REST API + Lambda バックエンド)
- Kinesis によるストリーム処理(リアルタイム、バッチウィンドウ、エラー時二分探索)
- SQS による非同期タスク処理(バックグラウンドジョブ、並行実行制御)
- EventBridge を使用したスケジュール済みジョブ(cron/レート スケジュール)
- Webhook 処理(署名検証、非同期キュー転送)
重要: リファレンスの CDK コード例を使用する場合、リソース名をハードコードしないでください(例:
restApiName、eventBusName)。CDK に一意の名前を自動生成させて、再利用性と並列デプロイメントを実現します。詳細はaws-cdk-developmentスキルを参照してください。
ベストプラクティス
エラーハンドリング
包括的なエラーハンドリングを実装する:
export const handler = async (event: SQSEvent) => {
const failures: SQSBatchItemFailure[] = [];
for (const record of event.Records) {
try {
await processRecord(record);
} catch (error) {
console.error('Failed to process record:', record.messageId, error);
failures.push({ itemIdentifier: record.messageId });
}
}
// 部分的なバッチ失敗を返して再試行
return { batchItemFailures: failures };
};
Dead Letter Queue
常にエラーハンドリングの DLQ を構成する:
const dlq = new sqs.Queue(this, 'DLQ', {
retentionPeriod: Duration.days(14),
});
const queue = new sqs.Queue(this, 'Queue', {
deadLetterQueue: {
queue: dlq,
maxReceiveCount: 3,
},
});
// DLQ の深度を監視
new cloudwatch.Alarm(this, 'DLQAlarm', {
metric: dlq.metricApproximateNumberOfMessagesVisible(),
threshold: 1,
evaluationPeriods: 1,
alarmDescription: 'Messages in DLQ require attention',
});
可観測性
トレーシングと監視を有効化する:
new NodejsFunction(this, 'Function', {
entry: 'src/handler.ts',
tracing: lambda.Tracing.ACTIVE, // X-Ray トレーシング
environment: {
POWERTOOLS_SERVICE_NAME: 'order-service',
POWERTOOLS_METRICS_NAMESPACE: 'MyApp',
LOG_LEVEL: 'INFO',
},
});
MCP サーバーを効果的に使用する
サーバーレスインフラストラクチャを構築するときに、CDK MCP サーバー(aws-cdk-development 依存関係経由)を使用して、コンストラクト推奨事項と CDK 固有のガイダンスを取得します。
実装前にサービス機能、リージョナル可用性、API 仕様を検証するために AWS Documentation MCP を使用します。
追加リソース
このスキルは AWS ベストプラクティスに基づいた包括的なリファレンスドキュメントを含みます:
-
サーバーレスパターン:
references/serverless-patterns.md- コアサーバーレスアーキテクチャと API パターン
- データ処理と統合パターン
- Step Functions によるオーケストレーション
- 避けるべきアンチパターン
-
イベント駆動アーキテクチャパターン:
references/eda-patterns.md- イベント ルーティングと処理パターン
- イベントソーシングと Saga パターン
- 冪等性とエラーハンドリング
- メッセージの順序付けと重複排除
-
セキュリティベストプラクティス:
references/security-best-practices.md- 共有責任モデル
- IAM 最小権限パターン
- データ保護と暗号化
- VPC によるネットワークセキュリティ
-
可観測性ベストプラクティス:
references/observability-best-practices.md- 3 つの柱:メトリクス、ログ、トレース
- Lambda Powertools による構造化ログ
- X-Ray 分散トレーシング
- CloudWatch アラームとダッシュボード
-
パフォーマンス最適化:
references/performance-optimization.md- コールドスタート最適化テクニック
- メモリと CPU 最適化
- パッケージサイズの削減
- プロビジョニング並行実行パターン
-
デプロイメントベストプラクティス:
references/deployment-best-practices.md- CI/CD パイプライン設計
- テスト戦略(ユニット、統合、負荷)
- デプロイメント戦略(カナリア、ブルー/グリーン)
- ロールバックと安全メカニズム
外部リソース:
- AWS Well-Architected Serverless Lens: https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/
- ServerlessLand.com: 事前構築されたサーバーレスパターン
- AWS Serverless Workshops: https://serverlessland.com/learn?type=Workshops
詳細な実装パターン、アンチパターン、およびコード例については、スキルディレクトリ内の包括的なリファレンスを参照してください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- zxkane
- リポジトリ
- zxkane/aws-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/zxkane/aws-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。