AWS S3とCloudFrontでReact SPAをホスティング
React appをbuildしてS3にuploadし、CloudFront distributionとcache invalidationを設定します。
「AWS S3とCloudFrontでReact SPAをホスティング」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
S3静的ホスティングの概要
AWS S3は、静的ファイル(HTML、JS、CSS、画像)をWebサイトとして提供できます。CloudFront(CDN)と組み合わせると、React SPAにグローバルな配信、HTTPS、低レイテンシを提供できます。
SPAのビルド
Reactアプリを静的な出力ディレクトリにビルドします。
# Vite:
npm run build # outputs to dist/
# Create React App:
npm run build # outputs to build/
# Next.js static export:
next build && next export # outputs to out/S3バケットの作成と設定
S3バケットを作成し、静的ウェブサイトホスティングを有効にして、インデックスドキュメントとエラードキュメントを設定します。
# Create bucket (replace with your domain name):
aws s3 mb s3://my-react-app.com
# Enable static hosting:
aws s3 website s3://my-react-app.com --index-document index.html --error-document index.html
# Error doc = index.html handles client-side routing (React Router)ビルドファイルのアップロード
ビルドの出力をS3に同期します。ハッシュ付きアセットには積極的なキャッシュヘッダーを設定し、index.htmlにはno-cacheを設定します。
# Upload hashed assets with long cache:
aws s3 sync dist/ s3://my-react-app.com/ \
--exclude index.html \
--cache-control "max-age=31536000,immutable"
# Upload index.html with no cache (always fresh):
aws s3 cp dist/index.html s3://my-react-app.com/index.html \
--cache-control "no-cache,no-store"CloudFrontディストリビューションの作成
S3バケットを参照するCloudFrontディストリビューションを作成します。SPAのルーティングをサポートするため、RESTエンドポイントではなくS3ウェブサイトエンドポイントを使用します。
# In AWS console or CDK:
# Origin: my-react-app.com.s3-website-us-east-1.amazonaws.com
# Default root object: index.html
# Viewer protocol: Redirect HTTP to HTTPS
# Error pages: 403 → /index.html (200) for SPA routingSPAルーティングの修正
CloudFrontは不明なパスに対して403を返します(S3はReactのルートを認識しないためです)。カスタムエラーレスポンスを設定し、403を/index.htmlに変換してステータス200を返すようにします。
カスタムドメインとSSL
ドメインのACM証明書をus-east-1でリクエストします(CloudFrontでは必須です)。証明書をディストリビューションに関連付け、CloudFrontのドメインを参照するCNAME DNSレコードを追加します。
デプロイ時のキャッシュ無効化
新しいファイルをデプロイした後、CloudFrontのindex.htmlのキャッシュを無効化します。S3ではno-cacheでも、CloudFrontによってキャッシュされている可能性があるためです。
aws cloudfront create-invalidation \
--distribution-id EXXXXXXXXXXXXX \
--paths "/*"GitHub Actionsによるデプロイ
CIでデプロイワークフローを自動化します。ビルド → S3への同期 → CloudFrontのキャッシュ無効化という流れです。
- name: Deploy to S3
run: aws s3 sync dist/ s3://my-react-app.com/ --delete
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET }}
- name: Invalidate CloudFront
run: aws cloudfront create-invalidation --distribution-id ${{ secrets.CF_ID }} --paths "/*"S3バケットポリシー
バケットへのパブリックアクセスをブロックし、Origin Access Control(OAC)ポリシーを使ってCloudFrontだけがバケットを読み取れるようにします。パブリックなバケットホスティングよりも安全です。
料金の見積もり
S3の静的ホスティングは非常に安価です。ストレージは約0.023ドル/GB、リクエストは約0.0004ドル/1000リクエストです。CloudFrontの料金はリージョンとデータ転送量によって異なりますが、無料利用枠では月1TBまで無料です。
小テスト
React SPAをホスティングするとき、S3のエラードキュメントをindex.htmlに設定するのはなぜですか?
まとめ
SPAをビルドし、キャッシュを分けてS3に同期します(ハッシュ付きアセットは長期間キャッシュし、index.htmlはno-cacheにします)。そのうえでCloudFront経由で配信します。403エラーを/index.htmlにマッピングしてSPAのルーティングを修正し、GitHub Actionsでデプロイを自動化して、デプロイごとにCloudFrontのキャッシュを無効化します。
よくある質問
「AWS S3とCloudFrontでReact SPAをホスティング」レッスンは無料ですか?
はい。「AWS S3とCloudFrontでReact SPAをホスティング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「AWS S3とCloudFrontでReact SPAをホスティング」で何を学びますか?
React appをbuildしてS3にuploadし、CloudFront distributionとcache invalidationを設定します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「AWS S3とCloudFrontでReact SPAをホスティング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Vercelへのデプロイ:Zero-ConfigとPreview URLs
- AWS S3とCloudFrontでReact SPAをホスティング
- React/Next.js AppのDocker化
- React向けGitHub Actions CI/CD