AppSync のパイプラインリゾルバー

AppSync, DynamoDB, GraphQL, Lambda

AWS AppSync はサーバーレスでサクッと GraphQL を構築することができます。
DynamoDB や RDS、 Lambda といった AWS サービスを簡単にデータソースとして繋ぐことができるのも魅力です。
当然単一のデータソースからデータを取得することもできますが、場合によっては複数データソースをまたいでレスポンスを返したいケースがあります。
そんなときパイプラインリゾルバーを利用すると、複数のデータソースからから順にデータを取得する事ができます。

流れ

DynamoDB のイベントのデータを、RDS のデータと組み合わせて返すことにします。
RDS をデータソースに指定する場合、 Data API が使用できることが条件です。
2024/07/29 現在、利用できるクラスタータイプは以下の3つでした。

  • Aurora PostgreSQL プロビジョンドおよび Serverless v2
  • Aurora PostgreSQL Serverless v1
  • Aurora MySQL Serverless v1

今回は DBを立ち上げがめんどくさかった 利用できる既存の Aurora MySQL プロビジョンドがあったので、 Lambda をデータソースとして RDS からデータを取得してくる方法にしました。

AppSync → DynamoDB の Eventテーブル → Lambda(RDS の Userテーブル)

みたいな感じです。

実装

API 作成

AWS AppSync で API を作成します。後々作成するのでデータソースは Design from scratch で進めます。

スキーマ作成

シンプルなスキーマです。イベントの ID から紐づく nameaction を返します。

データソースの設定

DynamoDB と Lambda 用のデータソースをそれぞれ作成します。
流れに沿いたいので、一旦 Lambda は空のコードでデプロイします。

ロールについては、今回は簡単なデータ取得しかしないので以下が付与されてればよいかと思います。

DynamoDB

Lambda

関数の設定

データソースからデータを取得し、返す関数を登録します。

DynamoDB

データソースは先程作成した DynamoDB を選択します。
関数コードは渡された id を元に GetItem するだけの関数です。

触っているとわかるかと思いますが、コードサンプルに大体やりたいことのサンプルがあります。
このコードもそのままです。

Lambda

同じく先程作成した Lambda のデータソースを選択します。
今回は Lambda が2番目になるためサンプルコードを少しだけいじる必要があります。

Lambda の実装

リゾルバーの設定

定義した getEvent にリゾルバーをアタッチします。
パイプラインリゾルバーを選択し、ランタイムを AppSync JavaScript(APPSYNC_JS)で進めます。
これで getEvent にリゾルバーが紐づきました。
作成したパイプラインから関数を追加することができるので、作成した DynamoDB と Lambda の関数を設定します。

動作の確認

クエリを実行すると

image-20240729103016485.png

レスポンス確認できました。
今回のように first_name と last_name を組み合わせるくらいの処理や、簡単なビジネスロジックならリゾルバー上でやってしまっても良いのかも(?)
なので RDS Data API が利用できるなら、わざわざ Lambda を挟まなくても良さそうです。
AppSync の関数内で複雑なことをするときはログ記録を有効化しておくと良いかもです。ログレベルまで設定しないと INFO レベルが出力されないので注意です(気づかなかった)。

この記事を書いた人

田村航也
田村航也
Python をメインに API を書いてるエンジニア
最近書いた記事