iOS AWS v2 S3 Transfer Manager必须使用指定的端点

我正在开发一个使用AWS作为后端的iOS应用程序。 由于我希望用户遍布全球,因此我需要切换应用程序下载照片的位置,以提高延迟性能。 我在EUWest1中创build了一个S3存储桶,而在APNorthEast1中创build了一个S3存储桶。 正如Yosuke在这里所说( https://forums.aws.amazon.com/message.jspa?messageID=586581#586581 ),可以将AWSServiceManager.defaultServiceManager()的默认configuration从一个区域更改为另一个区域,以防止错误。

但是,即使我跟着他的小费,我仍然有同样的错误结果。 错误是:

错误域= com.amazonaws.AWSS3ErrorDomain代码= 0“操作无法完成(com.amazonaws.AWSS3ErrorDomain错误0.)”UserInfo = 0x14fb7720 {RequestId = D708XXX8E1EDBXXX,Endpoint = bucket-ap-northeast-1.s3 -ap-northeast-1.amazonaws.com,Message =您尝试访问的存储区必须使用指定的端点进行寻址。 请发送所有未来的请求到这个端点,HostId = xxxY31S3yFhpssQe1EsfipWWLw = Code = PermanentRedirect,bucket = bucket-ap-northeast-1}

这是我的代码:

var credentialsProvider = AWSCognitoCredentialsProvider.credentialsWithRegionType(kCognitoRegionType, accountId: kAWSAccountID, identityPoolId: kCognitoPoolID, unauthRoleArn: kCognitoRoleUnauth, authRoleArn: kCognitoRoleAuth) var serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.APNortheast1, credentialsProvider: credentialsProvider) AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(serviceConfiguration) var transferManager = AWSS3TransferManager.defaultS3TransferManager() transferManager.download(downloadRequest) 

任何build议,欢迎! 谢谢!

回答AWS v2

虽然看起来好像通过在代码中使用区域来正确设置AWSServiceConfiguration ,但仍然使用默认的AWSS3TransferManagervar transferManager = AWSS3TransferManager.defaultS3TransferManager() )。 相反,使用文档中指定的自定义init来将传输pipe理器的configuration设置为已经创build的serviceConfiguration


回答AWS v1

如果您创build的存储桶像EUWest1和APNorthEast1不是美国标准,则无法使用典型的path样式语法(“ http://s3.amazonaws.com ”或不需要指定的端点)来访问存储桶。

假设downloadRequest是一个S3GetObjectRequest ,在执行transferManager的下载之前,你应该设置S3GetObjectRequest的端点来匹配桶区域。

对于EUWest1,您可以将端点设置为:

 [downloadRequest setEndpoint:@"s3-eu-west-1.amazonaws.com.com"]; 

对于APNorthEast1,您可以将端点设置为:

 [downloadRequest setEndpoint:@"s3-ap-northeast-1.amazonaws.com"]; 

这里有完整的端点列表

最近刚刚有同样的问题。 AWS软件开发工具包文档是非常混乱和矛盾的,他们吸…

上面的答案指出我正确的方向,因为我使用开发人员身份validation身份,我正在使用自定义身份提供程序(同样在Github上的示例文档)。 我使用registerS3TransferManagerWithConfiguration与我的凭据提供程序,但随后提供了AWSRegionUSWest2作为关键USWest2S3TransferManager的区域。

然后我叫AWSS3TransferManager *transferManager = [AWSS3TransferManager S3TransferManagerForKey:@"USWest2S3TransferManager"]; 在我的上传类。

希望这可以帮助有类似问题的其他人。

 - (AWSTask *)initializeClients:(NSDictionary *)logins { NSLog(@"initializing clients..."); [AWSLogger defaultLogger].logLevel = AWSLogLevelVerbose; id<AWSCognitoIdentityProvider> identityProvider = [[DeveloperAuthenticatedIdentityProvider alloc] initWithRegionType:AWSRegionUSEast1 identityId:nil identityPoolId:identityPoolID logins:logins providerName:DeveloperAuthProviderName authClient:nil]; self.credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityProvider:identityProvider unauthRoleArn:nil authRoleArn:nil]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:self.credentialsProvider]; [AWSS3TransferManager registerS3TransferManagerWithConfiguration:[[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSWest2 credentialsProvider:self.credentialsProvider] forKey:@"USWest2S3TransferManager"]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration; return [self.credentialsProvider getIdentityId]; } 

我的具体上传方法是:

 - (void)performS3UploadWithRequest:(AWSS3TransferManagerUploadRequest *)request { AWSS3TransferManager *transferManager = [AWSS3TransferManager S3TransferManagerForKey:@"USWest2S3TransferManager"]; AWSTask *task = [AWSTask taskWithResult:nil]; __weak typeof(self) weakSelf = self; task = [task continueWithSuccessBlock:^id(AWSTask *task) { return [[transferManager upload:request] continueWithBlock:^id(AWSTask *task) { if (task.error) { [self handleErrorWithTask:task request:request]; } if (task.result) { AWSS3TransferManagerUploadOutput *uploadOutput = task.result; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf uploadProgress]; }); // The file uploaded successfully. DLog(@"%@", uploadOutput); } return nil; }]; }]; [task continueWithSuccessBlock:^id(AWSTask *task) { return nil; }]; } 

只要Amazon AWS Mobile SDK在控制台中显示不明确的警告,请打开详细日志logging以进行debugging:

(Swift 3) AWSLogger.default().logLevel = .verbose
(Swift 2) AWSLogger.defaultLogger().logLevel = .Verbose

…揭示更多关于使用什么S3桶,区域,端点等的信息。


我发现这个特别有用,可以找出当试图在桶之间切换时发生了什么 ,因为错误信息

… Endpoint = bucket-ap-northeast-1.s3-ap-northeast-1.amazonaws.com ,Message =您尝试访问的存储区必须使用指定的端点进行寻址。 …

…没有提供有关实际/当前传输pipe理器configuration的更多信息。