s3.copyObject不会将ServerSideEncryption应用于目标存储桶中的对象?

时间:2016-10-23 03:07:09

标签: javascript amazon-web-services encryption amazon-s3 aws-lambda

我正在尝试对ACCOUNT-A上的一个存储桶中的任何对象执行跨帐户备份到ACCOUNT-B上的备份存储桶,我希望使用{{{{}}加密备份存储桶中的对象1}}。但加密似乎并未应用于备份存储桶中的对象。

设置

  • AES256有一个名为ACCOUNT-A
  • 的源存储桶
  • assets.myapp.com有一个名为ACCOUNT-B
  • 的目标存储分区
  • backup-assets.myapp.com存储桶上的s3.ObjectCreated:*存储桶事件触发Lambda函数将新创建的对象复制到assets.myapp.com下的backup-assets.myapp.com存储桶。
  • 尝试将ACCOUNT-B应用于ServerSideEncryption: 'AES256'桶中的对象。

Lambda函数代码

backup-assets.myapp.com

Cloudwatch日志报告成功

当函数运行时,对象被成功复制,我的Lambda函数的Cloudwatch日志报告用作var async = require('async'); var aws = require('aws-sdk'); var s3 = new aws.S3({ apiVersion: '2006-03-01' }); exports.backupObject = function backupS3Object(event, context) { if (event.Records === null) { return context.fail('NOTICE:', 'No records to process.'); } async.each(event.Records, function(record, iterate) { var sourceBucket = record.s3.bucket.name; var targetBucket = 'backup-' + record.s3.bucket.name; var key = record.s3.object.key; s3.copyObject({ Bucket : targetBucket, CopySource : sourceBucket + '/' + key, Key : key, ACL : 'private', ServerSideEncryption : 'AES256', MetadataDirective : 'COPY', StorageClass : 'STANDARD_IA' }, function(error, data) { if (error) return iterate(error); console.log('SSE: ' + data.ServerSideEncryption); console.log('SUCCESS: Backup of ' + sourceBucket + '/' + key); return iterate(); }); }, function (error) { if (error) { return context.fail('ERROR:', 'One or more objects could not be copied.'); } return context.done(); }); }; 的{​​{1}}。

但是,S3控制台不同意

但问题是,当我在ServerSideEncryption下的AES256广告管理单元中检查已复制对象的Properties > Details时,它会报告backup-assets.myapp.com

知道为什么ACCOUNT-BServer Side Encryption: None桶中落入时似乎没有应用于该对象?或者它实际上是否正在应用,我刚刚发现了SSE中的显示错误?

  

奖金问题

     

当我尝试手动将backup-assets.myapp.com应用于任何给定对象时   使用控制台,我收到以下错误:S3 Console

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

想出来了。

问题在于ACL方法的copyObject参数。

如果要对目标存储桶中的对象使用ServerSideEnryption: 'AES256',则必须提供允许bucket-owner-full-control允许备份存储区应用加密的ACL 。这在任何地方都没有记录(我发现),但我现在已经做了大量的测试(不是选择),并确定这确实有效。所以工作的Lambda函数代码如下:

var async = require('async');
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });

exports.backupObject = function backupS3Object(event, context) {

    if (event.Records === null) {
        return context.done('NOTICE: No records to process.');
    }

    async.each(event.Records, function(record, iterate) {

        var sourceBucket = record.s3.bucket.name;
        var targetBucket = 'backup-' + record.s3.bucket.name;
        var key = record.s3.object.key;

        s3.copyObject({
            Bucket : targetBucket,
            CopySource : sourceBucket + '/' + key,
            Key : key,
            ACL : 'bucket-owner-full-control',
            ServerSideEncryption : 'AES256',
            MetadataDirective : 'COPY',
            StorageClass : 'STANDARD_IA'
        }, function(error, data) {

            if (error) return iterate(error);
            console.log('SUCCESS: Backup of ' + sourceBucket + '/' + key);
            return iterate();

        });

    }, function (error) {

        return context.done(error);

    });

};

我不确定是否可以使用上述问题评论中讨论的X-region X-account复制方法。执行复制时似乎没有任何方法可以声明SSE