サーバーレスアーキテクチャ
サーバーの管理を意識せずにアプリケーションを構築・実行するサーバーレスアーキテクチャについて学びます。AWS Lambda、API Gateway、SQS、SNS、EventBridge、Step Functionsの各サービスの特徴と統合パターンを解説します。
所要時間
約50分
学べること
- サーバーレスの概念と従来型アーキテクチャとの違い
- Lambda関数の作成、設定、最適化
- API GatewayによるAPIエンドポイントの構築
- SQS/SNSによる非同期メッセージング
- EventBridgeによるイベント駆動設計
- Step Functionsによるワークフローオーケストレーション
- IDサービスにおけるサーバーレス活用パターン
前提知識
- AWSの基本概念(IAM、VPC等)
- REST APIの基本知識
- プログラミングの基礎(Python or Node.js)
目次
- サーバーレスとは何か
- Lambda概要
- Lambda関数の作成
- Lambdaのコールドスタートと対策
- Lambdaの制限と料金モデル
- API Gateway
- API Gateway + Lambda 統合パターン
- SQS(Simple Queue Service)
- SNS(Simple Notification Service)
- EventBridge
- Kinesis Data Streams
- Kinesis Data Firehose
- Step Functions
- IDサービスでの活用
- まとめ
1. サーバーレスとは何か
サーバーレスは、サーバーのプロビジョニングや管理をクラウドプロバイダーに任せ、開発者はアプリケーションコードに集中できるアーキテクチャモデルです。
従来型 vs サーバーレス
従来型:
+-------+ +-------+ +-------+
| EC2-1 | | EC2-2 | | EC2-3 | ← 常時起動、未使用時も課金
+-------+ +-------+ +-------+
| | |
+-----+------+-----+-----+
| |
+---------+ +---------+
| OS管理 | | パッチ | ← 運用負担
+---------+ +---------+
サーバーレス:
リクエスト
|
+---------v---------+
| Lambda |
| (必要時に自動起動) | ← 実行時間のみ課金
| (自動スケール) | ← OS/ランタイム管理不要
+-------------------+
| 観点 | 従来型(EC2等) | サーバーレス(Lambda等) |
|---|---|---|
| サーバー管理 | 自己管理(OS、パッチ、スケール) | AWSが完全管理 |
| 課金モデル | 時間課金(未使用時も課金) | 実行回数・時間課金 |
| スケーリング | 手動 or Auto Scaling設定 | 自動(同時実行数に応じて) |
| 起動時間 | 分単位 | ミリ秒〜秒単位 |
| 実行時間制限 | なし | 最大15分(Lambda) |
| 適性 | 長時間処理、ステートフル | 短時間処理、イベント駆動 |
| 運用負担 | 高い | 低い |
2. Lambda概要
AWS Lambdaは、イベントに応じてコードを実行するコンピューティングサービスです。
主要概念
+----------------------------------------------------------+
| Lambda関数 |
| |
| +------------------+ |
| | ハンドラー関数 | ← エントリポイント(event, context) |
| +------------------+ |
| |
| +------------------+ +------------------+ |
| | ランタイム | | レイヤー | |
| | (Node.js, Python | | (共有ライブラリ) | |
| | Java, Go, etc.) | +------------------+ |
| +------------------+ |
| |
| +------------------+ +------------------+ |
| | 環境変数 | | IAMロール | |
| +------------------+ +------------------+ |
+----------------------------------------------------------+
|
v
+------------------+
| 実行環境 | ← AWSが管理するコンテナ
| (microVM) | 再利用される場合あり(ウォームスタート)
+------------------+
イベントソース
Lambdaは多様なAWSサービスからのイベントで起動できます。
| カテゴリ | サービス | ユースケース |
|---|---|---|
| API | API Gateway | REST/HTTP API |
| ストレージ | S3 | ファイルアップロード処理 |
| キュー | SQS | 非同期メッセージ処理 |
| 通知 | SNS | プッシュ通知処理 |
| イベント | EventBridge | スケジュール、カスタムイベント |
| ストリーム | Kinesis, DynamoDB Streams | リアルタイムデータ処理 |
| 認証 | Cognito, ALB | カスタム認証ロジック |
3. Lambda関数の作成
Node.js の例
// index.mjs - JWTトークン検証Lambda
import { verify } from 'jsonwebtoken';
import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm';
const ssmClient = new SSMClient();
// 初期化コード(コールドスタート時のみ実行)
let publicKey = null;
async function getPublicKey() {
if (publicKey) return publicKey;
const command = new GetParameterCommand({
Name: '/idp-server/jwt-public-key',
WithDecryption: true,
});
const response = await ssmClient.send(command);
publicKey = response.Parameter.Value;
return publicKey;
}
// ハンドラー関数
export const handler = async (event, context) => {
try {
const token = event.headers?.Authorization?.replace('Bearer ', '');
if (!token) {
return {
statusCode: 401,
body: JSON.stringify({ error: 'Missing token' }),
};
}
const key = await getPublicKey();
const decoded = verify(token, key, {
algorithms: ['RS256'],
issuer: process.env.EXPECTED_ISSUER,
});
return {
statusCode: 200,
body: JSON.stringify({
sub: decoded.sub,
scope: decoded.scope,
}),
};
} catch (error) {
console.error('Token verification failed:', error.message);
return {
statusCode: 401,
body: JSON.stringify({ error: 'Invalid token' }),
};
}
};