【レポート】AWS AppSyncを使用してサーバーレスなGraphQLアーキテクチャを開発する#MOB309 #reinvent

2019.12.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも!大阪オフィスの西村です。

本記事はAWS re:Invent 2019の「Develop serverless GraphQL architectures using AWS AppSync」の速報セッションレポートです。

概要

AWS AppSync is the managed GraphQL service of AWS. In addition to queries, mutations, and subscriptions, AWS AppSync integrates seamlessly with many AWS data sources, VPC resources, and external sources, including microservices and other GraphQL endpoints. Learn how to rapidly develop a GraphQL data layer in your architecture, assisted by generated resolvers, declarative security, and client libraries. BMW joins us to share how it used AWS AppSync to build a holistic, data-centric GraphQL API for vehicle signals.

AWS AppSyncは、AWSのマネージGraphQLサービスです。クエリ、ミューテーション、サブスクリプションに加えて、AWS AppSyncは多くのAWSデータソース、VPCリソース、およびマイクロソースやその他のGraphQLエンドポイントを含む外部ソースとシームレスに統合します。生成されたリゾルバ、宣言型セキュリティ、およびクライアントライブラリの支援を受けて、アーキテクチャでGraphQLデータレイヤーを迅速に開発する方法を学びます。またBMWは、AWS AppSyncを使用して車用のGraphQL APIを構築した方法を共有するために参加します

レポート

アジェンダ

  • BMWのGraphQL API構築から学んだ教訓
  • GraphQLとAppSyncの概要
  • AWS AppSyncでAWS Lambdaを使う
  • リアルタイムなサーバーレスアプリケーションの構築
  • AWS Lambdaの結果をAWS AppSyncでキャッシュする

セッション内容

▼BMWの動画が流れてきました。「Hello,BMW」と呼びかけ、音楽かけてやライトをハイビームにしてなど声で操作できるという内容の動画でした。

▼要件

BMWのGraphQL APIを構築するための要件

  • 統一されたデータモデル:MLトレーニング及び推論用
  • 歴史化:MLトレーニング用
  • 特別なクエリ機能:個々の属性のサブスクリプション(ex, 外気温度)

▼課題

ユースケース中心として、冗長なデータ、混合されたデータモデルがある

▼解決策:調和のとれたデータモデル

車両信号の仕様(VSS)

▼解決策:GraphQLを介した柔軟なクエリ機能

▼解決策:クラウドネイティブなアーキテクチャ

▼学んだ教訓

  • API
  • GraphQLとREST
  • データベースレイヤー
  • ElasticsearchとDynamoDB
  • サブスクリプションメカニズム
  • AWS AppSync SubscriptionsとAmazon SNS Topics

▼ここで登壇者が交代します。

サービスの説明が行われます

▼GraphQLとは

APIのクエリ言語

データに対してクエリを実行するためのシステムとランタイムを実行します

▼GraphQLクリエ言語の仕様の説明

▼AppSyncの機能概要

▼AppSyncは複数のAWSリソースと統合できます

▼AppSyncの認証機能

  • API Key
  • IAM
  • Cognito User Pools
  • OIDC

を提供している

 

▼マルチ認証機能

複数の認証を組み合わせて使用できる

シンプルなスキーマディレクティブを使用して、特定のフィールドに認証を適用

 

▼ユースケースの話

▼AppSyncでLambdaを使用する理由

  • VTLだけではなく、他の言語を使いたいから
  • 複数のチームが単一のAPIにアクセスするLambda関数をもっているとき
  • VPC内にあるデータにアクセスするため、多くのアカウントからアクセスするため

▼シンプルなLambdaリゾルバ

▼リゾルバとしてビジネスロジックが書かれるサンプルコード

▼複数のチームと連携

  • AppSyncは複数のアカウントで機能を呼び出すことができる
  • チームは独立してコードを作成し単一の組織を公開します
  • 複数のアカウントで複数の機能を使用するとセキュリティが向上します
  • 関数の所有者はIAMロール及び信頼ポリシーを介してアクセスを制御します

▼ここで登壇者が変わります

▼複数のチームでどうやって連携するかの説明です

▼組織全体のAPIを作成する

  • 複数のVPC/アカウントからのデータを使用して組織全体のAPIを作成
  • GraphQLはフロントエンドとバックエンドのチームを解放します
  • GrapiQLのようなツールを使うことでスピードアップさせる

▼サーバレスのリアルタイムアプリケーションを構築する

▼スキーマの設定例

▼DynamoDB Streamを使ってバックエンドの変更をサブスクライブ

▼no data sourceとすることもできる

▼複数のアカウントでの処理の流れを踏まえてのデータ更新の流れ

▼AWS AppSyncのキャッシュ機能

  • AWS Lambda及びその他のリゾルバ’によって返された結果を自動的にキャッシュします
  • 追加のインフラはありません
  • 緩やかに変化するデータの計算コストを削減します
  • APIの様々なフィールドに様々なキャッシュポリシーを作成できます

▼イメージ図

▼要約

  • AWS Lambdaを使用して、強力なテスト可能なリゾルバを作成します
  • AWS AppSyncはサーバレスアプリケーションをリアルタイムアプリケーションに変える事ができます
  • AWS AppSyncとLambdaを使用して、バックエンドの変更をサブスクライブします
  • クロスアカウントの呼び出しにより、多くのチームが簡単に連携できます
  • AppSyncに結果をキャッシュして計算コストを削減し改善することができる

感想

BMWの車にもGraphQLが使われていることに驚きました。

内容的にはとてもよいAppSyncの復習になりました。

複数の認証機能や、複数のアカウントでの運用仕方などはどこかで試してみたいと思います。

誰かの参考になれば幸いです。