プロジェクト

全般

プロフィール

dynamodb_truncate.sh

https://dev.classmethod.jp/articles/dynamodb-delete-item-all/ - kinoshita, 2025/03/20 16:37

 
1
#!/bin/bash
2

    
3
set -e
4

    
5
prefix=$1
6
tables=$(aws dynamodb list-tables | jq -r '.[][] | select(. | test("^'$prefix'-.+"))')
7

    
8
tmp_scan_data=$(mktemp)
9
tmp_delete_items=$(mktemp)
10

    
11
for t in $tables; do
12
key=$(aws dynamodb describe-table --table-name $t | jq -r '.Table.KeySchema[].AttributeName')
13

    
14
# 予約語はprojection-expressionで指定できないため、全て#を付与してしまう
15
proj=$(echo -n $key | tr ' ' '\n' | sed -E 's/(.+)/#\1/' | tr '\n' ',')
16
attr=$(echo -n $key | tr ' ' '\n' | sed -E 's/(.+)/"#\1":"\1"/' | tr '\n' ',' | sed -E 's/(.+)/{\1}/')
17

    
18
while :; do
19
aws dynamodb scan --table-name $t --projection-expression "$proj" --expression-attribute-names "$attr" --max-item 25 > $tmp_scan_data
20

    
21
count=$(cat $tmp_scan_data | jq '.Count')
22
if [[ $count -eq 0 ]]; then
23
echo "${t}: delete completed."
24
break
25
fi
26

    
27
echo "${t}: delete progress ... ${count}."
28

    
29
cat $tmp_scan_data | jq '.Items[] | {"Key": .} | {"DeleteRequest": .}' | jq -s '.' | jq '{"'$t'": .}' > $tmp_delete_items
30

    
31
aws dynamodb batch-write-item --request-items file://$tmp_delete_items > /dev/null
32
done
33
done