[アップデート] AWS Amplify Gen2 のサンドボックス環境でデータのシード機能がサポートされました
いわさです。
今朝アナウンスがありましたが、AWS Amplify Gen2 でデータシードがサポートされたようです。
シードは各データストアに予め用意しておくテストデータや初期データです。
上記のアナウンスでは明言されていないのですが、今回追加されたのはサンドボックス環境に対するデータシーディングです。
これまで普通にデプロイした Amplify Gen2 環境の場合は、マネジメントコンソールからデータマネージャーなどが使えたのでまだなんとかなったのですが、サンドボックス環境に対してはコンソールのデータマネージャーが使えず、テストデータの用意が面倒でした。
今回の機能でテストデータの用意が捗りそうです。
シード機能の使い方
シード機能を使う流れですが、amplify/seed/seed.ts
を用意し、npx ampx sandbox seed
を実行します。
そうするとseed.ts
の内容に従ってシードが作成されます。
シードスクリプト(seed.ts)
今回のアップデートにあわせて@aws-amplify/seed
というものが新たに追加されています。
プロジェクトに@aws-amplify/seed
を追加し、そのモジュールを使ってシードスクリプトを作成します。
主にユーザー作成・サインインの自動化を行うための機能が提供されています。ユーザーの作成/サインインをさせ、そのままそのユーザーコンテキスト(JWT)を使って後続のデータ作成 API などを実行する流れになります。
% npm i @aws-amplify/seed
ユーザーを作成するだけのシードスクリプトが以下となります。
import { readFile } from "node:fs/promises";
import {
createAndSignUpUser,
} from "@aws-amplify/seed";
import { Amplify } from "aws-amplify";
const url = new URL("../../amplify_outputs.json", import.meta.url);
const outputs = JSON.parse(await readFile(url, { encoding: "utf8" }));
Amplify.configure(outputs);
await createAndSignUpUser({
username: "testuser1",
password: "Hoge@11111",
signInAfterCreation: false,
signInFlow: "Password",
userAttributes: {
email: "hoge@example.com",
},
});
上記処理でユーザー名、パスワード、E メールを設定したユーザーを作成することが出来ます。
パスワードのリセットなどは不要です。
属性も指定できるのですが、残念ながら本日時点では標準属性(StandardUserAttributes)のみがサポートされており、カスタム属性は設定できないようです。
これは近い内にサポートしてほしいですね。
私結構カスタム属性に依存した実装しがちなので、今回だと後続のデータ作成時の認可処理を通すことが出来ませんでした。
シード作成を実行
シードスクリプトが用意できたらnpx ampx sandbox
でシードを作成します。
ちなみに従来どおりのnpx ampx sandbox
をしてもシードは作成されません。
npx ampx sandbox seed
コマンドですが、従来の環境だと次のようにおそらく実行できないと思います。(私はそうだった)
% npx ampx sandbox seed --profile hoge
ampx sandbox
Starts sandbox, watch mode for Amplify backend deployments
Commands:
ampx sandbox delete Deletes sandbox environment
ampx sandbox secret <command> Manage sandbox secrets
:
Error: Did you mean secret?
@aws-amplify/backend-cli
を最新版にアップデートしましょう。
{
"name": "hogehoge",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "hogehoge",
"version": "0.1.0",
"dependencies": {
"@aws-amplify/seed": "^1.0.1",
"@aws-amplify/ui-react": "^6.9.3",
"@cloudscape-design/components": "^3.0.919",
"@cloudscape-design/global-styles": "^1.0.38",
"@heroicons/react": "^2.2.0",
"aws-amplify": "^6.13.4",
"axios": "^1.8.2",
"clsx": "^2.1.1",
"graphql": "^15.10.1",
"graphql-request": "^7.1.2",
"next": "~14.2.26",
"react": "^18",
"react-dom": "^18"
},
"devDependencies": {
"@aws-amplify/backend": "^1.14.2",
"@aws-amplify/backend-cli": "^1.7.0",
"@aws-lambda-powertools/logger": "^2.16.0",
"@types/aws-lambda": "^8.10.147",
:
}
再度実行すると今度は成功しました。
% npx ampx sandbox seed --profile hoge
seed is running...
✔ seed has successfully completed
Cognito ユーザープールを確認してみると、新規ユーザーが作成されていますね。
しかも確認ステータスが「確認済み」になっているのでそのままサインインができる状態です。
データも作成してみる
よくあるシナリオとしてありがちなのが初期ユーザーに加えて、初期データ・テストデータの投入です。
シードスクリプトでcreateAndSignUpUser
を行うと、ユーザーを作成します。
さらにsignInAfterCreation
をtrue
に設定することで、シード処理の中でそのユーザーでサインインまで行うことが出来ます。
で、サインインした後にそのユーザーがデータを作成する流れをテストしてみましょう。
import { readFile } from "node:fs/promises";
import {
createAndSignUpUser,
} from "@aws-amplify/seed";
import { Amplify } from "aws-amplify";
import type { Schema } from "../data/resource";
import { generateClient } from "aws-amplify/api";
const url = new URL("../../amplify_outputs.json", import.meta.url);
const outputs = JSON.parse(await readFile(url, { encoding: "utf8" }));
Amplify.configure(outputs);
await createAndSignUpUser({
username: "testuser1",
password: "Hoge@11111",
signInAfterCreation: true,
signInFlow: "Password",
userAttributes: {
email: "hoge@example.com",
},
});
const dataClient = generateClient<Schema>();
const response = await dataClient.models.TeamSettings.create({
team_id: "testteam1",
team_name: "テストチーム1",
aws_account_id: "123456789012",
});
console.log("response", response);
実行してみると、作成が出来たようです。
% npx ampx sandbox seed --profile hoge --debug
seed is running...
response {
data: {
team_id: 'team1',
team_name: 'testteam',
aws_account_id: '123456789012',
createdAt: '2025-04-29T20:51:05.243Z',
updatedAt: '2025-04-29T20:51:05.243Z'
},
extensions: undefined
}
✔ seed has successfully completed
サンドボックスの AppSync からデータソースをたどり、対象の DynamoDB テーブルを確認してみると、次のようにデータが新規作成されていました。
さいごに
本日は AWS Amplify Gen2 でサンドボックス環境でデータのシード機能がサポートされたので使ってみました。
単純なデータ作成スクリプトではなくて、Amplify Gen2 用の実装が必要だったり、ユーザーコンテキストを意識する必要がありますが、サンドボックスで不便だった点がひとつ解消されたのではないでしょうか。
カスタム属性だけ使えるようになったら私のユースケースは満たされそうです。