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: "[email protected]", username: "nadia"}) {
username
id
}
}
{
"data": {
"signUp": {
"username": "nadia",
"id": "0656e83f-b844-4aa8-a6d1-94711905861a"
}
}
}
ユーザ情報が問題なく返却されました。
今度は、バリデーションエラーとなるように[email protected]
を入力します。
mutation MyMutation {
signUp(input: {email: "[email protected]", username: "nadia"}) {
username
id
}
}
すると、期待した通りエラーを返してくれました。
{
"data": {
"signUp": null
},
"errors": [
{
"path": [
"signUp"
],
"data": null,
"errorType": null,
"errorInfo": null,
"locations": [
{
"line": 2,
"column": 3,
"sourceName": null
}
],
"message": "\"[email protected]\" is not a valid email."
}
]
}
さいごに
今回はコンソール上から作成してみましたが、今度はCDKなどで作成してみたいと思います。
また、データソースを使用しませんでしたが、DynamoDBをはじめ様々なソースがあるのでそれもどこかの機会に試してみます。