将加密应用于现有S3对象,而不会影响存储类

时间:2017-11-06 16:58:58

标签: amazon-web-services encryption amazon-s3 amazon-glacier amazon-s3-infrequent

我正在尝试加密现有的s3存储桶。当我这样做时:

aws s3 cp s3://test/ s3://test/ --recursive --sse

它通过重新复制对象来加密存储桶中的所有文件。我的问题是我在Standard,Standard-IA和Glacier存储类的存储桶中有对象。因此,当我运行上述复制命令时,Standard-IA存储中的对象将转换为标准存储。 (我还没有测试冰川中物体发生了什么 - 可能它甚至不允许我复制。)

我们有什么方法可以恢复对象的存储类型并只为现有存储桶启用加密?

3 个答案:

答案 0 :(得分:2)

您需要添加命令行选项--storage-class STANDARD_IA

答案 1 :(得分:2)

你可以使用bash和JQ做这样的事情,显然用boto3或类似的python会更干净。

我不知道你是否最好添加一个检查来跳过GLACIER文件,没有神奇的方法可以在不解冻的情况下对它们应用加密,然后重新冻结它们。

你想在s3存储桶本地的ec2实例上运行它。

#!/bin/bash

bucketname="bucket-name"
aws s3 ls ${bucketname} --recursive | awk '{ print $NF }' > /tmp/filelist

for file in `cat /tmp/filelist`
do
        class=`aws s3api head-object --bucket ${bucketname} --key $file  | jq '.StorageClass' | sed 's/\"//g'`
        if [ "$class" = "null" ]
        then
                class="STANDARD"

        fi
        echo "aws s3 cp s3://${bucketname}/${file} s3://${bucketname}/${file} --sse  --storage-class ${class}"
done

答案 2 :(得分:0)

您的存储桶有生命周期策略吗?如果是这样的话-实际上它的行为就像应该的那样-实际上,您是在存储桶中创建一个新对象,因此实际上过渡到标准是正确的。

上述Ewan Leith的选项实际上是唯一的方法-以编程方式确定当前存储状态,然后在保存时覆盖“ new”项的存储。

希望这对您有帮助...