Amplify Gen 2 は、認証・API・データベース・ファイル置き場・関数といったバックエンドを、amplify/ フォルダの TypeScript で定義し、AWS CDK でデプロイする仕組みです。 npm create amplify@latest で雛形を作り、npx ampx sandbox で開発者ごとの環境を AWS に作って試し、Git に push すると Amplify Hosting がブランチごとに本番・検証環境を作ります。Gen 1 のように CLI の質問に答えてリソースを足すのではなく、コードがそのまま設計図になります。

npm create amplify@latest        # amplify/ と依存パッケージを追加
npx ampx sandbox                 # 自分用のバックエンドを AWS に作り、変更を監視
npx ampx sandbox delete          # 使い終わったら消す
ファイル 役割
amplify/backend.ts defineBackend({ auth, data, ... }) で全体をまとめる。CDK で細かく変える場所
amplify/auth/resource.ts defineAuth:Cognito のユーザープール・ID プール
amplify/data/resource.ts defineData:AppSync(GraphQL)と DynamoDB のテーブル
amplify/storage/resource.ts defineStorage:S3 バケットとアクセスの決まり
amplify/functions/*/resource.ts defineFunction:Lambda 関数
amplify_outputs.json デプロイ後に作られる、フロントエンド用の接続情報

確認環境:Node.js 22.22.2・npm 10.9.7(Linux)。npm create amplify@latest(create-amplify 1.4.1)で雛形を作り、入った版は @aws-amplify/backend 1.25.1・@aws-amplify/backend-cli 1.10.0・aws-cdk-lib 2.268.0・aws-amplify 6.22.1・TypeScript 5.9.3 でした。auth・data・storage・function を書き足し、tsc の型チェックと、sandbox と同じ方法(@aws-cdk/toolkit-lib 1.32.0 で backend.ts を読み込む)での CDK の合成を、AWS に接続せずに行っています。sandbox・デプロイ・Amplify Hosting の動きは Amplify のドキュメントに基づいています(確認日 2026年10月13日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Amplify Gen 2入門|バックエンドをTypeScriptで定義する手順」

Gen 1 との違い

項目 Gen 1 Gen 2
バックエンドの作り方 amplify add auth などの CLI で質問に答える TypeScript のコード(defineAuth など)
中の仕組み CloudFormation のテンプレートを CLI が作る AWS CDK の上に作られている
開発用の環境 amplify env で共有の環境を切り替える 開発者ごとの sandbox(npx ampx sandbox)
反映 amplify push sandbox は保存のたびに反映。本番は Git の push
環境の単位 amplify env Git のブランチごとのフルスタック環境
細かい変更 amplify override backend.ts で CDK を直接書く
データの型 GraphQL スキーマ(schema.graphql)から生成 TypeScript のスキーマ(a.schema)がそのまま型になる
フロントの設定ファイル aws-exports.js・amplifyconfiguration.json amplify_outputs.json
関数の言語 Node.js・Python・Java・Go など TypeScript を直接書ける(defineFunction)

ドキュメントの機能比較表には、Gen 1 にあって Gen 2 に無いもの(Data の manyToMany・searchable・DataStore、Amplify Console の手動デプロイ、CloudFront と S3 のホスティング)と、Gen 2 で増えたもの(OIDC の対応、MySQL・PostgreSQL への接続、TypeScript の関数)が並んでいます。Gen 1 のドキュメントには「Legacy」の表示が付いています。

準備

必要なもの 内容
Node.js @aws-amplify/backend-cli 1.10.0 の engines は ^18.19.0 || ^20.6.0 || >=22
AWS のプロファイル IAM Identity Center のユーザーで aws configure sso。ドキュメントでは、既存のユーザーなら AmplifyBackendDeployFullAccess を付ける
CDK のブートストラップ 初めて sandbox を動かすアカウント・リージョンで一度だけ(sandbox が案内する)
フロントエンド React・Next.js・Vue・Angular などのプロジェクト(無くても amplify/ は作れる)

SSO のプロファイルの書き方は、関連記事「aws sso login設定|Identity Centerプロファイルの書き方」で扱っています。

npm create amplify で作られるもの

空のフォルダで動かした出力です(2 分 44 秒、うち依存の取得が大半)。

$ npm init -y && npm create amplify@latest -- --yes
Installing devDependencies:
 - @aws-amplify/backend
 - @aws-amplify/backend-cli
 - aws-cdk-lib@2.268.0
 - constructs@^10.0.0
 - typescript@^5.0.0
 - tsx
 - esbuild

Installing dependencies:
 - aws-amplify

✔ DevDependencies installed
✔ Dependencies installed
✔ Template files created
Successfully created a new project!

Welcome to AWS Amplify!
 - Get started by running npx ampx sandbox.
 - Run npx ampx help for a list of available commands.
.
├── .gitignore
├── amplify
│   ├── auth
│   │   └── resource.ts
│   ├── backend.ts
│   ├── data
│   │   └── resource.ts
│   ├── package.json        ← {"type": "module"}
│   └── tsconfig.json
├── package-lock.json
└── package.json

node_modules は 1.2 GB・518 パッケージになりました(aws-cdk-lib などを含むため)。.gitignore には次の行が足されました。

# amplify
node_modules
.amplify
amplify_outputs*
amplifyconfiguration*

生成された中身

// amplify/backend.ts
import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { data } from './data/resource';

/**
 * @see https://docs.amplify.aws/react/build-a-backend/ to add storage, functions, and more
 */
defineBackend({
  auth,
  data,
});
// amplify/auth/resource.ts
import { defineAuth } from '@aws-amplify/backend';

export const auth = defineAuth({
  loginWith: {
    email: true,
  },
});
// amplify/data/resource.ts(コメントを除く)
import { type ClientSchema, a, defineData } from '@aws-amplify/backend';

const schema = a.schema({
  Todo: a
    .model({
      content: a.string(),
    })
    .authorization((allow) => [allow.guest()]),
});

export type Schema = ClientSchema<typeof schema>;

export const data = defineData({
  schema,
  authorizationModes: {
    defaultAuthorizationMode: 'identityPool',
  },
});

雛形の Todo は allow.guest()(ログインしていない人も読み書きできる)です。 そのまま公開すると誰でもデータを変えられるので、次の節のように allow.owner() などに変えます。amplify/tsconfig.json には、関数の環境変数の型を読む "$amplify/*": ["../.amplify/generated/*"] の paths が入っています。

amplify/ の書き方:auth・data・storage・functions

雛形に、ファイル置き場(storage)と関数(functions)を足し、データを「作った本人だけ」に変えた例です。このあと tsc の型チェックと CDK の合成が通りました。

auth(Cognito)

// amplify/auth/resource.ts
import { defineAuth } from '@aws-amplify/backend';

export const auth = defineAuth({
  loginWith: {
    email: true,          // メールアドレスでサインアップ・サインイン
  },
});

合成したテンプレートでは、ユーザープールが UsernameAttributes: ["email"]・AutoVerifiedAttributes: ["email"] になりました。外部 ID プロバイダー(Google など)や MFA も defineAuth に書きます。Cognito そのものの仕組みは、関連記事「Amazon Cognito入門|ユーザープール作成とJWT検証コード」で扱っています。

data(AppSync+DynamoDB)

// amplify/data/resource.ts
import { type ClientSchema, a, defineData } from '@aws-amplify/backend';
import { sayHello } from '../functions/say-hello/resource';

const schema = a.schema({
  Todo: a
    .model({
      content: a.string().required(),
      isDone: a.boolean().default(false),
    })
    .authorization((allow) => [allow.owner()]),   // 作った本人だけが読み書き

  sayHello: a
    .query()
    .arguments({ name: a.string() })
    .returns(a.string())
    .handler(a.handler.function(sayHello))
    .authorization((allow) => [allow.authenticated()]),
});

export type Schema = ClientSchema<typeof schema>;

export const data = defineData({
  schema,
  authorizationModes: {
    defaultAuthorizationMode: 'userPool',
  },
});
書き方 意味
a.model({...}) DynamoDB のテーブルと、作成・取得・一覧・更新・削除の API
allow.owner() 作った本人だけ
allow.authenticated() ログインした人全員
allow.guest() ログインしていない人(ID プール)
allow.publicApiKey() API キーを持つ人
a.query().handler(a.handler.function(...)) 独自のクエリを Lambda で処理

合成のとき、allow.owner() について次の警告が出ました。所有者のフィールドを本人が書き換えられる、という注意です。

WARNING: owners may reassign ownership for the following model(s) and role(s): Todo: [owner]. If this is not intentional, you may want to apply field-level authorization rules to these fields.

GraphQL と REST の違いは、関連記事「GraphQLとRESTの違い|同じ画面を両方で作ってリクエスト数を実測」で扱っています。

storage(S3)

// amplify/storage/resource.ts
import { defineStorage } from '@aws-amplify/backend';

export const storage = defineStorage({
  name: 'appFiles',
  access: (allow) => ({
    'public/*': [
      allow.guest.to(['read']),
      allow.authenticated.to(['read', 'write', 'delete']),
    ],
    'private/{entity_id}/*': [
      allow.entity('identity').to(['read', 'write', 'delete']),   // 本人の ID のフォルダだけ
    ],
  }),
});

合成したバケットには、CORS(GET・HEAD・PUT・POST・DELETE、全オリジン)と、amplify:deployment-type=sandbox のタグが付きました。sandbox では、消すときに中身も消す設定(aws-cdk:auto-delete-objects)が入ります。

functions(Lambda)

// amplify/functions/say-hello/resource.ts
import { defineFunction, secret } from '@aws-amplify/backend';

export const sayHello = defineFunction({
  name: 'say-hello',
  entry: './handler.ts',
  timeoutSeconds: 10,
  memoryMB: 256,
  environment: {
    GREETING: 'こんにちは',
    API_KEY: secret('EXTERNAL_API_KEY'),   // npx ampx sandbox secret set EXTERNAL_API_KEY
  },
});
// amplify/functions/say-hello/handler.ts
import type { Schema } from '../../data/resource';
import { env } from '$amplify/env/say-hello';

export const handler: Schema['sayHello']['functionHandler'] = async (event) => {
  const { name } = event.arguments;
  return `${env.GREETING}、${name ?? 'ゲスト'}さん`;
};

合成された Lambda の設定です。

{
  "Runtime": "nodejs22.x",
  "Handler": "index.handler",
  "MemorySize": 256,
  "Timeout": 10,
  "Architectures": ["x86_64"],
  "Env": {
    "Variables": {
      "GREETING": "こんにちは",
      "API_KEY": "<value will be resolved during runtime>",
      "AMPLIFY_SSM_ENV_CONFIG": "{\"API_KEY\":{\"path\":\"/amplify/myapp/local-sandbox-e524912d17/EXTERNAL_API_KEY\",\"sharedPath\":\"/amplify/shared/my-app/EXTERNAL_API_KEY\"}}"
    }
  }
}

secret() の値はテンプレートに入らず、実行時に SSM パラメータストアから読まれます。 esbuild で1つにまとめられた関数のコード(index.mjs)は 3,084 バイトで、先頭に SSM から値を読む処理が足されていました。ハンドラーを手元で tsx から呼ぶと、こんにちは、田中さん・こんにちは、ゲストさん が返りました。

$amplify/env/say-hello は、sandbox(または合成)のときに .amplify/generated/env/say-hello.ts として作られます。合成する前に tsc をかけると、Cannot find module '$amplify/env/say-hello' のエラーになりました。 また、フロントエンドの無い空のプロジェクトでは、生成されたファイルが process を使うため Cannot find name 'process' になり、npm i -D @types/node で通りました。

backend.ts(まとめと CDK での変更)

// amplify/backend.ts
import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { data } from './data/resource';
import { storage } from './storage/resource';
import { sayHello } from './functions/say-hello/resource';

const backend = defineBackend({
  auth,
  data,
  storage,
  sayHello,
});

// CDK で細かく変える例:Cognito のパスワードの決まりを変える
const { cfnUserPool } = backend.auth.resources.cfnResources;
cfnUserPool.policies = {
  passwordPolicy: { minimumLength: 12, requireLowercase: true, requireNumbers: true,
                    requireSymbols: false, requireUppercase: true },
};

合成したテンプレートのユーザープールは "PasswordPolicy":{"MinimumLength":12,...} になりました。define* に無い設定は、backend.<名前>.resources から CDK のリソースを取り出して変えます。 CDK の基本は、関連記事「AWS CDK入門|TypeScriptでS3とLambdaを作りsynthまで」で扱っています。

何が作られるか:CloudFormation の内訳

上の amplify/ を、sandbox と同じ方法で合成しました。親スタック1つと入れ子のスタック7つ、リソースは合計 108 個です。

スタック リソース数 主なもの
親 5 入れ子スタック 4
auth 7 Cognito ユーザープール・クライアント・ID プール、IAM ロール 2
data 26 AppSync の API・スキーマ、S3 バケット 2、Lambda 2、SSM パラメータ 4
data のテーブル管理 9 テーブルを作る Lambda 2、Step Functions 1
data の Todo 41 DynamoDB テーブル、AppSync のリゾルバー 9・関数 28
data の関数呼び出し 7 sayHello のデータソースとリゾルバー
function 4 Lambda 1、IAM ロール・ポリシー
storage 9 S3 バケット、中身を消す Lambda、SSM パラメータ
多いリソース 数
AWS::AppSync::FunctionConfiguration 30
AWS::IAM::Role 11
AWS::AppSync::Resolver 10
AWS::IAM::Policy 7
AWS::Lambda::Function 6

モデル1つで AppSync の関数・リゾルバーが 37 個作られています。親スタックの名前は amplify-myapp-local-sandbox-e524912d17 で、出力には userPoolId・awsAppsyncApiEndpoint・bucketName など、amplify_outputs.json の元になる値が並びました。合成の作業ファイル(.amplify/)は 22 MB でした。

合成に使ったスクリプトです(確認用。ふだんは sandbox が同じことをします)。

// synth.mjs:AWS に接続せずに CloudFormation テンプレートを作る
import { Toolkit, MemoryContext, StackSelectionStrategy } from '@aws-cdk/toolkit-lib';
import { tsImport } from 'tsx/esm/api';
import { CloudAssembly } from 'aws-cdk-lib/cx-api';
import { pathToFileURL } from 'url';
import path from 'path';

const out = path.resolve('.amplify/artifacts/cdk.out');
const toolkit = new Toolkit();
const cx = await toolkit.fromAssemblyBuilder(async () => {
  await tsImport(pathToFileURL(path.resolve('amplify/backend.ts')).toString(), import.meta.url);
  process.emit('message', 'amplifySynth', undefined);
  return new CloudAssembly(out);
}, {
  contextStore: new MemoryContext({
    'amplify-backend-namespace': 'my-app',
    'amplify-backend-name': 'local',
    'amplify-backend-type': 'sandbox',
  }),
  outdir: out,
});
const asm = await toolkit.synth(cx, { stacks: { strategy: StackSelectionStrategy.ALL_STACKS } });
await asm.dispose();
✨  Synthesis time: 7.12s
Successfully synthesized to /…/my-app/.amplify/artifacts/cdk.out

CloudFormation のスタックの扱いは、関連記事「CloudFormationをAWS CLIで操作|deployと変更セット」で扱っています。

sandbox:開発者ごとの環境

npx ampx sandbox                         # 初回はデプロイ、その後は amplify/ の変更を監視
npx ampx sandbox --once                  # 1回だけデプロイして終わる
npx ampx sandbox --identifier feature-x  # 同じ人が別の sandbox を持つ
npx ampx sandbox --profile dev-sso       # AWS のプロファイル
npx ampx sandbox --outputs-out-dir src   # amplify_outputs.json の置き場所
npx ampx sandbox secret set EXTERNAL_API_KEY
npx ampx sandbox delete                  # 消す(-y で確認なし)
項目(ドキュメント・--help) 内容
作られるもの amplify-<アプリ名>-<ユーザー名>-sandbox-<ハッシュ> の CloudFormation スタック
反映 amplify/ の保存のたびに更新。Lambda や AppSync のリゾルバーは CDK のホットスワップで速く変わる
注意 DynamoDB の GSI の変更などは、テーブルを作り直す
Ctrl+C sandbox のプロセスを止める。リソースを消すのは sandbox delete
--identifier 既定は OS のユーザー名。同じ人が複数の sandbox を持つときに使う
--express CloudFormation・CDK の Express モードで速くデプロイ(1.10.0 の --help に記載)
--outputs-format mjs・json・json-mobile・ts・dart
消し忘れ ドキュメントでは、使っていない sandbox を時々消して費用を抑えるよう書かれている

フロントエンドからは、sandbox が書き出した amplify_outputs.json を読み込みます。

import { Amplify } from 'aws-amplify';
import { generateClient } from 'aws-amplify/data';
import outputs from '../amplify_outputs.json';
import type { Schema } from '../amplify/data/resource';

Amplify.configure(outputs);
const client = generateClient<Schema>();

const { data: todos, errors } = await client.models.Todo.list();
const { data: hello } = await client.queries.sayHello({ name: '田中' });

Schema の型がそのまま使えるので、client.models.Todo の引数や戻り値に補完が効きます。Next.js での使い方は、関連記事「Next.js App Router 入門|v16対応・実際のビルド結果つき」で扱っています。

デプロイ

方法 コマンド・操作 向いている使い方
Amplify Hosting(Git 連携) コンソールでリポジトリをつなぐ。push でバックエンドとフロントをデプロイ 標準の方法。ブランチごとの環境
自前の CI/CD npx ampx pipeline-deploy --branch <ブランチ> --app-id <アプリ ID> GitHub Actions・CodeCatalyst などから。手元で使うものではない
Amplify Hosting を使わない npx ampx deploy(--backend・--frontend・-y) 1.10.0 で加わったコマンド。--identifier がスタック名になる
別の環境の設定を取る npx ampx generate outputs --app-id <ID> --branch <ブランチ> 本番・検証の amplify_outputs.json を作る

Git のブランチごとに、バックエンドも別に作られます(フルスタックのブランチデプロイ)。ドキュメントでは、dev・staging・feature/* のようなパターンでブランチを自動でつなぐ設定と、ブランチを消すと Amplify 側も消える設定が説明されています。本番への反映は、main へのプルリクエストをマージする、いつもの Git の流れです。

自前のパイプラインで動かすときは、ドキュメントの例のように、Amplify の自動ビルドを止め、パイプラインから pipeline-deploy を呼び、フロントのビルドでは npx ampx generate outputs --branch $AWS_BRANCH --app-id $AWS_APP_ID で設定を取ります。

費用の考え方

Amplify Gen 2 の仕組み自体に料金は無く、作られた AWS のリソース(Cognito・AppSync・DynamoDB・S3・Lambda など)の料金と、Amplify Hosting を使うならそのビルド・配信の料金がかかります。sandbox も本物のリソースなので、開発者の人数分の環境があり、使わなくなったら sandbox delete で消します。AWS の料金の確かめ方は、関連記事「AWSの料金を確認する方法|Cost Explorer・CLI・予算アラート」で扱っています。

よくある質問

Q. 既存のフロントエンドに後から足せますか。 A. はい。プロジェクトのルートで npm create amplify@latest を動かすと、amplify/ と依存パッケージが足されます。手元では npm init -y だけの空のフォルダで動かしました。

Q. Gen 1 のプロジェクトはどうしますか。 A. ドキュメントに移行ガイドと機能比較表があります。比較表の 🟢 は移行ツールでコードを作れる機能、🔴 は対応していない機能です。manyToMany や DataStore など、Gen 2 に無い機能を使っているかを先に確かめます。

Q. CDK を知らないと使えませんか。 A. define* の範囲なら CDK を書かずに済みます。足りない設定や、Amplify に無いリソース(SQS・EventBridge など)は backend.ts で CDK を書きます。

Q. amplify_outputs.json は Git に入れますか。 A. 雛形の .gitignore では除外されています。sandbox や generate outputs で環境ごとに作ります。

まとめ

  • npm create amplify@latest で amplify/backend.ts・auth・data と依存(手元で 1.2 GB)が入る
  • バックエンドは defineAuth・defineData・defineStorage・defineFunction を defineBackend にまとめる
  • 雛形のデータは allow.guest()。公開前に allow.owner() などへ
  • 足りない設定は backend.ts で CDK のリソースを直接変える
  • 開発は npx ampx sandbox(開発者ごと)、片付けは sandbox delete
  • 本番は Git のブランチごとのデプロイ、自前の CI なら ampx pipeline-deploy
  • 手元の合成では、auth・data(モデル1つ+関数クエリ)・storage・function で 108 リソース

参考・出典

確認日はいずれも 2026年10月13日です。

  • AWS Amplify Docs「Quickstart」:https://docs.amplify.aws/javascript/start/quickstart/
  • AWS Amplify Docs「Configure AWS for local development」:https://docs.amplify.aws/react/start/account-setup/
  • AWS Amplify Docs「How Amplify works – Concepts」:https://docs.amplify.aws/react/how-amplify-works/concepts/
  • AWS Amplify Docs「Use cloud sandbox in dev environment」:https://docs.amplify.aws/react/deploy-and-host/sandbox-environments/setup/
  • AWS Amplify Docs「Fullstack branch deployments」:https://docs.amplify.aws/react/deploy-and-host/fullstack-branching/branch-deployments/
  • AWS Amplify Docs「Custom pipelines」:https://docs.amplify.aws/react/deploy-and-host/fullstack-branching/custom-pipelines/
  • AWS Amplify Docs「CLI commands」:https://docs.amplify.aws/react/reference/cli-commands/
  • AWS Amplify Docs「Connect your app code to API」:https://docs.amplify.aws/react/build-a-backend/data/connect-to-API/
  • AWS Amplify Docs「Feature parity(Gen 1 と Gen 2 の機能比較)」:https://docs.amplify.aws/react/start/migrate-to-gen2/feature-matrix/
  • npm「create-amplify」:https://www.npmjs.com/package/create-amplify
  • Zenn(NCDC)Amplify Gen 2 で Lambda と API Gateway を作った記事:https://zenn.dev/ncdc/articles/f1150516fc83c7
  • クラスメソッド「Amplify Gen2でNextJSのアプリケーション作成まで」:https://dev.classmethod.jp/articles/amplify-gen2-nextjs

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Amplify Gen 2入門|バックエンドをTypeScriptで定義する手順」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?