我正在尝试对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-B
在Server Side Encryption: None
桶中落入时似乎没有应用于该对象?或者它实际上是否正在应用,我刚刚发现了SSE
中的显示错误?
奖金问题
当我尝试手动将
backup-assets.myapp.com
应用于任何给定对象时 使用控制台,我收到以下错误:S3 Console
提前感谢您的帮助。
答案 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
。