如何比较Amazon S3对象的版本?

8
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"
3个回答

8

我编写了一个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


5

通过 S3,您无法查看文件内容,因此您肯定无法通过 S3 比较文件的内容。您需要下载不同版本的文件,然后使用类似 diff 的工具进行比较。


谢谢您的回复!确实,这是我迄今为止一直在做的事情。问题是:如何自动完成这个过程? - Free Willaert
如果您需要定期执行此功能,您可以编写一个使用AWS CLI的脚本或利用AWS SDK的程序来完成。 - Mark B
啊,确实如此 :) ... 这就是我刚刚做的! - Free Willaert
请注意,在本站询问第三方工具推荐被认为是不适合的话题,会导致您的问题被关闭。这样的询问与编程无关。 - Mark B

0

您可以使用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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接