パイプラインリゾルバー (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 resolver リクエストマッピングテンプレート

  2. validateEmail 関数

  3. saveUser 関数

  4. Mutation.signUp resolver レスポンスマッピングテンプレート

validateEmail 関数は、 の他のリゾルバーで再利用される可能性が高い$ctx.argsためAPI、 へのアクセスは避けたいと考えています。これは、関数が GraphQL フィールド間で変更されるためです。この場合、代わりに $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 関数を作成しました。

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

先ほど作成したパイプラインリゾルバーには関数が自動的に追加されています。そうでない場合、または [関数] ページで関数を作成した場合は、リゾルバーページの [関数を追加] をクリックして、それらの関数をアタッチできます。validateEmail saveUser と 関数の両方をリゾルバーに追加します。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 メールを検証できました。パイプラインリゾルバーに焦点を当てたより完全なチュートリアルについては、「チュートリアル: パイプラインリゾルバー」を参照してください。