以编程方式在 AWS S3 上启用版本控制
Programmatically enable versioning on AWS S3
我在使用 AWS SDK iOS v2.1.1 以编程方式启用现有存储桶的版本控制时遇到问题。错误是 -[NSNull _fastCharacterContents]: unrecognized selector sent to instance ...
。我的代码片段创建了执行 putBucketVersioning
方法的错误结果:
AWSS3VersioningConfiguration *conf = [AWSS3VersioningConfiguration new];
conf.status = AWSS3BucketVersioningStatusEnabled;
AWSS3PutBucketVersioningRequest *versionRequest = [AWSS3PutBucketVersioningRequest new];
versionRequest.bucket = createBucketReq.bucket;
versionRequest.versioningConfiguration = conf;
[[[AWSS3 S3ForKey:key] putBucketVersioning:versionRequest] continueWithBlock:^id(BFTask *task) {
return task;
}
关于如何创建 AWSS3PutBucketVersioningRequest
请求,我可能遗漏了一个论点,但我找不到任何示例或文档可以为我指明正确的方向。非常欢迎 Java、Cocoa 或 Swift 中的任何建议。干杯,Trond
更新:
根据评论,我在启用 AWSLogging verbose 后包括了完整的方法和错误输出。
-(BFTask*) enableVersioningOfBucket:(NSString*)bucket region:(NSInteger) region {
[self setupCredentialsForRegion:region];
NSString *key = [NSString stringWithFormat:@"regionkey%li",region];
AWSS3VersioningConfiguration *conf = [AWSS3VersioningConfiguration new];
conf.status = AWSS3BucketVersioningStatusEnabled;
AWSS3PutBucketVersioningRequest *versionRequest = [AWSS3PutBucketVersioningRequest new];
versionRequest.bucket = bucket;
versionRequest.versioningConfiguration = conf;
NSLog(@"Config %@",versionRequest);
return [[[AWSS3 S3ForKey:key] putBucketVersioning:versionRequest] continueWithBlock:^id(BFTask *task) {
NSLog(@"Put bucket versioning %@ - %@", task, task.result);
return task;
}];
}
日志消息:
2015-06-06 12:09:41.822 connectS3[50137:6337899] Config <AWSS3PutBucketVersioningRequest: 0x600000082350> {
bucket = testbucket;
versioningConfiguration = "<AWSS3VersioningConfiguration: 0x600000024bc0> {\n MFADelete = 0;\n status = 1;\n}";}
2015-06-06 12:09:41.832 connectS3[50137:6337899] -[NSNull _fastCharacterContents]: unrecognized selector sent to instance 0x7fff7724c210
更新 2
下图显示了堆栈跟踪,因为当我使用断点并进入每个方法调用时,错误消息刚刚出现。
更新 3
我如下所述设置我的凭据。除了启用版本控制之外,这适用于我连接 S3 的所有其他方法。
AWSStaticCredentialsProvider *credentialsProvider = [[AWSStaticCredentialsProvider alloc ]
initWithAccessKey:keychainStore[ACCESS_KEY_ID]
secretKey:keychainStore[SECRET_KEY]];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:region
credentialsProvider:credentialsProvider];
/* One credential configuration for each region **/
NSString *key = [NSString stringWithFormat:@"regionkey%li",region];
[AWSS3 registerS3WithConfiguration:configuration forKey:key];
/* Default credentialsProvider **/
[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;
感谢您的帮助!
我可以确认这是当前 AWS Mobile SDK 中的错误。我们将在未来的版本中修复它。感谢报告。
要解决此问题,您可以将以下行添加到 AWSS3VersioningConfiguration
代码中:
AWSS3VersioningConfiguration *conf = [AWSS3VersioningConfiguration new];
conf.status = AWSS3BucketVersioningStatusEnabled;
conf.MFADelete = AWSS3MFADeleteDisabled; // <------ Add this line
...
我在使用 AWS SDK iOS v2.1.1 以编程方式启用现有存储桶的版本控制时遇到问题。错误是 -[NSNull _fastCharacterContents]: unrecognized selector sent to instance ...
。我的代码片段创建了执行 putBucketVersioning
方法的错误结果:
AWSS3VersioningConfiguration *conf = [AWSS3VersioningConfiguration new];
conf.status = AWSS3BucketVersioningStatusEnabled;
AWSS3PutBucketVersioningRequest *versionRequest = [AWSS3PutBucketVersioningRequest new];
versionRequest.bucket = createBucketReq.bucket;
versionRequest.versioningConfiguration = conf;
[[[AWSS3 S3ForKey:key] putBucketVersioning:versionRequest] continueWithBlock:^id(BFTask *task) {
return task;
}
关于如何创建 AWSS3PutBucketVersioningRequest
请求,我可能遗漏了一个论点,但我找不到任何示例或文档可以为我指明正确的方向。非常欢迎 Java、Cocoa 或 Swift 中的任何建议。干杯,Trond
更新:
根据评论,我在启用 AWSLogging verbose 后包括了完整的方法和错误输出。
-(BFTask*) enableVersioningOfBucket:(NSString*)bucket region:(NSInteger) region {
[self setupCredentialsForRegion:region];
NSString *key = [NSString stringWithFormat:@"regionkey%li",region];
AWSS3VersioningConfiguration *conf = [AWSS3VersioningConfiguration new];
conf.status = AWSS3BucketVersioningStatusEnabled;
AWSS3PutBucketVersioningRequest *versionRequest = [AWSS3PutBucketVersioningRequest new];
versionRequest.bucket = bucket;
versionRequest.versioningConfiguration = conf;
NSLog(@"Config %@",versionRequest);
return [[[AWSS3 S3ForKey:key] putBucketVersioning:versionRequest] continueWithBlock:^id(BFTask *task) {
NSLog(@"Put bucket versioning %@ - %@", task, task.result);
return task;
}];
}
日志消息:
2015-06-06 12:09:41.822 connectS3[50137:6337899] Config <AWSS3PutBucketVersioningRequest: 0x600000082350> {
bucket = testbucket;
versioningConfiguration = "<AWSS3VersioningConfiguration: 0x600000024bc0> {\n MFADelete = 0;\n status = 1;\n}";}
2015-06-06 12:09:41.832 connectS3[50137:6337899] -[NSNull _fastCharacterContents]: unrecognized selector sent to instance 0x7fff7724c210
更新 2
下图显示了堆栈跟踪,因为当我使用断点并进入每个方法调用时,错误消息刚刚出现。
更新 3 我如下所述设置我的凭据。除了启用版本控制之外,这适用于我连接 S3 的所有其他方法。
AWSStaticCredentialsProvider *credentialsProvider = [[AWSStaticCredentialsProvider alloc ]
initWithAccessKey:keychainStore[ACCESS_KEY_ID]
secretKey:keychainStore[SECRET_KEY]];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:region
credentialsProvider:credentialsProvider];
/* One credential configuration for each region **/
NSString *key = [NSString stringWithFormat:@"regionkey%li",region];
[AWSS3 registerS3WithConfiguration:configuration forKey:key];
/* Default credentialsProvider **/
[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;
感谢您的帮助!
我可以确认这是当前 AWS Mobile SDK 中的错误。我们将在未来的版本中修复它。感谢报告。
要解决此问题,您可以将以下行添加到 AWSS3VersioningConfiguration
代码中:
AWSS3VersioningConfiguration *conf = [AWSS3VersioningConfiguration new];
conf.status = AWSS3BucketVersioningStatusEnabled;
conf.MFADelete = AWSS3MFADeleteDisabled; // <------ Add this line
...