- AWS
Amplify Gen 2入門|バックエンドをTypeScriptで定義する手順
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期連続の黒字決算。