Slide 1

Slide 1 text

Next.js × AWS App Runner × AWS AppSync で進める クライアントファーストのWEB 開発 岡 春奈

Slide 2

Slide 2 text

自己紹介 名前: 岡 春奈 Twitter: @OkaHaruna 職業: フリーランスエンジニア  趣味: 猫とラーメン

Slide 3

Slide 3 text

今入っている案件のアーキテクチャをベースに話します バックエンド周り(AppSync) の話がメインです 本日の内容について

Slide 4

Slide 4 text

アーキテクチャー図

Slide 5

Slide 5 text

CDN はクローリング対策のためCloudflare を選択 Auth0 は高すぎて断念 Workers, R2 も検討対象になったが冒険になってしま うため断念 技術スタックの選定理由

Slide 6

Slide 6 text

Amplify に頼らないAppSync 構築 リゾルバー実装 GraphQL Code Generator の活用 AppSync Topic

Slide 7

Slide 7 text

Amplify に頼らないAppSync 構築 IaC はCDK を利用 とは言いつつ実は当初はAmplify CLI で構築されていた ( 初期構築時フロントメンバーしかいなかった為) カスタマイズ性と長期運用を見越してCDK に移行

Slide 8

Slide 8 text

2022/11 にJavaScript リゾルバーがリリース CDK のカスタムコンストラクタを利用してデプロイ時 にコンパイル 利用するリゾルバは3 種類 ユニットリゾルバー パイプラインリゾルバー Lambda リゾルバー リゾルバー実装

Slide 9

Slide 9 text

リゾルバー実装 https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html 公式でesbuild を使う方法を 紹介してるのでこれに倣う

Slide 10

Slide 10 text

リゾルバー実装(ビルド用のutility )

Slide 11

Slide 11 text

リゾルバー実装(ユニットリゾルバー)

Slide 12

Slide 12 text

リゾルバー実装(パイプラインリゾルバー)

Slide 13

Slide 13 text

リゾルバー実装(Lambda リゾルバー)

Slide 14

Slide 14 text

@aws-appsync/utils/dynamodb がアップデート リゾルバー実装 - DynamoDB にアクセス -

Slide 15

Slide 15 text

@aws-appsync/utils/dynamodb がアップデート リゾルバー実装 - DynamoDB にアクセス -

Slide 16

Slide 16 text

@aws-appsync/eslint-plugin でリゾルバーのチェック (esbuild-plugin-eslint でビルド時に実行も可) リゾルバー実装 - Lint -

Slide 17

Slide 17 text

基本的にはユニットリゾルバーで済ませる 認証の処理を挟むときはパイプラインリゾルバー Lambda リゾルバーも必要になった時のみ 例) 署名付きURL の発行、等 管理コストを下げるため 同時実行数を気にしたくないため リゾルバーの使い分け

Slide 18

Slide 18 text

util.autoUlid() を使ってID はULID に統一 ID で時系列のソートが可能 TransactWriteItems 等、1 つの関数内で複数のデータソ ースにアクセスしたい時は dataSource.grantPrincipal.addToPrincipalPolicy() リゾルバーのTips

Slide 19

Slide 19 text

urql を利用 Apollo よりもシンプルに実装できるため エンドポイント毎の認証切り替えには @urql/exchange-auth を使う GraphQL クライアント

Slide 20

Slide 20 text

operation ファイルはAmplify で生成 (query GetContent($id: ID!)... の定義ファイル) plugin を使ってurql のhook まで自動生成 typescript typescript-operations typescript-urql CodegenConfig.hooks.afterAllFileWrite で整形 GraphQL Code Generator の活用

Slide 21

Slide 21 text

デフォルトで構造化ログが出力される →CloudWatch Insight で検索可能 開発環境はfieldLogLevel をALL にしておく xrayEnabled でxray を有効化しておく 他Tips

Slide 22

Slide 22 text

開発プロセスについて

Slide 23

Slide 23 text

Next.js, CDK, API 全てTypescript の為モノレポに 管理ツールにTurborepo を選択した理由 Nx はオーバースペックだった 必要以上に設定を共通化せず開発に支障が出ないのを 第一に Prettier はルートで共通化( 分けたかったらoverrides) ESLint は各パッケージで実行、等 Turborepo でのモノレポ管理

Slide 24

Slide 24 text

AWS のリソースは全てCDK に集約 Cloudflare のリソースはTerraform で実装中 IaC - CDK とTerraform -

Slide 25

Slide 25 text

環境毎のアカウントにOIDC でアクセスしてデプロイ CI/CD

Slide 26

Slide 26 text

速度重視のためトランクベースを採用 AWS の公式Doc でも「Gitflow はレガシー」と書か れているため https://docs.aws.amazon.com/prescriptive- guidance/latest/strategy-cicd-litmus/fully- cicd-process-differences.html CI/CD

Slide 27

Slide 27 text

もう少しCloudflare 使っていきたい テストやエミュレートがしづらい npm workspace 辛い(pnpm かbun に移行したい) 頻繁な仕様変更に伴うDynamoDB の設計が難しい 課題感

Slide 28

Slide 28 text

MVP 開発とサーバーレスは相性抜群 Amplify はライブラリだけ局所的に使うのがおすすめ GraphQL とREST は今後も使い分けていく まとめ