🍅

TypeScriptでAWS AppSyncのリゾルバーを書く

2023/08/17に公開

この記事の続きですが内容の繋がりは薄いです。
https://zenn.dev/ncdc/articles/e88449ca6c9eb6

AWS AppSyncのリゾルバーは以前はVTLという言語で書く必要があり敷居が高かったですが、今ではJavaScriptで書けるようになりました。最初に貼った記事もJavaScriptで書いたのですが、次のように感じました。

  • コンソール上のエディタでコーディングするはツラい
  • TypeScriptで書きたい

ということで、TypeScript + CDKで書きます。

書いたもの

https://github.com/k-ibaraki/appsync-js-resolver-cdk-sample

書きました。以上です。
と言いたいところですが、以下簡単に解説です。

TypeScriptでJSリゾルバーを書く

JSリゾルバーを作るCDKのConstructを作る

JavaScriptリゾルバーと書きましたが、実際はPipelineリゾルバー + Function(関数)で構成されます。この2つはそれぞれVTLを使用せずにJavaScriptで書くことができるので、それをもってJavaScriptリゾルバーと呼んでいます。ただし、あくまでJavaScriptでありTypeScriptでは有りません。
ではどうするかというと、CDK+TypeScriptでインフラのコードを書き、ついでにリゾルバーや関数のコードもTypeScriptで書き、CDKでdeployするときにJavaScriptにビルドすればよいのです。

というの考えた方の記事がこちら。
https://artofserverless.com/appsync-js-resolvers/
そして、Githubに上がっているコードをほぼ完全に丸パクリして書いたJSリゾルバーがこちらです。

https://github.com/k-ibaraki/appsync-js-resolver-cdk-sample/blob/main/construct/js-resolver.ts

注意点として、このJSリゾルバーは Pipelineリゾルバー + Function をまとめて作ります。シンプルで分かりやすくなっている反面、拡張性や柔軟性が低下しています。

こちらの方がFunction単位でConstructを書いているので、Functionを個別に欲しい場合は参考にすると良いかと思います。
https://zenn.dev/ashizaki/articles/8ad1bc443b6c56

また、試していないですが、同等の機能があると思われるライブラリがnpmに公開されていました。
https://www.npmjs.com/package/cdk-appsync-typescript-resolver

TypeScriptでJavaScriptリゾルバーを書く

AppSyncのfunctionの中身をTypeScriptで書きます。具体的にはこんな感じで書きました。
(TSで書くと言いながらかなり型をサボっているので、TSガチ勢の方々には怒られそうなコードです。)
https://github.com/k-ibaraki/appsync-js-resolver-cdk-sample/blob/main/lib/functionSource/getTaskList.ts

AWS SDKをimportしていますが、型定義が欲しかっただけでSDKを使った処理は実行していません。AppSync上からSDKは使えないですし、無理やりコードに埋め込もうとしてもサイズ制限に引っかかります。JavaScriptで書けるようになっただけでAWS SDKや外部のパッケージは使えませんし、VTLと比べてできることが増えたわけではないので注意が必要です。

構築する

あとは、こんな感じで呼び出せばOKです。
https://github.com/k-ibaraki/appsync-js-resolver-cdk-sample/blob/main/lib/appsync-js-resolver-cdk-sample-stack.ts#L56-L61

HTTP DataSourceのロールを指定する

この話は、TypeScriptというよりCDKの問題になります。また、SigV4署名を使ってAWSのAPIをHTTP DataSourceで呼び出すといったちょっと特殊なことをしたい前提の話になります。そういう予定がない人は読み飛ばしてOKです。
前回の記事でHTTP DataSourceを作るとき、cliから--service-role-arnオプションを付けてロールを指定しました。しかし、これに相当するものがCDKにはありません。つまり、HTTP DataSourceを作るときにロールの指定が出来ません。(生成されるCFnを見た所、ロールの設定が無いわけではなく強制的に中身が空のロールが作られて設定されるみたいです)
CFnを自力で書くしか無いのかと絶望しかけていたのですが、、、DataSourceを作った後にserviceRoleArnを書き換えたら無事にロールの指定ができました。
https://github.com/k-ibaraki/appsync-js-resolver-cdk-sample/blob/main/lib/appsync-js-resolver-cdk-sample-stack.ts#L42-L53
この仕様、正直意味不明なんですよね。CDKでは対応してないオプションがあることは分からなくも無いのですが、何故かauthorizationConfigで認可の設定はできるんですよね。私には認可の設定はするがロールを設定しないユースケースが思い浮かばないです。ものすごく片手落ち感がします。
後から書き換えることが出来たのでなんとかなったのですが、この書き方は抜け道っぽくて嫌だなぁと思っています。

まとめ

AWS AppSyncのリゾルバはTypeScriptで書けます。

NCDCエンジニアブログ

Discussion