dynamodb_truncate.sh
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 |