リゾルバーのテストとデバッグ - 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() など) での評価をテストすることもできます。

リゾルバーのテスト

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

例えば、オブジェクトに対して自動 ID 生成を使用して Amazon DynamoDB に保存する Dog のGraphQL タイプを保存するアプリケーションがあるとします。また、一部の値を 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の API

次を使用できます。EvaluateMappingTemplateモックデータを使用してマッピングテンプレートをリモートでテストする API コマンド。このコマンドを開始するには、必ずappsync:evaluateMappingTemplateあなたのポリシーへの許可。例:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:evaluateMappingTemplate", "Resource": "arn:aws:appsync:<region>:<account>:*" } ] }

コマンドを利用するには、AWS CLIまたはAWSSDK。たとえば、Dog前のセクションのスキーマとその要求/応答マッピングテンプレートです。ローカルステーションで CLI を使用して、リクエストテンプレートをという名前のファイルに保存しますrequest.vtlを選択し、contextという名前のファイルに対するオブジェクトcontext.json。シェルから、次のコマンドを実行します。

aws appsync evaluate-mapping-template --template file://request.vtl --context file://context.json

このコマンドは、次のレスポンスを返します。

{ "evaluationResult": "{\n \"version\" : \"2017-02-28\",\n \"operation\" : \"PutItem\",\n \"key\" : {\n \"id\" : { \"S\" : \"afcb4c85-49f8-40de-8f2b-248949176456\" }\n },\n \"attributeValues\" : {\"firstname\":{\"S\":\"Shaggy\"},\"age\":{\"N\":4}}\n}\n" }

-evaluationResult提供されたテンプレートを、提供されたcontext。を使用してテンプレートをテストすることもできますAWSSDK。以下にの使用例を示します。AWS向け SDK JavaScript V2:

const AWS = require('aws-sdk') const client = new AWS.AppSync({ region: 'us-east-2' }) const template = fs.readFileSync('./request.vtl', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') client .evaluateMappingTemplate({ template, context }) .promise() .then((data) => console.log(data))

SDK を使用すると、お気に入りのテストスイートのテストを簡単に組み込んで、テンプレートの動作を検証できます。を使用してテストを作成することをお勧めしますJest テストフレームワーク、しかし、どのテストスイートも機能します。次のスニペットは、仮想検証の実行を示しています。評価応答は有効な JSON であることが期待されるため、JSON.parse文字列レスポンスから JSON を取得します。

const AWS = require('aws-sdk') const fs = require('fs') const client = new AWS.AppSync({ region: 'us-east-2' }) test('request correctly calls DynamoDB', async () => { const template = fs.readFileSync('./request.vtl', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') const contextJSON = JSON.parse(context) const response = await client.evaluateMappingTemplate({ template, context }).promise() const result = JSON.parse(response.evaluationResult) expect(result.key.id.S).toBeDefined() expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname) })

これにより、次のような結果になります。

Ran all test suites. > jest PASS ./index.test.js ✓ request correctly calls DynamoDB (543 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 1.511 s, estimated 2 s

ライブクエリのデバッグ

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

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