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
}
メモ
- AppSync コンソール
- CloudFormation
- https://zenn.dev/qmotas/scraps/004850e18f3927 (opens in a new tab)
- スキーマやリゾルバの実装を外部ファイルに出すことができない
- S3 にアップロードすれば参照できるが、バージョン管理と組み合わせるのが困難
- Serverless Framework
- https://zenn.dev/qmotas/scraps/4588709beeb900 (opens in a new tab)
- CloudFormation をラップして抽象的に定義を書ける
- CloudFormation、Terraform と比べて直感的
- AppSync の対応はプラグインが必要で、JavaScript Resolver は alpha 版しか対応していない(2023-02-15 時点)
- Terraform
- https://zenn.dev/qmotas/scraps/813803c709997f (opens in a new tab)
- 抽象度は CloudFormation と同程度
- 公式リファレンスが JavaScript Resolver に対応していて、サンプルがあり助かった
- CloudFormation より圧倒的に反映が早い
- ドリフト検知は Terraform Cloud を利用しないと行えない
比較
- 書きやすさ
- 抽象度が高い 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 のドリフト検知を利用したい
認証
- IAM
- Amazon Cognito
- AWS Lambda