AppSync 学んだことメモリアル📝

## はじめに

GraphQLに触れるとほぼ確実に登場するAWSサービス **AppSync！**
今回はAppSyncについて学んだことを記録しておきます。


## 目次

1. [AppSyncとは？](#-appsyncとは)
2. [GraphQLって何？](#-graphqlって何)
3. [AppSyncの構成要素](#-appsyncの構成要素)
4. [AppSyncが接続できるデータソース](#-appsyncが接続できるデータソース)
5. [AppSyncを使うメリット](#-appsyncを使うメリット)
6. [ざっくり構築ステップ（イメージ）](#-ざっくり構築ステップイメージ)
7. [AppSyncどんな時に使う？](#-appsyncどんな時に使う)
8. [まとめ](#-まとめ)
9. [参考文献](#-参考文献)

## 🧷 AppSyncとは？
AWS AppSync は、GraphQL API を簡単に構築・運用できるマネージドサービスです。(GraphQLのフルマネージド版)

フロントエンドアプリ（Webやモバイル）が複数のデータソース（DB、Lambda、REST APIなど）との安全な接続に必要な面倒な作業を自動的に処理して効率よくアクセスできます。

## 🧷 GraphQLって何？
AppSyncのベースとなるのが GraphQL（グラフキューエル）。
簡単にいうと...
* 必要なデータだけを、1つのAPIリクエストで取れる
* データの構造をクライアント側で定義できる
* REST APIの「エンドポイントごとにリソースを分ける」スタイルとは逆

💡 REST API だと必要なリソースを得るために複数のエンドポイントが必要
💡 GraphQL では単一エンドポイントへ 1 回のリクエストで必要なリソースを取得

```graphql
query {
  getUser(id: "123") {
    name
    email
    posts {
      title
    }
  }
}
```

## 🧷 AppSyncの構成要素
AppSyncでAPIを作るには、以下のパーツを使います。
| パーツ | 説明 |
|-----------|-----------------|
| Schema（スキーマ) | GraphQLの構造（どんなデータが取れるか）を定義 |
| Resolver（リゾルバ） | データをどこからどう取得するかのルール |
| Data source（データソース） | DynamoDB、Lambda、OpenSearch、HTTP APIなど |

## 🧷 AppSyncが接続できるデータソース
* Amazon DynamoDB：高速なNoSQL DB
* AWS Lambda：ビジネスロジックを実装できる
* Amazon RDS / Aurora：SQLベースのDB
* HTTPエンドポイント：外部APIもOK
* OpenSearch：検索系

## 🧷 AppSyncを使うメリット
### 🔄 リアルタイム更新（WebSocketでサブスクリプション）
#### 🔖 リアルタイム通信が可能
GraphQLには `subscription` というタイプのクエリがあり、これは「データの変更を待ち受ける」ものですが、AppSyncはこれをWebSocketで実装していて、リアルタイム通信ができるのが強み。

#### 🔖 リアルタイム更新のメリット
##### 1. ページをリロードしなくても最新状態に保てる
 * チャットアプリで新着メッセージが即表示される
 * 管理画面で他の人の操作がすぐ反映される
 * 通知アイコンがリアルタイムで更新される

　**💡 ユーザー体験（UX）が爆上がり！**

##### 2. 複雑なポーリング処理が不要
REST APIだと、定期的にAPIを叩いて「変わったかな？」って確認する必要あり（これが「ポーリング」）だが、AppSync + サブスクリプションなら...

　**💡 サーバー側でイベントが発生したときだけ通知が来る = 通信の無駄が減る = サーバー負荷も下がる！**

##### 3. WebSocketベースで双方向通信
 * 通常のHTTPはクライアント → サーバーのみ
 * WebSocketはサーバー → クライアントにもプッシュ通知できる

　**💡「サーバーから自発的にイベントを送れる」のが強み。**
　**💡 AppSyncはこのWebSocket接続を完全にマネージドで提供してくれるから、インフラを自分で用意しなくてOK！**

### ☁️ 完全マネージド（スケーラブルで運用負担少）

#### 🔖 サーバーいらない ＝ インフラ不要
#### 🔖 自動スケーリングしてくれる
#### 🔖 セキュリティパッチ・アップデート自動
#### 🔖 高可用・耐障害性も備えてる
#### 🔖 コスト最適化しやすい（使った分だけ課金）

### 🔐 CognitoやIAMと連携した認証認可
#### 🔖 認証機能（ログイン/サインアップ）がすぐに使える。
Cognitoを使うと、ユーザー登録・ログイン・パスワードリセットなどが全部クラウドで完結し、AppSyncはこのCognitoユーザーのトークンを受け取って、「この人は誰か」を自動で判定してくれる。

　**💡 つまり、自前で認証サーバーを作らなくていい！✨**

#### 🔖 ユーザー単位のアクセス制御（認可）ができる。
AppSyncでは、GraphQLのリゾルバ(サーバ)に以下のような制御が可能
 * 自分のデータだけ取得/更新できるようにする（例：user.id == $context.identity.sub）
 * 管理者だけが特定の操作をできるようにする（例：グループが「admin」のみ許可）

　**💡 Cognitoユーザープール + AppSyncの組み合わせで、「誰が」「どの操作を」できるかを柔軟に制御できる。**
### 📉 トラフィック最適化（キャッシュ機能）
AppSyncには、GraphQLレスポンスのキャッシュをする機能がある。

同じクエリに対しては再度バックエンドにアクセスせず、キャッシュから即レスポンスが返せる。
#### 🔖 バックエンドへのアクセスを減らせる
#### 🔖 表示速度やユーザー体験の向上、TTL（キャッシュの有効期限）の柔軟設定
#### 🔖 ユーザーごと・クエリごとのキャッシュ制御も可能

## 🧷 ざっくり構築ステップ（イメージ）
1. AppSyncコンソールで新規API作成（GraphQL）
2. スキーマ（GraphQLの型）を定義
3. データソース（LambdaやDynamoDBなど）を紐づけ
4. Resolverを設定（マッピングテンプレートまたは関数でデータ取得方法を指定）
5. クライアントからGraphQLクエリを送信

## 🧷 AppSyncどんな時に使う？
* モバイルやSPAで、複数のバックエンドに効率的にアクセスしたいとき
* リアルタイム通知を実装したいとき
    * 在席表示や会話履歴機能を持つチャットアプリ
    * メッセージング、位置や近接情報を使用したアプリ
    * FPSゲーム
* フロント主導でAPI設計をしたいとき

## 🎉 まとめ
* AWS AppSync は GraphQLベースのマネージドAPIサービス
* クライアントが必要なデータだけを効率よく取得できる
* 複数のデータソース（DynamoDB、Lambda、HTTPなど）を統合
* リアルタイム通信（サブスクリプション）も可能
* スキーマ + リゾルバ + データソースで構成
* 認証はCognitoやIAMと統合可能、セキュアに構築できる
* モバイル・SPA開発と相性が良く、APIの設計自由度が高い

## 💫 参考文献
* [AWS AppSync](https://aws.amazon.com/jp/appsync/)
* [Web API初心者と学ぶGraphQL](https://qiita.com/SiragumoHuin/items/cc58f456bc43a1be41b4)
* [AWSマンガ第 4 話：リアルタイムのチャット機能を実装しろ！ ( 1 / 4 )](https://aws.amazon.com/jp/campaigns/manga/vol4-1/?sc_icampaign=awareness_awsmanga_appsync&sc_ichannel=ha&sc_icontent=awssm-2419&sc_iplace=banner&trk=ha_awssm-2419_awareness_awsmanga_appsync_banner)