s3.copyObject 没有将 ServerSideEncryption 应用于目标存储桶中的对象?
s3.copyObject does not apply ServerSideEncryption to object in target bucket?
我正在尝试对 ACCOUNT-A
上的一个存储桶中的任何对象执行跨账户备份到 ACCOUNT-B
上的备份存储桶,我希望备份存储桶中的对象使用AES256
。但加密似乎并未应用于备份存储桶中的对象。
设置
ACCOUNT-A
有一个名为 assets.myapp.com
的源存储桶
ACCOUNT-B
有一个名为 backup-assets.myapp.com
的目标存储桶
assets.myapp.com
存储桶上的 s3.ObjectCreated:*
存储桶事件触发 Lambda 函数将新创建的对象复制到 ACCOUNT-B
下的 backup-assets.myapp.com
存储桶。
- 正在尝试将
ServerSideEncryption: 'AES256'
应用到 backup-assets.myapp.com
桶中的对象,一旦它们到达那里。
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.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();
});
};
Cloudwatch 日志报告成功
函数运行时,对象被成功复制,我的 Lambda 函数的 Cloudwatch 日志报告 ServerSideEncryption
用作 AES256
。
但是,S3 控制台不同意
但问题是,当我检查 ACCOUNT-B
下 backup-assets.myapp.com
存储桶中复制对象的 Properties > Details
时,它报告 Server Side Encryption: None
.
知道为什么当对象落在 backup-assets.myapp.com
桶中时 SSE
似乎没有应用到对象吗?或者它是否真的被应用了,我刚刚在 S3 Console
?
中发现了一个显示错误
BONUS QUESTION
When I attempt to apply SSE:AES256
to any given object manually
using the console, I get the following error: The additional
properties (RRS/SSE) were not enabled or disabled due to errors for
the following objects in backup-assets.myapp.com:
copied-object-one.txt.
在此先感谢您的帮助。
想通了。
问题出在 copyObject
方法的 ACL
参数上。
如果您想对目标存储桶中的对象使用 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 区域 X 帐户复制方法。执行复制时似乎没有任何方法可以声明 SSE
。
我正在尝试对 ACCOUNT-A
上的一个存储桶中的任何对象执行跨账户备份到 ACCOUNT-B
上的备份存储桶,我希望备份存储桶中的对象使用AES256
。但加密似乎并未应用于备份存储桶中的对象。
设置
ACCOUNT-A
有一个名为assets.myapp.com
的源存储桶
ACCOUNT-B
有一个名为backup-assets.myapp.com
的目标存储桶
assets.myapp.com
存储桶上的s3.ObjectCreated:*
存储桶事件触发 Lambda 函数将新创建的对象复制到ACCOUNT-B
下的backup-assets.myapp.com
存储桶。- 正在尝试将
ServerSideEncryption: 'AES256'
应用到backup-assets.myapp.com
桶中的对象,一旦它们到达那里。
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.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();
});
};
Cloudwatch 日志报告成功
函数运行时,对象被成功复制,我的 Lambda 函数的 Cloudwatch 日志报告 ServerSideEncryption
用作 AES256
。
但是,S3 控制台不同意
但问题是,当我检查 ACCOUNT-B
下 backup-assets.myapp.com
存储桶中复制对象的 Properties > Details
时,它报告 Server Side Encryption: None
.
知道为什么当对象落在 backup-assets.myapp.com
桶中时 SSE
似乎没有应用到对象吗?或者它是否真的被应用了,我刚刚在 S3 Console
?
BONUS QUESTION
When I attempt to apply
SSE:AES256
to any given object manually using the console, I get the following error:The additional properties (RRS/SSE) were not enabled or disabled due to errors for the following objects in backup-assets.myapp.com: copied-object-one.txt.
在此先感谢您的帮助。
想通了。
问题出在 copyObject
方法的 ACL
参数上。
如果您想对目标存储桶中的对象使用 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 区域 X 帐户复制方法。执行复制时似乎没有任何方法可以声明 SSE
。