Upgrade to Pro — share decks privately, control downloads, hide ads and more …

サーバーレスAPI(API Gateway+Lambda)とNext.jsで 個人ブログを作ろう!

shuntaka
July 18, 2024

サーバーレスAPI(API Gateway+Lambda)とNext.jsで 個人ブログを作ろう!

shuntaka

July 18, 2024
Tweet

More Decks by shuntaka

Other Decks in Technology

Transcript

  1. 56 const getConfig = async (): Promise<Config> => { const

    secretsAndVariables = await getVariablesAndSecrets(); const parseResult = configSchema.safeParse({ auth: { rpID: secretsAndVariables.variables.rpId, rpName: secretsAndVariables.variables.cookieDomain, }, ... }); ... return parseResult.data; }; export const config = await getConfig(); ESMを使う to level awaitの活⽤ ‧起動時環境変数 /SSM取得&バリデー ション(設定し忘れ防 ⽌) ‧以後config変数を Lambdaでグローバル 変数キャッシュ
  2. モノレポ構成 57 CIの⼀部共通化やリポジ トリ間のCDが少なくな り良い。 GHAは数年で共通化の余 地が増えた。横展可能な 秘伝タレを作ると良い。 ‧Reusing workflows

    ‧Composite action name: Setup node description: Setup Node and restore cache runs: using: 'composite' steps: - uses: actions/setup-node@v4 with: node-version-file: './.node-version' - uses: pnpm/action-setup@v4 - name: Restore node modules uses: actions/cache@v4 id: cache_dependency env: cache-name: cache-dependency with: path: '**/node_modules' key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('pnpm-lock.yaml') }} - name: Install node modules
  3. 69 Effectを試す interface Effect<Success, Failure = never, Requirements = never>

    成功時の型 依存するデータ型 (本セッションでは割 愛) 失敗時の型 Effect型について。近いのがRustのResult型。
  4. 71 Effectを試す const effects = pipe( { isLoggedIn: session.get('isLoggedIn'), userID:

    session.get('userID'), }, Schema.decodeUnknownEither(toValidSchema), Effect.flatMap(workflow) ); const result = await Effect.runPromise(effects); pipeを使って関数を合成する
  5. 72 const effects: Effect.Effect<{ isLoggedIn: boolean; user: { userName: string;

    }; }, DataBaseUnknownError | ParseError | NotFoundUserError, never> 先ほどのeffects変数の型推論。赤枠がハンドリングされていない ことが自明。副作用の存在が分かる。 Effectを試す
  6. 74 const effects = pipe( ... Effect.match({ onSuccess: (result) =>

    ({ status: 200, body: { isLoggedIn: result.isLoggedIn, user: result.user }, }), onFailure: (error) => { switch (error._tag) { case 'ParseError': return { status: 200, body: { isLoggedIn: false } }; case 'NotFoundUserError': return { status: 400, body: { isLoggedIn: false } }; case 'DataBaseUnknownError': return { status: 500, body: { code: 'InternalServerError' } }; } }, }) ); エラーハンドリング漏れを防ぐことができる。日曜大工も安心。 ハンドリングをすれば、 第⼆引数はnever型に Effectを試す
  7. レビュー協⼒/参考⽂献 82 レビュー協⼒ ‧Kyo さん (とっ散らかっていたところをまとめて下さり圧倒的感謝!) 参考⽂献 ‧Zennを⽀える技術とサービス構成 ‧TSKaigi関連  ‧TypeScript

    関数型スタイルでバックエンド開発のリアル  ‧Step by Stepで学ぶ、ADT(代数的データ型)、モナドからEffect-TSまで゙  ‧複雑なビジネスルールに挑む:正確性と効率性を両⽴するfp-tsのチーム活⽤術  ‧Effectで作る堅牢でスケーラブルなAPIゲートウェイ ‧Deno Deploy で WebAuthn を使ったサイトを作ってみた ‧パスキーのすすめ
  8. 83