Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Next.js × AWS App Runner × AWS AppSyncで進めるクライアン...
Search
Haruna Oka
September 23, 2023
Programming
7
5.1k
Next.js × AWS App Runner × AWS AppSyncで進めるクライアントファーストのWEB開発
2023/09/23に開催されたServerlessDays Tokyo 2023で登壇した資料です
Haruna Oka
September 23, 2023
Tweet
Share
More Decks by Haruna Oka
See All by Haruna Oka
AWS AppSyncと仲良くするためのTips
okaharuna
1
96
re:Growth 2020 Serverless
okaharuna
2
1.3k
EventBridgeでAWSとShopifyの統合
okaharuna
2
5.5k
Serverless SPA development starting with Angular
okaharuna
0
3.2k
serverlessdaysfukuoka_oka.pdf
okaharuna
1
2k
SPA×Auth0
okaharuna
5
1.9k
Fargate_Super_Introduction.pdf
okaharuna
2
3k
Other Decks in Programming
See All in Programming
From Spring Boot 2 to Spring Boot 3 with Java 22 and Jakarta EE
ivargrimstad
0
1k
Amazon Neptuneで始める初めてのグラフDB ー グラフDBを使う意味を考える ー
satoshi256kbyte
2
180
dRuby 入門者によるあなたの身近にあるdRuby 入門
makicamel
4
340
Regular Expressions, REXML, Automata Learning
makenowjust
0
190
『ドメイン駆動設計をはじめよう』中核の業務領域
masuda220
PRO
5
870
現代のVueとTypeScript - 型安全の活用術
minako__ph
4
3.1k
TypeScriptで 負荷テストを書こう 〜k6のシングルバイナリの秘密〜
dora1998
7
2.9k
Wallet API, Verifier APIで実現するIDカード on iPhoneの世界
shitamori1272
1
340
Swiftコードバトル必勝法
toshi0383
0
150
ゲームボーイアドバンスでSwiftを動かそう
k_koheyi
0
520
iOSの隠されたAPIを解明し、開発効率を向上させる方法/iOSDC24
noppefoxwolf
2
120
Boost Your Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
1
1k
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
25
5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
502
140k
A better future with KSS
kneath
235
17k
The Invisible Customer
myddelton
119
13k
Music & Morning Musume
bryan
46
6k
Fashionably flexible responsive web design (full day workshop)
malarkey
400
65k
A Tale of Four Properties
chriscoyier
155
22k
The Straight Up "How To Draw Better" Workshop
denniskardys
230
130k
Build The Right Thing And Hit Your Dates
maggiecrowley
30
2.2k
Fantastic passwords and where to find them - at NoRuKo
philnash
47
2.8k
Why You Should Never Use an ORM
jnunemaker
PRO
53
8.9k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
88
16k
Transcript
Next.js × AWS App Runner × AWS AppSync で進める クライアントファーストのWEB
開発 岡 春奈
自己紹介 名前: 岡 春奈 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/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
まで自動生成 typescript typescript-operations typescript-urql CodegenConfig.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.html CI/CD
もう少しCloudflare 使っていきたい テストやエミュレートがしづらい npm workspace 辛い(pnpm かbun に移行したい) 頻繁な仕様変更に伴うDynamoDB の設計が難しい
課題感
MVP 開発とサーバーレスは相性抜群 Amplify はライブラリだけ局所的に使うのがおすすめ GraphQL とREST は今後も使い分けていく まとめ