TanStack Start を Amplify Hosting にデプロイする


TanStack Start は TanStack Router をベースにしたフルスタック React フレームワークです。 本記事では TanStack Start で作ったアプリを AWS Amplify Hosting にデプロイする方法と、サーバーサイドから AppSync・S3 などの AWS サービスを認証付きで呼び出すためのアダプターを紹介します。

Nitro + aws_amplify プリセットで基本的なホスティング

TanStack Start は Nitro をサーバーエンジンとして使います。 Nitro には aws_amplify プリセットが組み込まれており、AWS API の呼び出しを含まないシンプルなアプリであれば追加のアダプターなしで Amplify Hosting へデプロイできます。

vite.config.ts で以下のように設定します。

import { defineConfig } from "vite";
import { tanstackStart } from "@tanstack/react-start/plugin/vite";
import viteReact from "@vitejs/plugin-react";
import { nitro } from "nitro/vite";

export default defineConfig({
  plugins: [
    nitro({ config: { preset: "aws_amplify", awsAmplify: { runtime: "nodejs24.x" } } }),
    tanstackStart(),
    viteReact(),
  ],
});

ビルド後は .amplify-hosting ディレクトリに成果物が出力されるので、amplify.yml でそのディレクトリを指定します。

version: 1
frontend:
  preBuild:
    commands:
      - npm install
  build:
    commands:
      - npm run build
  artifacts:
    baseDirectory: .amplify-hosting

認証が必要な AWS API 呼び出しにはアダプターが必要

AppSync(Amplify Data)や S3(Amplify Storage)を サーバーサイドで認証付きで呼び出す 場合、Amplify の SSR サポートを有効にする必要があります。

Amplify JS の SSR サポートは Next.js・Nuxt 向けのアダプターが公式で提供されていますが、TanStack Start 向けは提供されていませんでした。 そこで TanStack Start 向けのアダプターを作成し、npm パッケージとして公開しました。

amplify-adapter-tanstack-start の使い方

インストール

npm add aws-amplify amplify-adapter-tanstack-start

サーバーサイド用の設定

src/lib/amplifyServerUtils.ts を作成し、createServerRunnerrunWithAmplifyServerContext を初期化します。

import { createServerRunner } from "amplify-adapter-tanstack-start";
import outputs from "../../amplify_outputs.json";

export const { runWithAmplifyServerContext } = createServerRunner({
  config: outputs,
});

サーバーサイド用の Data クライアント生成

src/lib/amplify-ssr-client.ts を作成し、SSR 向けの Data クライアントを用意します。

import type { Schema } from "../../amplify/data/resource";
import { parseAmplifyConfig } from "aws-amplify/utils";
import { generateClient } from "aws-amplify/api/server";
import config from "../../amplify_outputs.json";

const amplifyConfig = parseAmplifyConfig(config);
export const client = generateClient<Schema>({
  config: amplifyConfig,
});

クライアントサイド用の設定

ルートコンポーネント(src/routes/__root.tsx 等)で Amplify.configure を呼び出します。 ssr: true が必須です。これにより認証トークンがブラウザの Cookie に保存され、サーバーへのリクエスト時に Cookie が自動的に送信されます。

import { Amplify } from "aws-amplify";
import config from "../../amplify_outputs.json";

Amplify.configure(config, { ssr: true });

サーバー関数から Amplify API を呼び出す

TanStack Start では、createServerFn で作成したサーバー関数の中でのみサーバーサイドの Amplify API 呼び出しが可能です。 runWithAmplifyServerContextoperation に処理を渡すと、リクエストスコープの認証コンテキストが自動的に管理されます。

import { createFileRoute } from "@tanstack/react-router";
import { createServerFn } from "@tanstack/react-start";
import { runWithAmplifyServerContext } from "~/lib/amplifyServerUtils";
import { client } from "~/lib/amplify-ssr-client";

const fetchTodos = createServerFn({ method: "GET" }).handler(async () => {
  const { data: todos, errors } = await runWithAmplifyServerContext({
    operation: (contextSpec) => client.models.Todo.list(contextSpec),
  });
  return {
    todos: todos ?? [],
    error: errors?.map((e) => e.message).join(", "),
  };
});

export const Route = createFileRoute("/")({
  loader: () => fetchTodos(),
  component: Home,
});

function Home() {
  const { todos } = Route.useLoaderData();
  return (
    <ul>
      {todos.map((todo) => (
        <li key={todo.id}>{todo.content}</li>
      ))}
    </ul>
  );
}

サンプルアプリ(Todo App)

リポジトリの examples/todo-app に認証付きの Todo アプリのサンプルが含まれています。

  • Amplify Auth(Cognito)によるサインイン・サインアウト
  • Amplify Data(AppSync)を使った Todo の CRUD
  • 未ログイン時はログインページへリダイレクトする保護ルート

実際に動かして確認したい場合は、このサンプルを参考にしてください。

まとめ

ケース必要なもの
静的サイトや単純な SSRNitro aws_amplify プリセットのみ
AppSync / S3 等を SSR で認証付き呼び出しamplify-adapter-tanstack-start が追加で必要

TanStack Start と Amplify の組み合わせに興味がある方は、ぜひ amplify-adapter-tanstack-start を試してみてください。

フィードバックをお待ちしています

実際に使ってみた感想・不具合・改善要望などは GitHub の Issue でお知らせください。 また、役に立ったと思ったら ⭐ をつけてもらえると励みになります。