Notes
AWS AppSync

AWS AppSync

概要

  • DynamoDB、HTTP などの連携対象をデータソースとして定義する
    • DynamoDB はリソースとして自動でスキーマに対応したデータを read/write できる
  • データソースに対応する解決処理を Function として定義する
    • JavaScript でマッピング定義を書く
    • 複数データソースに対応する場合は複数の Function を作って Pipeline Resolver で参照する
  • スキーマのフィールドにリゾルバをアタッチする
    • Function を参照する場合は Pipeline Resolver
    • 単一のデータソースしか参照しない場合やマッピング定義を JavaScript で書かなくてもよい場合は以前の書き方(VTL)でもよい
      • JavaScript で統一しておいたほうがよいと思う

開発方法

AppSync で API を開発する主な方法

  • ブラウザから AppSync のコンソールで直接編集する
    • スキーマやリゾルバ/関数のバージョン管理が行えない
  • CloudFormation
    • AWS 公式のツール
  • Terraform
    • クロスプラットフォーム IaC ツール
  • Serverless Framework
    • Node.js で動作するクロスプラットフォーム IaC ツール
    • AWS Lambda や Google Cloud Functions 等の開発がメイン用途
    • プラグインを使うことで AppSync の構築も可能
    • AWS のサービスを構築する場合は CloudFormation を使う(定義ファイルからテンプレートを生成してスタックを作成)

検証

Apollo Odyssey (opens in a new tab) で構築するサンプルアプリケーションの一部の仕様を AppSync コンソール、CloudFormation、Terraform、Serverless Framework でそれぞれ実装し、開発者体験の観点で(主観的ではあるが)比較する

実装する API の概要

  • 認証は API Key とする
  • リゾルバ、関数は JavaScript で実装する
  • データソースは HTTP のみ

スキーマ
type Query {
  tracksForHome: [Track!]!
}
 
type Track {
  id: ID!
  title: String!
  author: Author!
  thumbnail: String
  length: Int
  modulesCount: Int
}
 
type Author {
  id: ID!
  name: String!
  photo: String
}

メモ

比較

  • 書きやすさ
    • 抽象度が高い Serverless Framework が圧倒的に体験がよい
    • CloudFormation と Terraform は同程度
  • 仕様の追従
    • CloudFormation > Terraform > Serverless Framework
  • バージョン管理
    • スキーマやリゾルバの実装を外部ファイルに書ける Serverless Framework と Terraform は体験がよい
    • CloudFormation は実質的に外部ファイルの読み込みが行えず(S3 に置かないといけない)、1 ファイルに異なる言語仕様のテキストを混ぜる必要があり体験が悪い
  • 反映速度
    • Terraform が圧倒的に早い
    • Serverless Framework は CloudFormation を使用するので遅い
  • その他
    • Serverless Framework はサーバレスに特化しているので、関連サービスを EC2 等でまとめて構築したいとかは無理

まとめ

  • バージョン管理を前提とするなら外部ファイルを扱える Terraform か Serverless Framework を使うのがよい
  • 基本的には Terraform がよさそう
  • Serverless Framework を選ぶケース
    • 初期構築のハードルを下げたい
    • 新しい仕様への追従はラグがあってもよい
    • CloudFormation のドリフト検知を利用したい

認証