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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

(JavaScript) での AWS AppSyncリゾルバーのテストとデバッグ

AWS AppSync は、データソースに対して GraphQL フィールドでリゾルバーを実行します。パイプラインリゾルバーを操作する場合、関数はデータソースとやりとりします。JavaScript リゾルバーの概要 で説明されているように、 関数はAPPSYNC_JS、ランタイムに書き込まれ実行されているリクエストハンドラー JavaScript とレスポンスハンドラーを使用してデータソースと通信します。これにより、ユーザーはカスタムロジック条件を提供でき、データソースと通信する前後にロジックおよび条件を適用できます。

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

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

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

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

リゾルバーのテスト

この例では、 AWS AppSync コンソールを使用してリゾルバーをテストします。

  1. にサインイン AWS Management Console し、AppSyncコンソール を開きます。

    1. APIs ダッシュボード で、GraphQL を選択しますAPI。

    2. サイドバー[関数] を選択します。

  2. 既存の関数を選択します。

  3. [関数の更新] ページの上部で、[テストコンテキストを選択] を選択し、[新しいコンテキストを作成] を選択します。

  4. サンプルコンテキストオブジェクトを選択するか、以下のテストコンテキストの設定ウィンドウで JSONを手動で入力します。

  5. テキストコンテキスト名を入力します。

  6. [保存] ボタンを選択します。

  7. この模擬コンテキストオブジェクトを使用してリゾルバーを評価するには、[Run Test] を選択します。

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

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

AWS AppSync 関数を記述し、addDogリゾルバーに追加してミューテーションを処理できます。 AWS AppSync 関数をテストするには、次の例のようなコンテキストオブジェクトを入力します。次の例には、クライアントから引数として 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" } }

次のコードを使用して関数をテストできます AWS AppSync。

import { util } from '@aws-appsync/utils'; export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id: util.autoId() }), attributeValues: util.dynamodb.toMapValues(ctx.args), }; } export function response(ctx) { if (ctx.identity.username === 'Nadia') { console.log("This request is allowed") return ctx.result; } util.unauthorized(); }

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

でリクエストハンドラーとレスポンスハンドラー AWS AppSyncをテストする APIs

EvaluateCode API コマンドを使用して、モックデータを使用してコードをリモートでテストできます。コマンドを使い始めるには、ポリシーに appsync:evaluateMappingCode アクセス許可を追加していることを確認してください。例:

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

コマンドは、 AWS CLIまたは を使用して活用できますAWS SDKs。例えば、前のセクションのDogスキーマとその AWS AppSync 関数リクエストとレスポンスハンドラーを取ります。ローカルステーションCLIの を使用して、コードを という名前のファイルに保存しcode.jscontextオブジェクトを という名前のファイルを保存しますcontext.json。シェルから次のコマンドを実行します。

$ aws appsync evaluate-code \ --code file://code.js \ --function response \ --context file://context.json \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0

レスポンスには、ハンドラーから返されたペイロードを含む evaluationResult が含まれます。また、評価中にハンドラーによって生成されたログのリストを保持する logs オブジェクトも含まれています。これにより、コード実行のデバッグが容易になり、評価に関する情報を確認してトラブルシューティングに役立てることができます。例:

{ "evaluationResult": "{\"breed\":\"Miniature Schnauzer\",\"color\":\"black_grey\"}", "logs": [ "INFO - code.js:13:5: \"This request is allowed\"" ] }

は として解析evaluationResultできます。これによりJSON、以下が得られます。

{ "breed": "Miniature Schnauzer", "color": "black_grey" }

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

const AWS = require('aws-sdk') const fs = require('fs') const client = new AWS.AppSync({ region: 'us-east-2' }) const runtime = {name:'APPSYNC_JS',runtimeVersion:'1.0.0') test('request correctly calls DynamoDB', async () => { const code = fs.readFileSync('./code.js', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') const contextJSON = JSON.parse(context) const response = await client.evaluateCode({ code, context, runtime, function: 'request' }).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 totalTime: 1.511 s, estimated 2 s

ライブクエリのデバッグ

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

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