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

时间:2016-10-19 18:16:36

标签: amazon-web-services amazon-s3 compare version

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 个答案:

答案 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();