AWS AppSync でパイプラインリゾルバーを設定してみた
こんにちは、森田です。
AWS AppSync では、GraphQLのリゾルバーを関数として作成することができます。
また、この時の関数については、単一の関数ではなく、複数の関数を組み合わせて、パイプラインリゾルバーとして構成することもできます。
本記事では、JavaScript を使ったパイプラインリゾルバーを設定してみます。
やってみた
APIの作成
AWSマネジメントコンソールで作成を行います。
APIタイプにGraphQL APIs、GraphQL API データソースにDesign from scratchを選択して「次へ」を選択します。

名前は、sample-apiを入力し、「次へ」を選択します。

GraphQL タイプは、後で GraphQL リソースを作成を選択し、「次へ」を選択します。

最後に「APIを作成」を選択します。

データソースの作成
まずは、データソースの作成を行います。
データソースのページを開き、「データソースを作成」を選択します。

特に、DynamoDBなどは利用しませんので、「NONE」を選択して作成します。

スキーマ作成
続いて、スキーマの作成を行います。
今回はサインアップを想定したスキーマを作成します。
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 } スキーマ入力後、画面上部の「スキーマを保存」を選択します。

リゾルバーの作成
スキーマ作成後、Mutationのリゾルバーを設定します。

リゾルバータイプはパイプラインリゾルバー、リゾルバーランタイムはAppSync JavaScriptを選択し、「作成」を選択します。

Mutationのリクエスト/レスポンスの定義
まずは、パイプラインのリクエスト、レスポンスを行う関数を作成します。
export function request(ctx) { ctx.stash.email = ctx.args.input.email return {}; } export function response(ctx) { return ctx.prev.result; } この関数では、入力されたemailをパイプラインで処理しやすいようにctx.stash.emailに代入しています。
validateEmail 関数の作成
続いて、パイプラインで使用する関数を作成します。
以下のように「関数を作成」を選択します。

今回の処理では、サインアップを想定していますので、事前にメールアドレスのバリデーションを行うvalidateEmail 関数の作成を行います。
データソースには、nonesourceを選択します。

作成後、関数を追加から「validateEmail」を選択し、追加します。

追加後、validateEmail関数を編集します。

以下のコードを入力し、保存を行います。
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { email } = ctx.stash; const valid = util.matches( '^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com', email ); if (!valid) { util.error(`"${email}" is not a valid email.`); } return { payload: { email } }; } export function response(ctx) { return ctx.result; } saveUser 関数の作成
新規に関数の追加を行い、同様にsaveUser 関数を作成します。

以下のコードを入力し、保存を行います。
import { util } from '@aws-appsync/utils'; export function request(ctx) { return ctx.prev.result; } export function response(ctx) { ctx.result.id = util.autoId(); return ctx.result; } なお、上記のコードでは、ユーザの作成は実際に行ってはおらず、IDのみを生成する処理となっています。
最終的に以下のように関数を定義しています。

このパイプラインでは、以下の順で処理が実行されます。
- Mutation リクエストハンドラ
- validateEmail 関数
- saveUser 関数
- Mutation レスポンスハンドラ
クエリの実行
では、実際にクエリを実行して期待した動作を行うか確認してみます。
mutation MyMutation { signUp(input: {email: "nadia2@myvaliddomain.com", username: "nadia"}) { username id } } 
{ "data": { "signUp": { "username": "nadia", "id": "0656e83f-b844-4aa8-a6d1-94711905861a" } } } ユーザ情報が問題なく返却されました。
今度は、バリデーションエラーとなるようにnadia2@myvaliddomain2.comを入力します。
mutation MyMutation { signUp(input: {email: "nadia2@myvaliddomain2.com", username: "nadia"}) { username id } } すると、期待した通りエラーを返してくれました。
{ "data": { "signUp": null }, "errors": [ { "path": [ "signUp" ], "data": null, "errorType": null, "errorInfo": null, "locations": [ { "line": 2, "column": 3, "sourceName": null } ], "message": "\"nadia2@myvaliddomain2.com\" is not a valid email." } ] } さいごに
今回はコンソール上から作成してみましたが、今度はCDKなどで作成してみたいと思います。
また、データソースを使用しませんでしたが、DynamoDBをはじめ様々なソースがあるのでそれもどこかの機会に試してみます。






