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"
答案 0 :(得分:4)
我写了一个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
答案 1 :(得分:3)
您无法通过S3查看文件内容,因此您无法通过S3比较文件内容。您必须下载不同的版本,然后使用diff
之类的工具来比较它们。
答案 2 :(得分:0)
您也可以使用MegaSparDiff作为开源来比较多种类型的数据源,包括S3
https://github.com/FINRAOS/MegaSparkDiff
以下对将返回inLeftButNotInRight和inRightButNotInLeft作为DataFrames,您可以将其保存为文件,或者您可以通过代码检查数据。
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();