[アップデート] AWS Amplify Gen2 のサンドボックス環境でデータのシード機能がサポートされました

[アップデート] AWS Amplify Gen2 のサンドボックス環境でデータのシード機能がサポートされました

Clock Icon2025.04.30

いわさです。

今朝アナウンスがありましたが、AWS Amplify Gen2 でデータシードがサポートされたようです。

https://aws.amazon.com/about-aws/whats-new/2025/04/aws-amplify-introduces-data-seeding/

シードは各データストアに予め用意しておくテストデータや初期データです。
上記のアナウンスでは明言されていないのですが、今回追加されたのはサンドボックス環境に対するデータシーディングです。

これまで普通にデプロイした Amplify Gen2 環境の場合は、マネジメントコンソールからデータマネージャーなどが使えたのでまだなんとかなったのですが、サンドボックス環境に対してはコンソールのデータマネージャーが使えず、テストデータの用意が面倒でした。
今回の機能でテストデータの用意が捗りそうです。

シード機能の使い方

シード機能を使う流れですが、amplify/seed/seed.tsを用意し、npx ampx sandbox seedを実行します。
そうするとseed.tsの内容に従ってシードが作成されます。

シードスクリプト(seed.ts)

今回のアップデートにあわせて@aws-amplify/seedというものが新たに追加されています。

https://github.com/aws-amplify/amplify-backend/releases/tag/%40aws-amplify%2Fseed%401.0.1

プロジェクトに@aws-amplify/seedを追加し、そのモジュールを使ってシードスクリプトを作成します。
主にユーザー作成・サインインの自動化を行うための機能が提供されています。ユーザーの作成/サインインをさせ、そのままそのユーザーコンテキスト(JWT)を使って後続のデータ作成 API などを実行する流れになります。

https://www.npmjs.com/package/@aws-amplify/seed

% npm i @aws-amplify/seed

ユーザーを作成するだけのシードスクリプトが以下となります。

hogehoge/amplify/seed/seed.ts
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)のみがサポートされており、カスタム属性は設定できないようです。

https://github.com/aws-amplify/amplify-backend/blob/ea23113402023cfd8772e1953fdcef2e864b02ec/packages/seed/src/types.ts

これは近い内にサポートしてほしいですね。
私結構カスタム属性に依存した実装しがちなので、今回だと後続のデータ作成時の認可処理を通すことが出来ませんでした。

シード作成を実行

シードスクリプトが用意できたらnpx ampx sandboxでシードを作成します。
ちなみに従来どおりのnpx ampx sandboxをしてもシードは作成されません。

480E8FB3-1DF8-49CE-9C0B-F65842B2556A.png

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を最新版にアップデートしましょう。

package.json
{
  "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 ユーザープールを確認してみると、新規ユーザーが作成されていますね。
しかも確認ステータスが「確認済み」になっているのでそのままサインインができる状態です。

A27CADE9-9D9B-4014-AFE8-BAE8266E26A1.png

データも作成してみる

よくあるシナリオとしてありがちなのが初期ユーザーに加えて、初期データ・テストデータの投入です。
シードスクリプトでcreateAndSignUpUserを行うと、ユーザーを作成します。
さらにsignInAfterCreationtrueに設定することで、シード処理の中でそのユーザーでサインインまで行うことが出来ます。

で、サインインした後にそのユーザーがデータを作成する流れをテストしてみましょう。

hogehoge/amplify/seed/seed.ts
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 テーブルを確認してみると、次のようにデータが新規作成されていました。

B0B11F4F-56F3-4859-92F6-ADDF01885D29.png

さいごに

本日は AWS Amplify Gen2 でサンドボックス環境でデータのシード機能がサポートされたので使ってみました。

単純なデータ作成スクリプトではなくて、Amplify Gen2 用の実装が必要だったり、ユーザーコンテキストを意識する必要がありますが、サンドボックスで不便だった点がひとつ解消されたのではないでしょうか。

カスタム属性だけ使えるようになったら私のユースケースは満たされそうです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.