パイプラインリゾルバー (VTL) - AWS AppSync

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

パイプラインリゾルバー (VTL)

注記

現在、主にAPPSYNC_JS ランタイムとそのドキュメントをサポートしています。こちらにある APPSYNC_JS ランタイムとそのガイドの使用をご検討ください。

AWS AppSync は GraphQL フィールドでリゾルバーを実行します。場合によっては、アプリケーションは 1 つの GraphQL フィールドを解決するために複数のオペレーションを実行する必要があります。パイプラインリゾルバーを使用すると、開発者は関数と呼ばれるオペレーションを構成して順番に実行できます。パイプラインリゾルバーは、たとえば、フィールドのデータを取得する前に承認チェックを実行する必要があるアプリケーションに便利です。

パイプラインリゾルバーは、Before マッピングテンプレート、After マッピングテンプレート、関数のリストで構成されています。各関数には、データソースに対して実行されるリクエストおよびレスポンスマッピングテンプレートがあります。パイプラインリゾルバーは実行をリスト内の関数に委任するため、いずれのデータソースにもリンクされていません。ユニットリゾルバーと関数は、データソースに対してオペレーションを実行するプリミティブです。詳細については、「リゾルバーのマッピングテンプレートの概要」を参照してください。

パイプラインリゾルバーを作成する

AWS AppSync コンソールで、[スキーマ] ページに移動します。

以下のスキーマを保存します。

schema { query: Query mutation: Mutation } type Mutation { signUp(input: Signup): User } type Query { getUser(id: ID!): User } input Signup { username: String! email: String! } type User { id: ID! username: String email: AWSEmail }

パイプラインリゾルバーをミューテーションタイプのSignUpフィールドに書き込みます。右側の [ミューテーション] タイプで、[signUp ミューテーション] フィールドの横の [アタッチ] を選択します。[リゾルバーの作成] ページで、[アクション][ランタイム更新] の順にクリックします。Pipeline Resolver を選択して、VTL を選択してから、[更新] を選択します。このページには、Before マッピングテンプレートテキスト領域、関数セクション、After マッピングテンプレートテキスト領域の 3 つのセクションが表示されています。

パイプラインリゾルバーは、最初に E メールアドレスの入力を検証してからシステムにユーザーを保存することで、ユーザーをサインアップします。E メールの検証を validateEmail 関数内にカプセル化し、ユーザーの保存を saveUser 関数内にカプセル化します。validateEmail 関数が最初に実行され、E メールが有効であれば、saveUser 関数が実行されます。

実行フローは以下のようになります。

  1. Mutation.signUp リゾルバーのリクエストマッピングテンプレート

  2. validateEmail 関数

  3. saveUser 関数

  4. Mutation.signUp リゾルバーのレスポンスマッピングテンプレート

API の他のリゾルバーで validateEmail 関数を再利用することが多いため、GraphQL フィールド間でアクセス先の $ctx.args が変わるのを避けるとします。この場合、代わりに $ctx.stash を使用して、signUp(input: Signup) 入力フィールド引数からの email 属性を保存できます。

BEFORE マッピングテンプレート:

## store email input field into a generic email key $util.qr($ctx.stash.put("email", $ctx.args.input.email)) {}

コンソールから、デフォルトのパススルー AFTER マッピングテンプレートを使用できます。

$util.toJson($ctx.result)

[作成] または [保存] を選択してリゾルバーを更新します。

関数を作成する

パイプラインリゾルバーページの [関数] セクションで、[関数の作成] をクリックして、[新しい関数の作成] をクリックします。リゾルバーページを通らずに関数を作成することもできます。そのためには、AWS AppSync コンソールで [関数] ページに進みます。[関数の作成] ボタンを選択します。E メールが有効であり特定のドメインからのものかどうかをチェックする関数を作成しましょう。E メールが無効な場合、この関数はエラーを発生させます。それ以外の場合、渡された入力をすべて転送します。

新しい関数ページで、[アクション] を選択して、[ランタイムを更新] を選択します。VTL を選択してから、[更新] を選択します。NONE 型のデータソースが作成されたことを確認してください。[データソース名] リストでこのデータソースを選択します。[関数名]validateEmail と入力します。関数コード 領域で、次のスニペットですべてを上書きします。

#set($valid = $util.matches("^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com", $ctx.stash.email)) #if (!$valid) $util.error("$ctx.stash.email is not a valid email.") #end { "payload": { "email": $util.toJson(${ctx.stash.email}) } }

レスポンスマッピングテンプレートにこれを貼り付けます。

$util.toJson($ctx.result)

変更内容を確認し、[作成] を選択します。これで、validateEmail 関数が作成されました。次のリクエストマッピングテンプレートとレスポンスマッピングテンプレートでこれらの手順を繰り返し、saveUser 関数を作成します (わかりやすくするため、NONE データソースを使用し、関数が実行された後にユーザーがシステムに保存されたものとしています。):

リクエストマッピングテンプレート:

## $ctx.prev.result contains the signup input values. We could have also ## used $ctx.args.input. { "payload": $util.toJson($ctx.prev.result) }

レスポンスマッピングテンプレート

## an id is required so let's add a unique random identifier to the output $util.qr($ctx.result.put("id", $util.autoId())) $util.toJson($ctx.result)

これで、saveUser 関数が作成されました。

パイプラインリゾルバーへの関数の追加

先ほど作成したパイプラインリゾルバーには関数が自動的に追加されています。そうでない場合、または [関数] ページで関数を作成した場合は、リゾルバーページの [関数を追加] をクリックして、それらの関数をアタッチできます。validateEmailsaveUser の両方の関数をリゾルバーに追加します。validateEmail 関数は saveUser 関数の前に配置する必要があります。関数を追加するときには、上に移動および下に移動オプションを使用して関数の実行順序を並べ替えることができます。変更を確認し、[保存] を選択します。

クエリの実行

AWS AppSync コンソールで、[クエリ] ページに移動します。Explorer で、ミューテーションを使用していることを確認します。そうでない場合は、ドロップダウンリストから [Mutation] を選択し、[+] を選択します。以下のクエリを入力します。

mutation { signUp(input: { email: "nadia@myvaliddomain.com" username: "nadia" }) { id email } }

以下のように返されます。

{ "data": { "signUp": { "id": "256b6cc2-4694-46f4-a55e-8cb14cc5d7fc", "email": "nadia@myvaliddomain.com" } } }

これで、パイプラインリゾルバーを使用して、ユーザーをサインアップし、入力 E メールを検証できました。パイプラインリゾルバーに焦点を当てたより完全なチュートリアルについては、「チュートリアル: パイプラインリゾルバー」を参照してください。