WIEL について

公開日
Next.jsNext.js
CMSCMS
AWSAWS

WIEL とは

WIEL は、私個人が学び得たものをアウトプットするためのパーソナルサイトです。
Web 開発やクラウドに関する知見を中心に、IT に関する様々な情報を発信する予定です。

開発した経緯

IT 業界に入り、気づけば 3 年が経過しました。
この間、プロジェクトや日々の業務を通じて様々な技術や知識を学びつつ、多くのインプットを重ねてきました。しかし、学んだことを形にして共有する機会は少なく、知識の定着に課題を感じることがありました。

そこで、自分自身の知識や経験を整理しつつ、さらに深めるためのアウトプット可能なプラットフォームの必要性を感じるようになりました。
既存サービスの利用も検討しましたが、エンジニアとして一から作り上げたいという気持ちが、WIEL を開発するモチベーションになりました。

この 3 年間、技術やノウハウを公開している多くの先人たちに支えられてきました。
同じように、このサイトで発信したコンテンツが、誰かの学びや挑戦のお役に立てば嬉しいです。

WIEL の構成

このサイトは Next.js (アプリケーション)、 Newt (コンテンツ管理)、 AWS (インフラストラクチャー) で構成しています。

site-architecture

アプリケーションはシンプルな作りなので、Next.js と TailwindCSS のみ (一部 Motion ) で作成しています。

アプリケーションデプロイ時

GitHub と Amplify を連携させ、リポジトリの特定ブランチに変更が取り込まれた時点で CI/CD パイプラインが実行されます。

deploy-architecture

一部のページは generateStaticParamsdynamic = "force-static" などで事前にビルドしています。

アプリケーション閲覧時

Amplify、Next.js のキャッシュ機能を利用してパフォーマンスを改善しています。

view-architecture

おおまかな閲覧フローは以下の通りです。

  1. クライアントからアクセスがある
  2. 事前にビルドしたページであればそれを返却し、それ以外は必要なデータを CMS にリクエストする
  3. CMS からのレスポンスを Data Cache し、それを基にページをレンダリングする
  4. レンダリングしたページは Full Route Cache した後にクライアントに返却され、一定期間 Router Cache される

クライアントへのレスポンスは Amplify CDN (CloudFront) にキャッシュされますが、Amplify は Next.js で生成された Cache-Control ヘッダーを優先する[1]ためあまり活用していません。

コンテンツ作成時

Newt はヘッドレス CMS なので、プレビューするために Next.js のドラフトモード を使用しています。

preview-architecture

コンテンツのプレビュー時に Router Handler /api/preview へリダイレクトし、ドラフトモードを有効化した (Cookie がセットされた) 上でコンテンツページへ再度リダイレクトさせます。
コンテンツページでは、ドラフトモードが有効化されている場合にのみ、下書き中の記事を取得・レンダリングして返却します。

preview-sampleプレビュー中の下書きページ

コンテンツ更新時

更新時は Newt の Webhook から Router Handler /api/update を呼び出し、revalidatePath で Next.js の Full Route Cache を再検証します。

update-architecture

更新したコンテンツに関連するページのみキャッシュを破棄し、再レンダリングを行います。

セキュリティ

最後に、詳述はしませんがこのサイトでは以下のセキュリティヘッダーを使用しています。

  • Cross-Origin-Opener-Policy (COOP)
  • Cross-Origin-Resource-Policy (CORP)
  • Content-Security-Policy (CSP)
  • Referrer-Policy
  • Permissions-Policy
  • Strict-Transport-Security
  • X-Content-Type-Options
  • X-DNS-Prefetch-Control
  • X-Frame-Options
  • X-Permitted-Cross-Domain-Policies

脚注
  1. AWS Amplify - アプリケーションのキャッシュ設定の管理 ↩︎