エラーカタログ
このカタログでは、MBC CQRS Serverlessで発生するエラーの原因、解決策、復旧戦略を含む包括的なドキュメントを提供します。
クイックリファレンス
このテーブルを使用してエラーを素早く特定し、解決策にジャンプできます。
コマンド&データエラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-CMD-001 | バージョン不一致 | 高 | 最新バージョンを取得するかversion: -1を使用 |
| MBC-CMD-002 | アイテムが見つからない | 中 | 更新前にアイテムが存在するか確認 |
| MBC-CMD-003 | 無効な入力バージョン | 中 | getItem()から最新バージョンを使用 |
テナントエラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-TNT-001 | テナントが見つからない | 高 | listTenants()でテナントの存在を確認 |
| MBC-TNT-002 | テナントが既に存在 | 低 | 作成前に存在確認 |
シーケンス&タスクエラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-SEQ-001 | シーケンスが見つからない | 中 | シーケンスは初回使用時に自動初期化 |
| MBC-TSK-001 | タスクが見つからない | 中 | NotFoundExceptionでタスクの存在を確認 |
バリデーションエラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-VAL-001 | バリデーション失敗 | 中 | DTOの制約と入力データを確認 |
DynamoDBエラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-DDB-001 | ProvisionedThroughputExceededException | 高 | 指数バックオフリトライを実装 |
| MBC-DDB-002 | ConditionalCheckFailedException | 高 | アイテムを更新し新バージョンでリトライ |
| MBC-DDB-003 | ResourceNotFoundException | 重大 | テーブルの存在と環境変数を確認 |
| MBC-DDB-004 | ValidationException | 中 | 空文字列を避け、予約語をエスケープ |
認証エラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-COG-001 | NotAuthorizedException | 高 | トークンを更新または再認証 |
| MBC-COG-002 | UserNotFoundException | 中 | プールにユーザーが存在するか確認 |
| MBC-COG-003 | UserNotConfirmedException | 中 | 確認コードを再送信 |
インポートモジュールエラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-IMP-001 | Step Functionsタイムアウト | 重大 | 適切な失敗処理のためv1.0.18以降にアップグレード |
| MBC-IMP-002 | インポート戦略が見つからない | 高 | モジュール設定にImportStrategyを登録 |
| MBC-IMP-003 | インポートがPROCESSINGでスタック | 高 | DynamoDBストリームとSNSトピックを確認 |
Step Functionsエラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-SFN-001 | TaskTimedOut | 高 | Lambdaタイムアウトを増やすかチャンク処理 |
| MBC-SFN-002 | TaskFailed | 高 | sendTaskFailureで適切なエラーハンドリングを追加 |
AWSサービスエラー
| コード | エラーメッセージ | 重大度 | クイックフィックス |
|---|---|---|---|
| MBC-S3-001 | NoSuchKey | 中 | headObjectでオブジェクトの存在を確認 |
| MBC-S3-002 | AccessDenied | 高 | 必要なIAM権限を追加 |
| MBC-SQS-001 | MessageNotInflight | 中 | 可視性タイムアウ ト内に処理 |
コマンドサービスエラー
BadRequestException: "The input is not a valid, item not found or version not match"
場所: packages/core/src/commands/command.service.ts
原因: 楽観的ロックの失敗。リクエストのバージョン番号がデータベースの現在のバージョンと一致しません。
解決策:
// Option 1: Fetch latest version before update
const latest = await dataService.getItem({ pk, sk });
await commandService.publishPartialUpdateSync({
pk,
sk,
version: latest.version,
name: 'Updated Name',
}, options);
// Option 2: Use version: -1 for auto-fetch (async mode only)
await commandService.publishPartialUpdateAsync({
pk,
sk,
version: -1,
name: 'Updated Name',
}, options);
// Option 3: Implement retry logic
async function updateWithRetry(data, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const latest = await dataService.getItem({ pk: data.pk, sk: data.sk });
return await commandService.publishPartialUpdateSync({
...data,
version: latest.version,
}, options);
} catch (error) {
if (error.message.includes('version not match') && i < maxRetries - 1) {
await new Promise(r => setTimeout(r, 100 * (i + 1)));
continue;
}
throw error;
}
}
}
BadRequestException: "The input key is not a valid, item not found"
場所: packages/core/src/commands/command.service.ts
原因: データベ ースに存在しないアイテムを更新しようとしています。
解決策:
// Check if item exists first
const existing = await dataService.getItem({ pk, sk });
if (!existing) {
// Create new item
await commandService.publishAsync(newItem, options);
} else {
// Update existing item
await commandService.publishPartialUpdateAsync({
pk,
sk,
version: existing.version,
...updates,
}, options);
}
BadRequestException: "Invalid input version"
場所: packages/core/src/commands/command.service.ts
原因: publishSyncで最新の保存バージョンと一致しないバージョンを使用しています。
解決策: 最新のアイテムを取得してそのバージョンを使用するか、非同期メソッドでversion: -1を使用してください。
テナントエラー
BadRequestException: "Tenant not found"
場所: packages/tenant/src/services/tenant.service.ts
原因: 指定されたテナントが存在しないか削除されています。
解決策:
// Verify tenant exists
try {
const tenant = await tenantService.getTenant(tenantCode);
} catch (error) {
if (error.message === 'Tenant not found') {
// List available tenants
const tenants = await tenantService.listTenants();
console.log('Available tenants:', tenants.items.map(t => t.code));
}
}
BadRequestException: "Tenant already exist"
場所: packages/tenant/src/services/tenant.service.ts
原因: 既に存在するコードでテナントを作成しようとしています。
解決策:
// Check if tenant exists before creating
const existing = await tenantService.getTenant(tenantCode).catch(() => null);
if (existing) {
console.log('Tenant already exists, using existing tenant');
} else {
await tenantService.createTenant({ code: tenantCode, name: tenantName });
}
シ ーケンスエラー
BadRequestException: "Sequence not found"
場所: packages/sequence/src/services/sequence.service.ts
原因: リクエストされたシーケンスキーが存在しません。
解決策:
// Generate sequence - auto-initializes on first use
try {
const result = await sequencesService.generateSequenceItem(
{
tenantCode,
typeCode: 'ORDER',
},
{ invokeContext },
);
} catch (error) {
// If error persists, check DynamoDB table permissions
}
タスクエラー
NotFoundException: "Task not found"
場所: packages/task/src/task.controller.ts
原因: 指定されたタスクが存在しないか、完了/削除されています。
解決策:
// Verify task status before operations
const task = await taskService.getTask({ pk, sk });
if (!task) {
throw new NotFoundException('Task not found');
}
if (task.status === 'completed') {
throw new BadRequestException('Task already completed');
}
バリデーションエラー
BadRequestException: "Validation failed"
場所: packages/core/src/pipe/class.validation.pipe.ts
原因: リクエストDTOがclass-validatorのバリデーションに失敗しました。
一般的なバリデーションエラー:
// Example DTO with validation
export class CreateOrderDto {
@IsNotEmpty({ message: 'Name is required' })
@IsString()
@MaxLength(100)
name: string;
@IsNotEmpty({ message: 'Code is required' })
@Matches(/^[A-Z0-9-]+$/, { message: 'Code must be uppercase alphanumeric' })
code: string;
@IsOptional()
@IsNumber()
@Min(0)
amount?: number;
}
// Common validation errors and fixes:
// - "name must be a string" -> Ensure name is string type
// - "code should not be empty" -> Provide code value
// - "amount must not be less than 0" -> Use positive number
解決策:
// Validate before sending
import { validate } from 'class-validator';
import { plainToInstance } from 'class-transformer';
const dto = plainToInstance(CreateOrderDto, requestBody);
const errors = await validate(dto);
if (errors.length > 0) {
console.log('Validation errors:', errors.map(e => e.constraints));
}