AWS AppSync でパイプラインリゾルバーを設定してみた

AWS AppSync でパイプラインリゾルバーを設定してみた

2024.11.25

こんにちは、森田です。

AWS AppSync では、GraphQLのリゾルバーを関数として作成することができます。

また、この時の関数については、単一の関数ではなく、複数の関数を組み合わせて、パイプラインリゾルバーとして構成することもできます。

本記事では、JavaScript を使ったパイプラインリゾルバーを設定してみます。

やってみた

APIの作成

AWSマネジメントコンソールで作成を行います。

APIタイプにGraphQL APIs、GraphQL API データソースにDesign from scratchを選択して「次へ」を選択します。

img.png

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

img.png

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

img.png

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

img.png

データソースの作成

まずは、データソースの作成を行います。

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

img.png

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

img.png

スキーマ作成

続いて、スキーマの作成を行います。

今回はサインアップを想定したスキーマを作成します。

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 } 

スキーマ入力後、画面上部の「スキーマを保存」を選択します。

img_23.png

リゾルバーの作成

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

img.png

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

img.png

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 関数の作成

続いて、パイプラインで使用する関数を作成します。

以下のように「関数を作成」を選択します。

img.png

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

データソースには、nonesourceを選択します。

img.png

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

img.png

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

img.png

以下のコードを入力し、保存を行います。

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 関数を作成します。

img.png

以下のコードを入力し、保存を行います。

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のみを生成する処理となっています。

最終的に以下のように関数を定義しています。

img.png

このパイプラインでは、以下の順で処理が実行されます。

  • Mutation リクエストハンドラ
  • validateEmail 関数
  • saveUser 関数
  • Mutation レスポンスハンドラ

クエリの実行

では、実際にクエリを実行して期待した動作を行うか確認してみます。

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

img.png

{ "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をはじめ様々なソースがあるのでそれもどこかの機会に試してみます。

https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers-js.html

この記事をシェアする

FacebookHatena blogX

関連記事