DynamoDB Scan dengan AWS CLI
aws dynamodb scan melakukan paginasi otomatis, yang praktis sekaligus berarti satu-satunya angka yang akan Anda pakai untuk menilai kerusakannya salah secara default. Lihat Query vs. Scan untuk tahu kapan operasi ini sebaiknya dihindari sama sekali.
Kode
aws dynamodb scan \
--table-name 'Music' \
--filter-expression '#filter0 >= :filterValue0' \
--expression-attribute-names '{"#filter0":"Year"}' \
--expression-attribute-values '{":filterValue0":{"N":"2010"}}'--return-consumed-capacity melaporkan satu halaman, bukan keseluruhan scan
Fixture-nya berisi 600 lagu berukuran kira-kira 3,9 KB masing-masing, dan 8 di antaranya cocok. Tambahkan --return-consumed-capacity TOTAL pada perintah itu dan CLI mencetak:
{ "Count": 8, "ScannedCount": 600, "CU": 128.5 }Scan itu sebenarnya berbiaya 284,5 unit baca di sepanjang tiga halaman. Count dan ScannedCount dijumlahkan dari ketiganya; ConsumedCapacity diambil dari yang pertama dan sisanya dibuang. Itu bukan bug melainkan aturan yang memang dideklarasikan — konfigurasi paginator DynamoDB milik botocore mendaftar Count dan ScannedCount sebagai result key dan ConsumedCapacity sebagai non-aggregate key.
Petunjuknya: angkanya bergerak padahal pekerjaannya tidak. Tabel yang sama, 600 item yang sama dibaca, satu flag tambahan:
--page-size 50 -> { "Count": 8, "ScannedCount": 600, "CU": 24.0 }Kalau Anda menakar sebuah tabel dari scan lewat CLI, jumlahkan sendiri halaman-halamannya dengan --page-size plus --starting-token, atau baca kapasitasnya dari CloudWatch.
--max-items tidak menghentikan scan-nya
--max-items 3 terbaca seperti sampel murah. Ia bukan:
--max-items 3 -> { "Count": 8, "ScannedCount": 600 }CLI terus meminta halaman sampai ia punya cukup kecocokan, yang dengan filter selektif berarti seluruh tabel, lalu memangkas daftar yang dicetak. Token lanjutannya sendiri mengatakannya terang-terangan:
{"ExclusiveStartKey": {"Artist": {"S": "Arturo Sandoval"},
"SongTitle": {"S": "Cubano Chant 0541"}}, "boto_truncate_amount": 3}boto_truncate_amount adalah penghitung di sisi klien. Untuk membatasi apa yang dibaca DynamoDB, pakai --page-size, yang menyetel Limit milik API pada setiap request di baliknya, lalu lanjutkan dengan --starting-token:
aws dynamodb scan \
--table-name 'Music' \
--page-size 500 \
--max-items 100 \
--starting-token "$NEXT_TOKEN"Diukur 2026-07-28 terhadap DynamoDB Local (amazon/dynamodb-local) dengan aws-cli/2.36.9. JSON di atas adalah keluaran CLI itu sendiri, dibentuk ulang dengan --query agar muat lebarnya.
Penjelasan
--filter-expressionberjalan setelah pembacaan, jadi ia mengecilkan keluarannya, bukan tagihannya.#filter0menjadi aliasYearlewat--expression-attribute-nameskarenaYearadalah reserved word.--expression-attribute-valuesmenuntut angkanya di-quote dua kali: quote shell mengelilingi JSON-nya, dan nilainya berupa string JSON. Menghilangkan quote bagian dalam tak pernah sampai ke DynamoDB — CLI menolaknya secara lokal denganInvalid type for parameter ExpressionAttributeValues.:v.N, value: 2010, type: <class 'int'>, valid types: <class 'str'>.--page-sizeadalah flag yang mengubah panggilan API-nya. Ia menjadiLimitpada setiap request di baliknya, membatasi jumlah item yang dievaluasi per halaman. Sisa keluarga paginasinya (--max-items,--starting-token) hanyalah CLI mengelola keluarannya sendiri.- Parallel scan butuh
--segment N --total-segments Mper worker, dan setiap worker memegang--starting-tokenmiliknya sendiri. Ia membeli waktu jam dinding, bukan kapasitas.
Lakukan secara visual
DynamoDB Expression Builder memancarkan filter dan kedua map JSON-nya sudah ter-escape untuk shell, yang menghapus lapisan quoting yang membuat expression CLI gagal sebelum DynamoDB sempat melihatnya.
Untuk menjelajahi tabel dalam GUI, dengan grid yang terfilter dan berpaginasi, unduh DynoTable alih-alih melakukan scan buta dari terminal.
Panduan terkait
- Query vs. Scan — kapan (jarang) sebuah
scanbisa dibenarkan. - Mengapa Scan DynamoDB saya lambat dan mahal? — model biayanya dan cara menghindarinya.
- DynamoDB ProvisionedThroughputExceededException — apa yang dilakukan scan seluruh tabel terhadap kapasitas tabel provisioned.
- DynamoDB ThrottlingException — throttle yang satunya, dan bagaimana exponential backoff menanganinya.