AWS AppSync GraphQL API 設計パターン5選|SAA-C03 頻出リアルタイム通信・データ統合完全攻略
AWS SAA-C03 で頻出の AWS AppSync を完全整理。GraphQL vs REST API Gateway の選択基準・Subscriptions によるリアルタイム通信・Pipeline Resolver での複数データソース統合・Cognito 認証フィールドレベル認可・Lambda/OpenSearch 連携の5つの設計パターンを体系化。試験シナリオを即断できる粒度で分解する。
「AppSync は “GraphQL のフルマネージドレイヤー” だ。REST API Gateway と混同されやすいが、SAA-C03 が問うのはプロトコルの違いではなく『リアルタイム通信が必要か』『複数データソースを1リクエストで結合したいか』という設計判断だ。Subscriptions による WebSocket Push・Pipeline Resolver による N+1 解消・Cognito 統合によるフィールドレベル認可——これらを即答できれば AppSync 問題は確実に取れる」 — 本記事では SAA-C03 頻出の AWS AppSync 設計パターン5選を体系化し、API Gateway との使い分けから試験シナリオを即断できる粒度まで分解する。
※ 本記事はアフィリエイト広告(Amazon アソシエイト等)を含みます
📑 目次
- 結論:AppSync を選ぶ判定軸
- AppSync の基本構造(GraphQL・リゾルバー・データソース)
- パターン1:AppSync vs API Gateway REST — GraphQL vs REST 選択基準
- パターン2:AppSync + DynamoDB Subscriptions — リアルタイムチャット設計
- パターン3:AppSync + Pipeline Resolver — 複数データソース統合・N+1解消
- パターン4:AppSync + Cognito — 認証・フィールドレベル認可設計
- パターン5:AppSync + Lambda / OpenSearch — カスタムロジック・全文検索統合
- AppSync vs API Gateway vs EventBridge 比較
- 試験頻出シナリオ → 解法パターン早見表
- 次のアクション チェックリスト
- 関連記事
- 関連サイト
1. 結論:AppSync を選ぶ判定軸
AWS AppSync は「GraphQL API のフルマネージドサービス」だ。DynamoDB・Lambda・OpenSearch・RDS など複数のデータソースを GraphQL スキーマで統一し、リアルタイム Subscriptions・オフライン同期・きめ細かい認証を組み込みで提供する。
AppSync が最適なシナリオ:
| シナリオ | 理由 |
|---|---|
| チャット・ライブダッシュボードなどリアルタイム更新が必要 | Subscriptions(WebSocket)が組込みで即時設定可能 |
| モバイルアプリで複数テーブルのデータを1回のAPIコールで取得したい | GraphQL の1クエリで複数データソースを結合して返せる |
| オフラインでも動作し、再接続時にデータ同期が必要 | AppSync のオフライン同期(Conflict Resolution)機能がネイティブ対応 |
| ユーザーロール・フィールド単位でデータアクセスを制御したい | Cognito User Pools + $ctx.identity によるフィールドレベル認可 |
2. AppSync の基本構造
AppSync は以下の3層で構成される。
クライアント(Query / Mutation / Subscription)
↓ GraphQL リクエスト
┌────────────────────────────┐
│ AWS AppSync API │
│ ・スキーマ(SDL)定義 │
│ ・リゾルバー(Unit / Pipeline)│
│ ・認証設定(Cognito / IAM 等)│
└────────────────────────────┘
↓ データソース呼び出し
DynamoDB / Lambda / OpenSearch / RDS / HTTP / None
主要コンポーネント:
| コンポーネント | 役割 |
|---|---|
| GraphQL スキーマ(SDL) | Query・Mutation・Subscription の型定義 |
| Unit Resolver | 1つのデータソースに直接マッピング(VTL または JavaScript) |
| Pipeline Resolver | 複数のデータソースを順次呼び出し(Function チェーン) |
| Subscriptions | Mutation のトリガーで WebSocket 経由クライアントに Push |
| Data Sources | DynamoDB・Lambda・OpenSearch・RDS(HTTP)・None |
3. パターン1:AppSync vs API Gateway REST — GraphQL vs REST 選択基準
SAA-C03 で最頻出の AppSync 判断問題。GraphQL(AppSync)と REST(API Gateway)の違いを軸で整理する。
| 評価項目 | AppSync(GraphQL) | API Gateway(REST) |
|---|---|---|
| プロトコル | GraphQL | REST / HTTP / WebSocket |
| データ取得粒度 | フィールド指定で必要な列だけ取得(Over/Under Fetch なし) | エンドポイントごとに固定のレスポンス構造 |
| リアルタイム | Subscriptions(WebSocket)が組込み | 別途 WebSocket API を構成が必要 |
| 複数データソース結合 | 1クエリで DynamoDB + Lambda + OpenSearch を結合 | 各エンドポイントが独立、クライアント側でマージ |
| オフライン同期 | ネイティブ対応(Amplify DataStore) | 対応なし(クライアント実装が必要) |
| 向いているケース | モバイルアプリ・リアルタイム・複雑なデータ関係 | シンプルCRUD・外部パートナー連携・既存REST API |
4. パターン2:AppSync + DynamoDB Subscriptions — リアルタイムチャット設計
チャットアプリ・ライブダッシュボードの定番構成。DynamoDB を直接データソースにすることで Lambda を挟まずに高速な読み書きを実現し、Subscriptions でリアルタイム Push を行う。
クライアントA(メッセージ送信)
→ AppSync Mutation(sendMessage)
→ DynamoDB(messages テーブルへ PUT)
→ Subscription トリガー
→ クライアントB・C・D(リアルタイム受信)
ポイント:
Mutationの実行がSubscriptionのトリガーになる——AppSync が WebSocket 接続を管理するため、Lambda・SNS・SQS などの仲介は不要- DynamoDB の
PutItemを VTL(Velocity Template Language)または JavaScript リゾルバーで直接マッピングできる - 接続中のすべてのサブスクライバーに即時 Push。コネクション管理は AppSync が担う
5. パターン3:AppSync + Pipeline Resolver — 複数データソース統合・N+1解消
Pipeline Resolver は「複数の Function(データソース呼び出し)をチェーンする」仕組みだ。単一の GraphQL クエリで DynamoDB・Lambda・OpenSearch の複数ソースを順次クエリし、結果を合成して返せる。
GraphQL Query: getProductDetail(id: "p001")
↓ Pipeline Resolver
Function 1: DynamoDB から商品基本情報を取得
Function 2: Lambda でリアルタイム在庫を照会
Function 3: OpenSearch でレビュースコアを取得
↓ 合成して単一レスポンスとして返す
N+1 問題の解消:
従来の REST 設計では「商品一覧 → 各商品の在庫を個別にN回API呼び出し」という N+1 問題が発生しやすい。AppSync の Pipeline Resolver + DynamoDB の BatchGetItem 統合を使うと、一括取得クエリに変換してリクエスト数を削減できる。
6. パターン4:AppSync + Cognito — 認証・フィールドレベル認可設計
AppSync は1つの API に複数の認証モードを同時設定できる。SAA-C03 では「ユーザー認証に Cognito を使い、管理者だけ特定フィールドを見られる」というシナリオが出題される。
認証モード一覧:
| 認証モード | 向いているケース |
|---|---|
| Cognito User Pools | エンドユーザー認証(モバイルアプリ・Web フロント) |
| IAM 認証 | バックエンドサービス・Lambda・EC2 からの呼び出し |
| OpenID Connect | 外部 IdP(Okta・Auth0 等)との統合 |
| API キー | 公開データ・PoC・短期プロトタイプ(本番非推奨) |
| Lambda オーソライザー | カスタム認証ロジック(JWT 検証・DB ルックアップ等) |
フィールドレベル認可のパターン:
type User {
id: ID!
name: String!
email: String! @auth(rules: [{ allow: owner }])
salary: Int @auth(rules: [{ allow: groups, groups: ["Admin"] }])
}
$ctx.identity.groups でユーザーの所属グループを参照し、リゾルバー内で認可ロジックを実装することも可能。「Cognito グループが Admin のユーザーだけが salary フィールドを読める」という設計が SAA-C03 頻出だ。
7. パターン5:AppSync + Lambda / OpenSearch — カスタムロジック・全文検索統合
DynamoDB で解決できない複雑なビジネスロジックや全文検索が必要な場合の構成。
パターン5a: AppSync + Lambda データソース
GraphQL Mutation: createOrder(input: {...})
→ AppSync Unit Resolver(Lambda データソース)
→ Lambda(在庫チェック・決済処理・DynamoDB 書き込みを実行)
→ レスポンスを AppSync 経由でクライアントに返す
Lambda をデータソースに設定するだけで、複雑なビジネスロジックをサーバーレスで実行できる。「注文時に在庫確認・決済・通知を一連で実行したい」という試験シナリオはこのパターン。
パターン5b: AppSync + OpenSearch 全文検索
GraphQL Query: searchProducts(keyword: "AWS認定")
→ AppSync Unit Resolver(OpenSearch HTTP データソース)
→ Amazon OpenSearch Service(全文検索クエリ)
→ 結果を AppSync 経由で返す
DynamoDB は全文検索が苦手(キー検索のみ)。商品・記事・ログの全文検索が必要なら AppSync + OpenSearch の組み合わせが定番。DynamoDB Stream → Lambda → OpenSearch でデータを同期し、AppSync でクエリを受け付ける構成が SAA-C03 頻出だ。
8. AppSync vs API Gateway vs EventBridge 比較
| 評価項目 | AppSync | API Gateway(REST) | EventBridge |
|---|---|---|---|
| プロトコル | GraphQL / WebSocket | REST / HTTP / WebSocket | イベントバス(JSON) |
| リアルタイム | Subscriptions(組込み) | WebSocket API(別途設定) | なし(非同期イベント) |
| 主な用途 | モバイル/Webアプリ API | REST API / マイクロサービス | サービス間イベント連携 |
| クライアント向けか | フロントエンド向け | フロントエンド/バックエンド両方 | バックエンド間のみ |
| データソース統合 | 複数DB・Lambda を1APIで統合 | 単一バックエンドが基本 | イベントターゲットへルーティング |
| 認証 | Cognito / IAM / OIDC / API Key / Lambda | Cognito / IAM / API Key / Lambda | IAM / リソースポリシー |
9. 試験頻出シナリオ → 解法パターン早見表
| シナリオ | 正解パターン | 理由 |
|---|---|---|
| チャットアプリでメッセージをリアルタイムに全クライアントへ Push したい | AppSync + DynamoDB + Subscriptions | WebSocket Push が組込み、DynamoDB で永続化 |
| モバイルアプリで複数 DynamoDB テーブルのデータを1回のリクエストで取得したい | AppSync + Pipeline Resolver | 複数データソースを1 GraphQL クエリで結合 |
| ユーザー認証は Cognito、Admin グループだけ給与フィールドを見られる設計にしたい | AppSync + Cognito User Pools + フィールドレベル認可 | Cognito グループ + $ctx.identity でフィールド制御 |
| 商品データは DynamoDB、検索は全文検索が必要、APIは GraphQL にしたい | AppSync + DynamoDB + OpenSearch(DynamoDB Stream 同期) | AppSync が両データソースを統合 |
| 注文時に在庫確認・決済・DynamoDB 書き込みを1つの API コールで実行したい | AppSync + Lambda データソース | 複雑なビジネスロジックを Lambda に委譲 |
| RESTful API を外部パートナーに公開したい | API Gateway(REST) | AppSync は GraphQL 専用、REST 公開には不向き |
| データを永続化せず、接続中クライアントに即時通知するだけでよい | AppSync + None データソース + Subscriptions | None データソースで DB を介さず Push |
10. 次のアクション チェックリスト
11. 関連記事
- Amazon API Gateway 設計パターン4選(REST API vs HTTP API・WebSocket 双方向通信・SQS 非同期統合)
- SQS / SNS / EventBridge 設計パターン4選(Standard vs FIFO・SNS ファンアウト・EventBridge イベント駆動・DLQ 活用)
- Amazon OpenSearch Service 設計パターン5選(ログ分析・全文検索・SIEM・Serverless・UltraWarm)
- AWS Step Functions 設計パターン4選(標準・Express ワークフロー選択・SAGA・Parallel/Map 並列処理)
- AWS AppSync 完全解説(基本機能・リゾルバー・認証)