DynamoDBのバッチ操作
DynamoDBのバッチ操作を使用すると、単一のミューテーションで複数のアイテムを追加できます。
ステップ1 - カスタムミューテーションを定義する
import { type ClientSchema, a, defineData } from '@aws-amplify/backend';
const schema = a.schema({ // 1. 戻り値の型をカスタム型またはモデルとして定義します Post: a.model({ id: a.id(), content: a.string(), likes: a.integer() }),
// 2. 戻り値の型と、オプションで引数を持つミューテーションを定義します BatchCreatePost: a .mutation() // このクエリが受け入れる引数 .arguments({ content: a.string().array() }) .returns(a.ref('Post').array()) // サインイン済みユーザーのみがこのAPIを呼び出すことを許可します .authorization(allow => [allow.authenticated()])});
export type Schema = ClientSchema<typeof schema>;
export const data = defineData({ schema});ステップ2 - カスタムビジネスロジックハンドラーコードを構成する
クエリまたはミューテーションを定義した後、AppSync JavaScriptリゾルバーで提供されるカスタムリゾルバーを使用してカスタムビジネスロジックを作成する必要があります。
カスタムリゾルバーは「リクエスト/レスポンス」ベースで機能します。データソースを選択し、リクエストをデータソースの入力パラメーターにマップしてから、データソースのレスポンスをクエリ/ミューテーションの戻り値の型にマップします。カスタムリゾルバーは、コールドスタートがない、管理するインフラストラクチャが少ない、Lambda関数の呼び出しに対する追加料金がないという利点があります。カスタムリゾルバーと関数の選択を確認してください。
amplify/data/resource.tsファイルで、a.handler.customを使用してカスタムハンドラーを定義します。
import { type ClientSchema, a, defineData } from '@aws-amplify/backend';
const schema = a.schema({ Post: a.model({ id: a.id(), content: a.string(), likes: a.integer() }),
BatchCreatePost: a .mutation() .arguments({ contents: a.string().array() }) .returns(a.ref('Post').array()) .authorization(allow => [allow.authenticated()]) // 1. カスタムハンドラーを追加します .handler( a.handler.custom({ dataSource: a.ref('Post'), entry: './BatchCreatePostHandler.js', }) )});
export type Schema = ClientSchema<typeof schema>;
export const data = defineData({ schema});Amplifyはリゾルバーコンテキストスタッシュにいくつかの値を格納し、カスタムリゾルバーでアクセスできます。
| 名前 | 説明 |
|---|---|
| awsAppsyncApiId | AppSync APIのID。 |
| amplifyApiEnvironmentName | Amplify APIの環境名。(サンドボックスではNONE) |
Amplifyが生成したDynamoDBテーブル名は、コンテキストスタッシュの変数から構築できます。テーブル名の形式は<model-name>-<aws-appsync-api-id>-<amplify-api-environment-name>です。たとえば、Postモデルのテーブル名はPost-123456-devになります。ここで、123456はAppSync APIのID、devはAmplify API環境名です。
import { util } from '@aws-appsync/utils';
export function request(ctx) { var now = util.time.nowISO8601();
return { operation: 'BatchPutItem', tables: { [`Post-${ctx.stash.awsAppsyncApiId}-${ctx.stash.amplifyApiEnvironmentName}`]: ctx.args.contents.map((content) => util.dynamodb.toMapValues({ content, id: util.autoId(), createdAt: now, updatedAt: now, }) ), }, };}
export function response(ctx) { if (ctx.error) { util.error(ctx.error.message, ctx.error.type); } return ctx.result.data[`Post-${ctx.stash.awsAppsyncApiId}-${ctx.stash.amplifyApiEnvironmentName}`];}ステップ3 - カスタムクエリまたはミューテーションを呼び出す
生成されたDataクライアントから、すべてのカスタムクエリとミューテーションは、それぞれclient.queries.およびclient.mutations. APIの下にあります。
const { data, errors } = await client.mutations.BatchCreatePost({ contents: ['Post 1', 'Post 2', 'Post 3']});