2023/09/23に開催されたServerlessDays Tokyo 2023で登壇した資料です
Next.js × AWS App Runner ×AWS AppSyncで進めるクライアントファーストのWEB開発岡 春奈
View Slide
自己紹介名前: 岡 春奈Twitter: @OkaHaruna職業: フリーランスエンジニア趣味: 猫とラーメン
今入っている案件のアーキテクチャをベースに話しますバックエンド周り(AppSync)の話がメインです本日の内容について
アーキテクチャー図
CDNはクローリング対策のためCloudflareを選択Auth0は高すぎて断念Workers, R2も検討対象になったが冒険になってしまうため断念技術スタックの選定理由
Amplifyに頼らないAppSync構築リゾルバー実装GraphQL Code Generatorの活用AppSync Topic
Amplifyに頼らないAppSync構築IaCはCDKを利用とは言いつつ実は当初はAmplify CLIで構築されていた(初期構築時フロントメンバーしかいなかった為)カスタマイズ性と長期運用を見越してCDKに移行
2022/11にJavaScriptリゾルバーがリリースCDKのカスタムコンストラクタを利用してデプロイ時にコンパイル利用するリゾルバは3種類ユニットリゾルバーパイプラインリゾルバーLambdaリゾルバーリゾルバー実装
リゾルバー実装https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html公式でesbuildを使う方法を紹介してるのでこれに倣う
リゾルバー実装(ビルド用のutility)
リゾルバー実装(ユニットリゾルバー)
リゾルバー実装(パイプラインリゾルバー)
リゾルバー実装(Lambdaリゾルバー)
@aws-appsync/utils/dynamodbがアップデートリゾルバー実装 - DynamoDBにアクセス -
@aws-appsync/eslint-pluginでリゾルバーのチェック(esbuild-plugin-eslintでビルド時に実行も可)リゾルバー実装 - Lint -
基本的にはユニットリゾルバーで済ませる認証の処理を挟むときはパイプラインリゾルバーLambdaリゾルバーも必要になった時のみ例)署名付きURLの発行、等管理コストを下げるため同時実行数を気にしたくないためリゾルバーの使い分け
util.autoUlid()を使ってIDはULIDに統一IDで時系列のソートが可能TransactWriteItems等、1つの関数内で複数のデータソースにアクセスしたい時はdataSource.grantPrincipal.addToPrincipalPolicy()リゾルバーのTips
urqlを利用Apolloよりもシンプルに実装できるためエンドポイント毎の認証切り替えには@urql/exchange-authを使うGraphQLクライアント
operationファイルはAmplifyで生成(query GetContent($id: ID!)...の定義ファイル)pluginを使ってurqlのhookまで自動生成typescripttypescript-operationstypescript-urqlCodegenConfig.hooks.afterAllFileWriteで整形GraphQL Code Generatorの活用
デフォルトで構造化ログが出力される→CloudWatch Insightで検索可能開発環境はfieldLogLevelをALLにしておくxrayEnabledでxrayを有効化しておく他Tips
開発プロセスについて
Next.js, CDK, API全てTypescriptの為モノレポに管理ツールにTurborepoを選択した理由Nxはオーバースペックだった必要以上に設定を共通化せず開発に支障が出ないのを第一にPrettierはルートで共通化(分けたかったらoverrides)ESLintは各パッケージで実行、等Turborepoでのモノレポ管理
AWSのリソースは全てCDKに集約CloudflareのリソースはTerraformで実装中IaC - CDKとTerraform -
環境毎のアカウントにOIDCでアクセスしてデプロイCI/CD
速度重視のためトランクベースを採用AWSの公式Docでも「Gitflowはレガシー」と書かれているためhttps://docs.aws.amazon.com/prescriptive-guidance/latest/strategy-cicd-litmus/fully-cicd-process-differences.htmlCI/CD
もう少しCloudflare使っていきたいテストやエミュレートがしづらいnpm workspace辛い(pnpmかbunに移行したい)頻繁な仕様変更に伴うDynamoDBの設計が難しい課題感
MVP開発とサーバーレスは相性抜群Amplifyはライブラリだけ局所的に使うのがおすすめGraphQLとRESTは今後も使い分けていくまとめ