[レポート] MOB401: AWS AppSyncを使ったGraphQL APIを改善するための10Tips/Tricks #reinvent

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

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のベストプラクティスが詰め込まれていて勉強になりました!

特にテストやモニタリング周りは開発中のサービスにも活かしたいと思います。