リゾルバーのテストとデバッグ - AWS AppSync

リゾルバーのテストとデバッグ

AWS AppSync は GraphQL フィールドのリゾルバーをデータソースに対して実行します。「リゾルバーのマッピングテンプレートの概要」で説明しているように、リゾルバーはテンプレート作成言語を使用してデータソースとやり取りします。これにより、ユーザーはリゾルバーの動作をカスタマイズでき、データソースとやり取りする前後にロジックおよび条件を適用できます。リゾルバーを記述するための入門者向けのチュートリアル形式プログラミングガイドについては、「リゾルバーのマッピングテンプレートのプログラミングガイド」を参照してください。

開発者がリゾルバーを記述、テストおよびデバッグするのを支援するために、AWS AppSync コンソールには、モックデータで GraphQL のリクエストとレスポンスを個々のフィールドのリゾルバーに至るまで作成するためのツールも用意されています。さらに、AWS AppSync コンソールでクエリ、ミューテーション、サブスクリプションを実行でき、リクエスト全体の Amazon CloudWatch からの詳細なログストリームを確認できます。ログストリームにはデータソースからの結果も含まれています。

モックデータを使用したテスト

GraphQL リゾルバーが呼び出されるときに、そのリゾルバーには、プログラミングの対象であるリクエストに関する情報が含まれている context オブジェクトが含まれています。このオブジェクトには、クライアントからの引数、ID 情報、および親 GraphQL フィールドからのデータが含まれています。また、データソースからの結果も含まれていて、それをレスポンステンプレートで使用できます。この構造体およびプログラミング時に使用可能なヘルパーユーティリティの詳細については、「リゾルバーのマッピングテンプレートのコンテキストリファレンス」を参照してください。

リゾルバー関数を記述または編集する場合に、モックまたはテストcontext オブジェクトをコンソールエディタに渡すことができます。これにより、実際にデータソースに対して実行することなく、リクエストとレスポンスの両方のテンプレートでどのように評価されるかを確認できます。たとえば、テストの firstname: Shaggy 引数を渡して、テンプレートのコードで $ctx.args.firstname を使用している場合にその引数がどのように評価されるかを確認できます。任意のユーティリティヘルパー ($util.autoId()util.time.nowISO8601() など) での評価をテストすることもできます。

Resolver をテストする

AWS AppSync コンソールで、[スキーマ] ページに移動し、右側にある既存のリゾルバーを選択して編集します。または、[アタッチ] を選択して、新しいリゾルバーを追加します。ページの上部で、[Select test context] を選択し、[Create new context] を選択します。次に、既存のサンプルコンテキストオブジェクトから選択するかまたは JSON を手動で入力し、[保存] を選択します。この模擬コンテキストオブジェクトを使用してリゾルバーを評価するには、[Run Test] を選択します。

たとえば、オブジェクトに ID 自動生成を使用して Amazon DynamoDB に保存する GraphQL 型の Dog を保存するアプリケーションがあるとします。また、一部の値を GraphQL ミューテーションの引数から書き込み、レスポンスが特定の 1 人のユーザーにのみ表示されるようにします。スキーマは次のようになります。

type Dog { breed: String color: String } type Mutation { addDog(firstname: String, age: Int): Dog }

addDog ミューテーションに対してリゾルバーを追加するときに、次のようなコンテキストオブジェクトを入力できます。次の例には、クライアントから引数として nameage があり、identity オブジェクトに入力されている username があります。

{ "arguments" : { "firstname": "Shaggy", "age": 4 }, "source" : {}, "result" : { "breed" : "Miniature Schnauzer", "color" : "black_grey" }, "identity": { "sub" : "uuid", "issuer" : "https://cognito-idp.region.amazonaws.com/userPoolId", "username" : "Nadia", "claims" : { }, "sourceIP" : "x.x.x.x", "defaultAuthStrategy" : "ALLOW" } }

これを、以下のリクエストとレスポンスのマッピングテンプレートを使用してテストします。

リクエストテンプレート

{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { "id" : { "S" : "$util.autoId()" } }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) }

レスポンステンプレート

#if ($context.identity.username == "Nadia") $util.toJson($ctx.result) #else $util.unauthorized() #end

評価後のテンプレートには、テストコンテキストオブジェクトからのデータと、$util.autoId() から生成された値があります。また、usernameNadia 以外の値に変更した場合は、認証チェックが失敗するため、結果は返されません。きめ細かなアクセス制御の詳細については、「認証のユースケース」を参照してください。

ライブクエリのデバッグ

本稼働アプリケーションをデバッグするエンドツーエンドのテストとログ記録に代わるものはありません。AWS AppSync では、ユーザーが Amazon CloudWatch を使用してエラーとリクエスト完全な詳細をログ記録できます。さらに、AWS AppSync コンソールを使用して、GraphQL クエリ、ミューテーション、およびサブスクリプションをテストでき、各リクエストのライブストリームログデータをクエリエディタに戻してリアルタイムでデバッグできます。サブスクリプションに関して表示されるログは接続時の情報です。

これを実行するには、「モニタリングとログ記録」で説明しているように、Amazon CloudWatch ログを事前に有効にしておく必要があります。次に、AWS AppSync コンソールで [クエリ] タブを選択し、有効な GraphQL クエリを入力します。右下のセクションで、[ログ] チェックボックスをオンにしてログビューを開きます。ページの上部にある再生矢印アイコンを選択して GraphQL クエリを実行します。しばらくすると、そのオペレーションのリクエストとレスポンスの完全なログが、このセクションにストリーミングされ、コンソールで表示できます。