DynamoDB ResourceInUseException

TL;DR — Anda mencoba operasi tabel pada tabel yang sudah ada atau masih bertransisi (CREATING / UPDATING / DELETING). Periksa status tabel terlebih dahulu, atau buat idempoten dengan mengabaikan "sudah ada".

Apa artinya

ResourceInUseException: Table already exists: <name>
ResourceInUseException: Attempt to change a resource which is still in use: Table is being created/deleted

# what the engine actually returns, reproduced against DynamoDB Local:
ResourceInUseException: Cannot create preexisting table

Mengapa itu terjadi

  • Menjalankan kembali CreateTable untuk tabel yang sudah ada (migrasi berulang/deploy, pengujian yang tidak selesai).
  • Beroperasi selama transisi — membuat indeks, menghapus, atau memperbarui saat tabel masih CREATING/UPDATING.
  • A race — dua proses yang membuat tabel yang sama secara bersamaan.

Bagaimana cara memperbaikinya

  1. Periksa status sebelum bertindak. DescribeTable → hanya dilanjutkan jika TableStatus adalah ACTIVE; gunakan pelayan (waitUntilTableExists) untuk memblokir sampai mengendap.
  2. Buat buat idempoten. Tangkap ResourceInUseException di CreateTable dan anggap itu sukses (tabel yang Anda inginkan ada).
  3. Serialisasi operasi tabel di tes/migrations sehingga dua operasi tidak berjalan sekaligus; membersihkan tabel uji dalam pembongkaran.

Contoh

import {DynamoDBClient, CreateTableCommand, ResourceInUseException} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({});

try {
  await client.send(new CreateTableCommand(tableDef));
} catch (err) {
  if (!(err instanceof ResourceInUseException)) throw err;
  // Table already exists — that's fine, carry on.
}

FAQ

Apa arti ResourceInUseException di DynamoDB? Operasi bidang kontrol (CreateTable, DeleteTable, UpdateTable) menargetkan tabel yang sudah ada atau masih bertransisi melalui CREATING, UPDATING, atau DELETING. DynamoDB tidak akan menerima operasi lain sampai tabel menjadi ACTIVE.

Bagaimana cara membuat CreateTable idempoten? Tangkap ResourceInUseException dan anggap itu sukses — tabel yang Anda inginkan ada. Alternatifnya, periksa DescribeTable terlebih dahulu dan hanya buat saat tabel tidak ada, gunakan pelayan seperti waitUntilTableExists untuk memblokir hingga selesai.

Jalur di DynoTable

Saat migrasi menjalankan kembali CreateTable, DynoTable segera menampilkan tabelnya ada — buka dengan ⌘KBuka tabel berdasarkan nama saat skrip Anda percobaan ulang. Pengaturan tabel pada tab terbuka menampilkan TableStatus (CREATING, UPDATING, ACTIVE) sehingga Anda dapat menunggu ACTIVE sebelum mengeluarkan yang berikutnya perubahan bidang kendali. Untuk iterasi lokal, arahkan profil Lokal ke http://localhost:8000 (Menjalankan DynamoDB Lokal) dan gunakan konverter DynamoDB JSON untuk memuat benih item setelah tabel selesai.

Untuk tabel cloud yang terjebak di UPDATING, Pengaturan tabel juga mencantumkan GSI dalam penerbangan pengisian ulang — tunggu ACTIVE di setiap indeks sebelum UpdateTable berikutnya masuk skrip penerapan Anda.

Terhadap DynamoDB Lokal, ResourceInUseException sama muncul saat tes menjalankan kembali CreateTable terhadap instance dalam memori yang tidak pernah dihapus - treat Lokal seperti cloud dan tangkap kesalahannya atau tunggu ACTIVE.

Kesalahan terkait

Sumber

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.