[レポート] MOB401: AWS AppSyncを使ったGraphQL APIを改善するための10Tips/Tricks #reinvent
MOB401 - Ten Tips And Tricks for Improving Your GraphQL API with AWS AppSync
本記事は開催中のre:Invent 2018のセッションレポートです。AppSyncを使ったGraphQL APIを改善するための10Tipsを紹介するセッションです。
スピーカーはMichael Paris氏です。
Agenda
- Schema Design
- Data Design
- Using AWS Lambda
- Realtime Data
- Rapid development techniques
- Offline and Delta Sync
- CI/CD with AWS Amplify Console
- Operations and Monitoring
- Testing APIs
- Schema governance
Schema Design
- 長い名前を使うべし
- 例 :
<Service><Type>
が含まれる (AWSLambdaFunctionのように)
- 例 :
- Input and output patterns
- Use a single input type per mutation field
- 例 :
createUserPost
- Input and output patterns (advanced)
CreateUserPostOutput
のように出力型を作ったり
- Pagination patterns
- 要件を考慮
- 関連データも含む?
- A simple pagination pattern
- 次のトークン(
nextToken
)を渡し、次のリクエストで使ってもらう - An advanced pagination pattern
PageInfo
のようなメタデータ型を作り、前/次のページ番号、件数を返すfirst
/after
をリクエスト時に渡す
Data Design
- Jobのためにベストなデータベースを使うべし
- DynamoDB
- プライバリデータをスケーラブルに格納
- Elasticsearch
- RDS
- GraphQL with DynamoDB
- PutItem / UpdateItem / DeleteItem / GetItem / Scan or Queryが直接叩ける
- AppSyncを絡めるとNoSQLでリレーション要件を達成できる
- 例えば User 型の中に Task 型を入れて、Task はPrimary Keyで引いてくる
- Adding search to an API
- DynamoDBの場合
- ローレイテンシ、高可用
- Elasticsearchの場合
- DynamoDB + Elasticsearch
- DynamoDB StreamsでLambdaを発火、Elasticsearchに格納
- 検索時はElasticsearch Resolverで柔軟に検索
- ファイルの保存
- Amazon S3
- ローレイテンシ、高可用
- 組み込み型である
S3Object
型を使用可能 - 例 : クライアントからS3に直接アップロード、ユーザー紐付けはAppSyncでDynamoDBに保存
- AWS Lambda
- レベレージ
- ビジネスロジック
- 複数のデータソース(インターナル or エクスターナル)
- AppSyncからはイベントリクエストに必要な情報を渡す
- LambdaではAppSyncからのイベント情報を取得可能(型名やフィールド名も取得できる)
Real-time Data
- リアルタイム接続が可能
- MQTTで接続可能
- GraphQL subscriptions
@awssubscribe
を使う
- Authorizing subscriptions
- 普通に組むと誰のデータでもSubscribeできてしまう
- Subscription Queries open connection
- 認証されたらMQTTトピックの認証付きURLを返却
- Mutations publish to topics
Rapid development techniques
- AWS Amplify CLIを活用
- GraphQLにすると簡単にデータモデルをビルドできる
- AWS Amplify CLIは簡単
$ amplify add auth
$ amplify add storage
$ amplify add api
$ amplify push
- AWS Amplify + AWS AppSync
- スケーラブルなデータ・ドリブンアプリケーションを簡単デプロイ
- GraphQL Transformのメリット
- バージョンコントロールできる
- GraphQL Transform
@model
transformer$ amplify add api
@model
を使うとDynamoDB Tableを作成@auth
rules
を書くことで認可処理を簡単組み込み@connection
- どのデータソースを読むか組み込める
- AWS Amplify codegen
- Java / TypeScript / JavaScriptに変換できる
Offline and delta sync
- メインのエンティティテーブルのキャッシュを分離
- Syncするデータだけ "delta" としてオンライン同期
- Pipeline Resolverと相性が良い
- MainとDeltaのテーブルが別れている場合に構成しやすい
CI/CD with AWS Amplify Console
- サーバーレスアプリケーション開発・デプロイのためのシンプルワークフローを提供
- gitのbranchごとに管理可能
- Lambda@Edgeによるアトミックデプロイ
- GitHub / Bitbucket / GitLab / AWS CodeCommit
- Route53と組み合わせてカスタムドメインが利用可能
Operations and monitoring
- Amazon CloudWatch Logsが利用可能
- CloudWatch Metrics
- 4xx, 5xx, レイテンシでアラート可能
Resolver auditing
- Pipeline Resolverで複数のデータソースが扱える
- "Audit" AWSLambdaFunction
- カスタムアラート、レポート、メトリクスの作成
Testing APIs
- 結合テスト
- AWS Amplify Consoleデプロイ時に可能
- LambdaのテストやCloud Watch eventsのトリガ
- Canaries
- cron Lambdaで
- Generate test suites and fuzz APIs
Schema governance
- Centralized schema governance
- Decentralized schema governance
まとめ
最新のアップデートも込みの、AppSyncのベストプラクティスが詰め込まれていて勉強になりました!
特にテストやモニタリング周りは開発中のサービスにも活かしたいと思います。