Mi objetivo es convertir todos los archivos que actualmente son de clase de almacenamiento GLACIER a ESTÁNDAR usando aws cli s3api . Para hacer esto, primero necesito obtener una lista de todos estos archivos, luego ejecutar un comando de restore y, finalmente, un comando de copy para cambiarlos todos a ESTÁNDAR.
El problema es que la cantidad de archivos es demasiado grande (~ 5 millones), lo que finalmente da como resultado un error de core dump segmentation fault si el elemento máximo supera los 600k a 700k. Si no proporciono el parámetro --max-item , obtendría el mismo error. Así que no pude obtener más archivos por debajo del umbral de 700k. Aquí está el comando que usé:
aws s3api list-objects --bucket my-bucket --query 'Contents[?StorageClass==`GLACIER`]' --max-item 700000 > glacier.txt¿Hay algún trabajo alrededor?
Así que descubrí la opción --starting-token del comando list-objects . Entonces escribí un script para escanear todos los elementos en un lote de 100k objetos. Este script generará un archivo que contiene la clave S3 de todos los objetos GLACIER.
#!/bin/bash BUCKET="s3-bucket-name" PREFIX="foldername" PROFILE="awscliprofile" MAX_ITEM=100000 var=0 NEXT_TOKEN=0 while true; do var=$((var+1)) echo "Iteration #$var - Next token: $NEXT_TOKEN" aws s3api list-objects \ --bucket $BUCKET \ --prefix $PREFIX \ --profile $PROFILE \ --max-item $MAX_ITEM \ --starting-token $NEXT_TOKEN > temp awk '/GLACIER/{getline; print}' temp >> glacier.txt NEXT_TOKEN=$(cat temp | grep NextToken | awk '{print $2}' | sed 's/\("\|",\)//g') if [ ${#NEXT_TOKEN} -le 5 ]; then echo "No more files..." echo "Next token: $NEXT_TOKEN" break rm temp fi rm temp done echo "Exiting." Después de eso, puedo usar restore-object y, finalmente copy-object para cambiar la clase de almacenamiento de todos estos archivos a ESTÁNDAR. Ver más guiones aquí . Espero que esto ayude a cualquiera que necesite lograr lo mismo.
aquí hay una solución de línea
aws s3api list-objects --bucket *bucket-name*| grep "StorageClass" > nonglacier.txtentonces puedes grep clase de almacenamiento usando
cat nonglacier.txt | grep GLACIER | wc -ltambién se puede resumir como
aws s3api list-objects --bucket <bucket-name>| grep "StorageClass" | grep GLACIER | wc -l