🏹

初めてのAWS AppSync ~概要編~

に公開

🍎 AppSyncとは

  • GraphQL APIを簡単に構築・管理できるフルマネージドサービス。
  • クライアントからのリクエストに応じて、DynamoDBLambdaOpenSearchなどと連携してデータを取得・操作
  • リアルタイム機能(サブスクリプション)にも対応

🍁 GraphQLとは

Facebookが開発したデータ取得用のクエリ言語。従来のREST APIに代わる仕組みとして注目。

そもそもREST APIとは?

『REST』という考え方に基づいて作られたAPIのこと。以下のような原則がある

① アドレスの一意性

全てのデータには一意のURI(アドレス)があり、どの情報もそのURIを使ってアクセス可能。
例:ユーザー情報は/users/123のような形で表される。

②統一されたインターフェース

APIとのやりとりはHTTPメソッドを使って行う。

メソッド 操作
GET データの取得
POST データの作成
PUT データの更新
DELETE データの削除

また、送受信されるデータの形式はJSONが一般的

③ステートレス(状態を持たない)

RESTでは、サーバーがクライアントの状態を覚えておかない設計が推奨。
アクセスするたびに必要な情報をすべてリクエストに含める必要があり、セッション情報やキャッシュのような一時的な情報をサーバー側に保存しないのが基本。

④接続性(リンクによる連携)

レスポンスの中には、他の関連データへのリンク(ハイパーリンク)を含めることが推奨される。これにより、API同士がスムーズにつながり、データの連携がしやすくなる。

クエリ言語とは?

クエリとは「質問」や「問合せ」を意味する。
データに対して「何を取得したいか」を指定してやり取りするための言語で、ユーザーが欲しい情報だけを明示的に要求可能。

GraphQLの特徴

特徴 説明
必要なデータだけ取得 クライアント側が取得したい項目を指定でき、無駄な通信が減少
複数のリソースを1回で取得 1つのクエリで複数データをまとめて取得可能
柔軟なスキーマ定義 データ構造や操作を型として明確に定義可能
リアルタイム対応 サブスクリプションにより変更を自動反映可能

🍀 AppSyncの主な構成要素

①スキーマ

GraphQLで定義されるAPIの設計図
クライアントが「どんなデータを取得/更新できるのか」を決める仕様書。
3種類の操作を定義
🟩 Query:データの取得
🟪 Mutation:データの変更(作成・更新・削除)
🟦 Subscription:リアルタイム通知の購読

②リゾルバ

スキーマで定義した操作を実際のデータソースと結びつける処理ロジック。
「どうやってデータを取ってくるか」「どう更新するか」を制御
2つの方法で記述
🟦 VTL(VElocity Template Language):DynamoDBやHTTP用の軽量スクリプト。
🟪 Lambda:より柔軟で複雑なビジネスロジック向け

③データソース

AppSyncが接続する実際のバックエンドシステム。

主な種類

データソース 連携例
DynamoDB NoSQL。高速でスケーラブルな読み書きが必要な場合
Lambda ロジック処理が必要な時
HTTP API 外部のREST APIや社内APIと連携したい時
OpenSearch Service 検索機能を提供する場合
RDS/Aurora SQLベースのリレーショナルデータが必要な場合

④サブスクリプション

GraohQLでは、
クエリ:データを取得
ミューテーション:データを操作(追加・更新・削除)
という形で「1回きりのリクエスト&レスポンス」が基本

サブスクリプションは、データの変化をリアルタイムでクライアントにプッシュ通知する仕組み。

  • 特定のデータ変更をクライアント側でリアルタイム受信
  • WebSocketベースで自動接続・再接続も対応
  • チャットやダッシュボードなど動的なUIに最適

🔐 認証・認可

アプリからバックエンドのデータに誰でもアクセスできてしまうと危険。
そのために「認可」が必要となる。以下5つの認可タイプがある。

①APIキー

パスワードのような「キー」を使ってアクセスする。シンプルだが、安全性は低いため、開発中やテスト用に使う。

②AWS IAM

AWSの仕組みを使い、細い設定を行う。社内システムやサーバー間通信でよく使う。

③Amazon Cognito

AWSのログイン機能を使って、ユーザーごとにログイン・グループ管理・アクセス制御可能。アプリやサービスで一般ユーザーに使わせたい時に便利。

④OpenID Connect(OIDC)

GoogleやAuth0など、すでにあるログインサービスと連携可能。「ログインした人だけアクセスOK」にできる

⑤Lambda認可

Lambda関数を使って、自分でルールを決められる。例えば、「このトークンがある人だけアクセスOK」といった自由な認可ロジックが書ける。

使い所・メリット

  • モバイル/SPAなど大量のAPI通信が発生するアプリ
  • 複雑なUIに対して複数データを一括取得したいケース
  • リアルタイムな更新が必要なチャット/通知系アプリ
  • AWSサービスと自然に統合できるため、サーバーレス開発に最適

まとめ

  • GraphQLベースのAPIサービスで複数のデータソースを統合可能
  • クライアントは必要なデータだけを効率的に取得でき、リアルタイム通信(サブスクリプション)にも対応
  • リゾルバを通じてデータ取得・操作を制御し、柔軟なアプリ開発を実現。

Discussion