TypeScriptでAWS AppSyncのリゾルバーを書く
この記事の続きですが内容の繋がりは薄いです。
AWS AppSyncのリゾルバーは以前はVTLという言語で書く必要があり敷居が高かったですが、今ではJavaScriptで書けるようになりました。最初に貼った記事もJavaScriptで書いたのですが、次のように感じました。
- コンソール上のエディタでコーディングするはツラい
- TypeScriptで書きたい
ということで、TypeScript + CDKで書きます。
書いたもの
書きました。以上です。
と言いたいところですが、以下簡単に解説です。
TypeScriptでJSリゾルバーを書く
JSリゾルバーを作るCDKのConstructを作る
JavaScriptリゾルバーと書きましたが、実際はPipelineリゾルバー + Function(関数)で構成されます。この2つはそれぞれVTLを使用せずにJavaScriptで書くことができるので、それをもってJavaScriptリゾルバーと呼んでいます。ただし、あくまでJavaScriptでありTypeScriptでは有りません。
ではどうするかというと、CDK+TypeScriptでインフラのコードを書き、ついでにリゾルバーや関数のコードもTypeScriptで書き、CDKでdeployするときにJavaScriptにビルドすればよいのです。
というの考えた方の記事がこちら。Githubに上がっているコードをほぼ完全に丸パクリして書いたJSリゾルバーがこちらです。
そして、
注意点として、このJSリゾルバーは Pipelineリゾルバー + Function をまとめて作ります。シンプルで分かりやすくなっている反面、拡張性や柔軟性が低下しています。
こちらの方がFunction単位でConstructを書いているので、Functionを個別に欲しい場合は参考にすると良いかと思います。
また、試していないですが、同等の機能があると思われるライブラリがnpmに公開されていました。
TypeScriptでJavaScriptリゾルバーを書く
AppSyncのfunctionの中身をTypeScriptで書きます。具体的にはこんな感じで書きました。
(TSで書くと言いながらかなり型をサボっているので、TSガチ勢の方々には怒られそうなコードです。)
AWS SDKをimportしていますが、型定義が欲しかっただけでSDKを使った処理は実行していません。AppSync上からSDKは使えないですし、無理やりコードに埋め込もうとしてもサイズ制限に引っかかります。JavaScriptで書けるようになっただけでAWS SDKや外部のパッケージは使えませんし、VTLと比べてできることが増えたわけではないので注意が必要です。
構築する
あとは、こんな感じで呼び出せばOKです。
HTTP DataSourceのロールを指定する
この話は、TypeScriptというよりCDKの問題になります。また、SigV4署名を使ってAWSのAPIをHTTP DataSourceで呼び出すといったちょっと特殊なことをしたい前提の話になります。そういう予定がない人は読み飛ばしてOKです。
前回の記事でHTTP DataSourceを作るとき、cliから--service-role-arn
オプションを付けてロールを指定しました。しかし、これに相当するものがCDKにはありません。つまり、HTTP DataSourceを作るときにロールの指定が出来ません。(生成されるCFnを見た所、ロールの設定が無いわけではなく強制的に中身が空のロールが作られて設定されるみたいです)
CFnを自力で書くしか無いのかと絶望しかけていたのですが、、、DataSourceを作った後にserviceRoleArnを書き換えたら無事にロールの指定ができました。
この仕様、正直意味不明なんですよね。CDKでは対応してないオプションがあることは分からなくも無いのですが、何故かauthorizationConfig
で認可の設定はできるんですよね。私には認可の設定はするがロールを設定しないユースケースが思い浮かばないです。ものすごく片手落ち感がします。
後から書き換えることが出来たのでなんとかなったのですが、この書き方は抜け道っぽくて嫌だなぁと思っています。
まとめ
AWS AppSyncのリゾルバはTypeScriptで書けます。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion