【问题标题】:How to compare versions of an Amazon S3 object?如何比较 Amazon S3 对象的版本?
【发布时间】:2018-01-05 12:59:42
【问题描述】:

Amazon S3 存储桶的版本控制很好,但我没有看到任何简单的方法来比较文件的版本 - 无论是通过控制台还是通过我找到的任何其他应用程序。

S3Browser 似乎有最好的版本支持,但没有可比性。

有没有办法在 S3 上比较文件的版本,而无需下载两个版本并手动比较它们?

--

编辑: 我刚开始认为一些基本的自动化应该不会太难,见下面的sn-p。但问题仍然存在:是否有任何工具可以正确支持这一点?这个脚本可能适合我,但不适用于非开发用户。

#!/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"

【问题讨论】:

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


    【解决方案1】:

    你根本无法通过S3查看文件内容,所以你绝对不能通过S3比较文件内容。您必须下载不同的版本,然后使用diff 之类的工具进行比较。

    【讨论】:

    • 感谢您的回复!事实上,这就是我迄今为止一直在做的事情。问题是:如何自动完成?
    • 您当然可以编写使用 AWS CLI 的脚本或使用 AWS 开发工具包的程序来执行此功能,如果您需要定期执行此操作。
    • 啊,确实:) ...这就是我刚刚所做的!
    • 请注意,要求第三方工具推荐被认为是本网站的题外话,并且会结束您的问题。要求这样的事情与编程无关。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您也可以使用开源的 MegaSparDiff 来比较多种类型的数据源,包括 S3

      https://github.com/FINRAOS/MegaSparkDiff

      以下对将返回 inLeftButNotInRight 和 inRightButNotInLeft 作为 DataFrame,您可以将其保存为文件,也可以通过代码检查数据。

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

      【讨论】:

        猜你喜欢
        • 2021-08-27
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 2011-10-18
        • 2011-03-01
        • 2023-04-05
        相关资源
        最近更新 更多