appsync :基本的にサービスとしてのGraphql


昨年、私が会議に行ったとき、AWSラインナップの新しい追加について学びました.AppSyncと呼ばれており、基本的にはServiclessな方法でGraphQLサービスをホストする方法です.先月、私は少しそれを試しました、そして、このポストで私は私の発見を共有したいです.
TLDR:あなたが既に使用しているか、またはGraphSQLを使用する場合は、間違いなくAppSyncショットを与える必要があります!

AppSyncはあなたのためですか?
あなたは、始めるために2つのものだけを必要とします:スキーマといくつかのリゾルバ.アップロードするスキーマは、通常のGraphQL schemaです.AppSyncは、このスキーマに基づくクエリと突然変異を受け入れます.いつでもこのスキーマを変更することができますし、新しいバージョンを展開する必要はありません、それはすぐにそれを使用して起動されます.
必要な第二部はレゾルバです.これらのリゾルバは、クエリのフィールドをそのフィールドの実際のデータにマップします.あなたは、レゾルバとしてラムダをフックすることができますが、データソースとして別のデータベースの範囲を使用することもできます.

基本的な例
これがどのように働くかについて把握を得るために、小さい例です.このようなサイトを想像してください.いくつかのIDによって識別されたユーザーがあります、そして、これらのユーザーはポストを持ちます.以下のスキーマは、これらの型を組み合わせたものです.
type Query {
    user(id: Int): User
}

type User {
    id: Int!
    name: String!
    posts(count: Int): [Post]
}

type Post {
    id: Int!
    title: String!
    content: String!
}
ユーザーまたはポストを解決するには、次のラムダリゾルバを実行します.
exports.user = async (event, context) => {
  const body = await fetchUser(event.arguments.id);

  return {
    statusCode: 200,
    body: JSON.stringify(body)
  };
};

exports.posts = async (event, context) => {
  const { id, count } = event.arguments;
  const body = await fetchPostsForUser(id, count);

  return {
    statusCode: 200,
    body: JSON.stringify(body)
  };
};
このコードから2つのラムダを作成します.そのためには、リクエストと応答マッピングを指定する必要があります.
リクエストマッピングは、クエリで提供されているデータ、例えばユーザーIDを、ラムダで利用可能なイベント変数に変換します.応答マッピングは、我々がラムダバックで与えた応答を、スキーマで定義した構造に変換する.
ポストリゾルバには、次のようになります.
Request mapping:

{
    "version" : "2017-02-28",
    "operation": "Invoke",
    "payload": {
        "arguments": $util.toJson({
            "id": $context.source.id,
            "count": $context.arguments.count
        })
    }
}
Response mapping:

#if($ctx.result.statusCode == 200)
    $ctx.result.body
#elseif($ctx.result.statusCode == 404)
    $util.error("Not found")
#else
    $util.error("Error")
#end
あなたはこれらのマッピングでかなりの魔法を置くことができます.次のリクエストマッピングは、ラムダを使用する代わりに、直接DynamoDBを問い合わせます.
Request mapping:

{
    "version" : "2017-02-28",
    "operation" : "GetItem",
    "key" : {
        "id" : {
            "S" : "${context.arguments.id}"
        }
    }
}
いくつかの例と一緒にフィドルをしたい場合は、AWSは24579152を提供します.
sample setups
なぜあなたはそれを使用する必要があります?
私がappsyncを試みることを勧める理由のいくつかがあります.

安いから
他のServerlessサービスと同様に、あなたは何を使用して何も支払いません.サービスを稼働させるためのベースコストはありません.つまり、小さなユーザベースを持つアプリケーションでは、これは、GraphSQLサーバーを実行する非常に費用対効果の高い方法です. 、あなたは、あなたがそうすることができた最も安いAWSラムダ機能よりおよそ5倍高価なAPIゲートウェイ価格設定に匹敵するあなたがするあらゆる100万の要求のために、4ドルを払います.
Currently
それはどんな負荷を処理するので
それが黒い金曜日ならば、それは重要でありません、あなたのサービスはまだ稼働中です.ここで微調整するノブはありません.それは本当にその面でラムダに似ています、あなたはちょうどそれをあなたのGraphical Schemaに与えます、そして、それはあなたのためにそれを実行します.

それは本当にダイナモやラムダにカップルするのは簡単だから
現在、AppSyncはダイナモ、RDS、エラスティックサーチ、ラムダとHTTPのリゾルバを提供しています.これらのそれぞれに対して、GraphSQLクエリからデータソースを表す形式にデータをマップする必要があります.これらのデータソースのそれぞれについては、 が利用可能であることが明らかになります.良いことは、最も人気のあるデータベースでは、クエリを実行するためにラムダを作成する必要はありません.
documentation
リアルタイムの購読をサポートしているので
AppSyncクライアントのライブラリの数は、リアルタイムのサブスクリプションをサポートしています.これにより、クライアントはAppSyncオープンへの接続を維持し、それが起こった突然変異の更新を購読して受け取ることができます.私は、特定のユースケースで本当に強力であることを見ることができます.

しかし、欠点がありますか?
here
パフォーマンス
これを試している間、Appsync内部にかなりのオーバーヘッドがあることは本当に明らかになりました.値を返すだけの単一ラムダにフックされると、応答時間は150ミリ秒未満になりませんでした.ほとんどの場合、それはおそらく許容数です.GraphSQLサーバを実行したときに比べてたくさんのようです.多くの方法で同様のサービスを提供するAPIゲートウェイと比較しても、それはかなり遅いです.

制限
AppSyncはまだ非常に新しい、一般的に昨年4月に利用可能になっている.それゆえに、それはまだ少しの端を持ちます.私にとって最大のラフなエッジは、RDSレゾルバが のために働くということです.幸いにも、あなたはまだコースのRDSの任意のタイプからデータを取得する独自のラムダを書くことができます.
また、知っていることは、並行性に関する制限があるということです.同じタイプのもののリストを解決するときは、ほとんどの5つの同時クエリ/ラムダ/HTTP呼び出しで実行されます.お使いのケースに応じて、この制限に実行することがあります.

データソースとの結合は少し厄介です
私は私のスタックを展開するためにCloudFormationを使用するのが好きです.CloudFormationでAppSyncスタックを展開する場合は、すべてのリゾルバをスタックテンプレートで定義する必要があります.これには、実行したいクエリと、これらのクエリを実行する前と実行後に適用するすべてのビジネスロジックが含まれます.
スタック定義の横にあるクエリと論理権を持つことは理想的ではありません.それはあなたが定義するロジックをテストすることはほとんど不可能になります.また、ビジネスロジックの変更を展開すると、スタックの変更になります.これは、ロールバックやカナリーリリースのようなものは、もはや些細ではないことを意味します.
CloudFormationを使用していない場合でも、スキーマとリゾルバ間のマッピングを指定する必要があります.AWSはこの目的のためにAurora serverlessを使いました.残念ながら、あなたがそこに加えるロジックは、テストするのが難しくて、デバッグするのが難しいでしょう.それはディーラーではありませんが、おそらく何かは、製品の年齢として改善されるだろう.

結論
AppSyncは、AWSの製品ラインアップに本当に便利な追加です.それは若干の粗い端を持ちます、しかし、それははっきりとApache Velocity Template Language目的に役立ちます.もしあなたがGraphqlで何かを構築するつもりなら、試してみることをお勧めします.