Deploy React Router SPA on AWS S3 and CloudFront
You can deploy a React Router v7 single-page application (SPA) with Vite on your AWS account.
There are two ways to deploy your React Router SPA on AWS:
-
Using the AWS Cloud Development Kit (CDK) with the CDK-SPA package.
-
Using the Thunder console to deploy your app with a few clicks.
The build artifacts (HTML, CSS and JavaScript) will be stored in an S3 bucket and served using CloudFront CDN.
View code in StackBlitz
Deploy using AWS CDK
CDK-SPA is a package that simplifies the deployment of single-page applications (SPAs) to AWS using the AWS Cloud Development Kit (CDK). It provides a straightforward way to deploy your React Router app to AWS S3 and CloudFront.
1. Create a project
You can create a new Vite project with React using the following command:
npm create vite@latest my-react-router-app -- --template react-tscd my-react-router-app
pnpm create vite my-react-router-app --template react-tscd my-react-router-app
bun create vite my-react-router-app --template react-tscd my-react-router-appbun pm trust --all
Then install React Router v7:
npm install react-router-dom@7
2. Initialize your project
Install the necessary dependencies and initialize your project:
npm i tsx aws-cdk-lib @thunderso/cdk-spa --save-dev
pnpm add -D tsx aws-cdk-lib @thunderso/cdk-spa
bun add -d tsx aws-cdk-lib @thunderso/cdk-spa
Create a stack/index.ts
file. Edit it to match your project:
import { App } from "aws-cdk-lib";import { SPAStack, type SPAProps } from "@thunderso/cdk-spa";
const myApp: SPAProps = { env: { account: 'your-account-id', region: 'us-east-1' }, application: 'your-application-id', service: 'your-service-id', environment: 'production',
rootDir: '', // e.g. 'frontend/' for monorepos outputDir: 'dist/',};
new SPAStack( new App(), `${myApp.application}-${myApp.service}-${myApp.environment}-stack`, myApp);
3. Deploy
Before you deploy, run your build script to generate artifacts in the dist
directory.
npm run build
pnpm run build
bun run build
By running the following script, the CDK stack will be deployed to AWS.
npx cdk deploy --all --app="npx tsx stack/index.ts"
pnpm exec cdk deploy --all --app="pnpm exec tsx stack/index.ts"
bunx cdk deploy --all --app="bunx tsx stack/index.ts"
When the deployment is complete, you will see the CloudFront URL in the output. You can access your React Router app at that URL.
For complete documentation on how to use CDK-SPA, refer to the CDK-SPA documentation.
Deploy using Thunder console
You can also deploy your React Router app on AWS using the Thunder console.
Build Settings
Use the following commands in the build step settings:
npm install
npm run build
dist
npx pnpm install
npx pnpm run build
dist
npx bun install
npx bun run build
dist
Environment Variables
Environment variables in Vite are available at build time and can be used both in your config files and templates. For more information, refer to the official Vite documentation on environment variables.
-
Define your environment variables in the Thunder console under the Environment Variables section of your project settings.
-
In your code, you can define them in an
.env
file at the root of your project:
VITE_API_URL=https://api.example.com
Use it in your application:
const apiUrl = import.meta.env.VITE_API_URL;
export function App() { return ( <div> <p>API URL: {apiUrl}</p> </div> );}