#amazon-web-services #amazon-s3 #compare #version
#amazon-веб-сервисы #amazon-s3 #Сравнить #версия
Вопрос:
Управление версиями пакетов Amazon S3 — это хорошо, но я не вижу простого способа сравнить версии файла — ни через консоль, ни через любое другое приложение, которое я нашел.
S3Browser, похоже, имеет лучшую поддержку управления версиями, но сравнения нет.
Есть ли способ сравнить версии файла на S3 без загрузки обеих версий и сравнения их вручную?
—
РЕДАКТИРОВАТЬ: я только начал думать, что некоторая базовая автоматизация не должна быть слишком сложной, см. Фрагмент ниже. Однако остается вопрос: есть ли какой-либо инструмент, который поддерживает это должным образом? Этот сценарий может подойти для меня, но не для пользователей, не являющихся разработчиками.
#!/bin/bash
# s3-compare-last-versions.sh
if [[ $# -ne 2 ]]; then
echo "Usage: `basename $0` <bucketName> <fileKey> "
exit 1
fi
bucketName=$1
fileKey=$2
latestVersionId=$(aws s3api list-object-versions --bucket $bucketName --prefix $fileKey --max-items 2 | json Versions[0].VersionId)
previousVersionId=$(aws s3api list-object-versions --bucket $bucketName --prefix $fileKey --max-items 2 | json Versions[1].VersionId)
aws s3api get-object --bucket $bucketName --key $fileKey --version-id $latestVersionId $latestVersionId".js"
aws s3api get-object --bucket $bucketName --key $fileKey --version-id $previousVersionId $previousVersionId".js"
diff $latestVersionId".js" $previousVersionId".js"
Ответ №1:
Я написал скрипт bash для загрузки последних двух версий объекта и сравнения его с помощью colordiff. Я наткнулся на этот вопрос после его написания. Подумал, что могу поделиться этим здесь, если кто-нибудь захочет его использовать.
#!/bin/bash
#This script needs awscli, jq and colordiff. Please install them for your environment
#This script also needs the AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_DEFAULT_REGION.
#Please set them using the export command as follows or set them using envrc
#export AWS_ACCESS_KEY_ID=<Your AWS Access Key ID>
#export AWS_SECRET_ACCESS_KEY=<Your AWS Secret Access Key>
#export AWS_DEFAULT_REGION=<Your AWS Default Region>
set -e
if [ -z $1 ] || [ -z $2 ]; then
echo "Usage:"
echo "version_compare.sh *bucket_name* *file_name*"
echo
echo "Example"
echo "version_compare.sh bucket_name folder/filename.extension"
echo
exit 1;
fi
aws_bucket=$1
file_key=$2
echo Getting the last 2 versions of the file at ${file_key}..
echo
echo Executing:
cat << EOF
aws s3api list-object-versions --bucket ${aws_bucket} --prefix ${file_key} --max-items 2
EOF
echo
versions=$(aws s3api list-object-versions --bucket ${aws_bucket} --prefix ${file_key} --max-items 2)
version_1=$( jq -r '.["Versions"][0]["VersionId"]' <<< "${versions}" )
version_2=$( jq -r '.["Versions"][1]["VersionId"]' <<< "${versions}" )
mkdir -p state_comparison_files
echo Getting the latest version ${version_1} of the file at ${file_key}..
echo
echo Executing:
cat << EOF
aws s3api get-object --bucket ${aws_bucket} --key ${file_key} --version-id ${version_1} state_comparison_files/${version_1}
EOF
aws s3api get-object --bucket ${aws_bucket} --key ${file_key} --version-id ${version_1} state_comparison_files/${version_1} > /dev/null
echo
echo Getting older version ${version_2} of the file at ${file_key}..
echo
echo Executing:
cat << EOF
aws s3api get-object --bucket ${aws_bucket} --key ${file_key} --version-id ${version_2} state_comparison_files/${version_2}
EOF
aws s3api get-object --bucket ${aws_bucket} --key ${file_key} --version-id ${version_2} state_comparison_files/${version_2} > /dev/null
echo
echo Comparing the different versions.
echo If no differences are found, nothing will be shown
colordiff --unified state_comparison_files/${version_2} state_comparison_files/${version_1}
Вот ссылка на него
https://gist.github.com/mohamednajiullah/3edc88d314291be40f2dd3cf13ea0d7f
Примечание: Это почти то же самое, что и сценарий, созданный самим автором вопроса, за исключением того, что он использует jq для синтаксического анализа json и colordiff для отображения разницы в разных цветах, как в git diff.
Я создаю electron.js настольное приложение на основе, чтобы сделать именно это. В настоящее время он находится в разработке, но его можно использовать. Я приветствую вклад
https://github.com/mohamednajiullah/s3_object_version_comparator
Ответ №2:
Вы вообще не можете просматривать содержимое файла через S3, поэтому вы определенно не можете сравнивать содержимое файлов через S3. Вам нужно будет загрузить разные версии, а затем использовать такой инструмент, как diff
для их сравнения.
Комментарии:
1. Спасибо за ответ! Действительно, это то, что я делал до сих пор. Вопрос в том, как это можно сделать автоматически?
2. Вы, конечно, могли бы написать скрипт, использующий AWS CLI, или программу, использующую AWS SDK, для выполнения этой функции, если вам нужно, поэтому делайте это регулярно.
3. ах, действительно 🙂 … это то, что я только что сделал!
4. Обратите внимание, что запрос рекомендаций сторонних инструментов считается не по теме для этого сайта и приведет к закрытию вашего вопроса. Запрос подобных вещей не считается связанным с программированием.
Ответ №3:
вы также можете использовать MegaSparDiff с открытым исходным кодом, который сравнивает несколько типов источников данных, включая S3
https://github.com/FINRAOS/MegaSparkDiff
приведенная ниже пара вернет inLeftButNotInRight и inRightButNotInLeft в виде фреймов данных, которые вы можете сохранить в виде файлов или просмотреть данные с помощью кода.
SparkFactory.initializeSparkContext();
AppleTable leftAppleTable = SparkFactory.parallelizeTextSource("S3://file1","table1");
AppleTable rightAppleTable = SparkFactory.parallelizeTextSource("S3://file2","table2");
Pair<Dataset<Row>, Dataset<Row>> resultPair = SparkCompare.compareAppleTables(leftAppleTable, rightAppleTable);
resultPair.getLeft().show(100);
SparkFactory.stopSparkContext();