【问题标题】:iOS AWS v2 S3 Transfer Manager must use specified endpointiOS AWS v2 S3 Transfer Manager 必须使用指定的端点
【发布时间】:2015-01-29 01:09:07
【问题描述】:

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

但是,即使我按照他的提示,我仍然有相同的错误结果。错误是:

Error Domain=com.amazonaws.AWSS3ErrorDomain Code=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)

欢迎任何建议!谢谢!

【问题讨论】:

  • 您是否在您的下载请求中更改了非美国标准存储桶地址的前缀(即端点)?

标签: ios amazon-web-services amazon-s3


【解决方案1】:

最近遇到了同样的问题。 AWS SDK Docs 非常混乱和矛盾,他们很烂......

上面的答案为我指明了正确的方向,因为我使用的是开发人员认证的身份,我使用的是自定义身份提供者(与 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;
    }];
}

【讨论】:

    【解决方案2】:

    AWS v2 的答案

    尽管您似乎通过在代码中使用区域正确设置了AWSServiceConfiguration,但您仍在使用默认的AWSS3TransferManager (var transferManager = AWSS3TransferManager.defaultS3TransferManager())。相反,使用docs 中指定的自定义初始化将传输管理器的配置设置为您已经创建的serviceConfiguration


    AWS v1 的答案

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

    假设downloadRequestS3GetObjectRequest,在执行transferManager的下载之前,你应该设置S3GetObjectRequest的endpoint来匹配bucket区域。

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

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

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

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

    端点的完整列表可用here

    【讨论】:

    • 感谢您的回复。但是我使用的是 AWS SDK v2,并且对于 AWSS3GetObjectRequest 或 AWSS3TransferManagerDownloadRequest(我正在使用的那个)都没有称为 setEndPoint 的方法。
    • @ileonard 哇,v2。男孩,我已经脱离了循环。新文档很糟糕。但我想我找到了适合你的解决方案,我会发布更新。
    • 谢谢。我看到有人在 v1 中使用“setEndpoint”方法,想知道在 v2 中一定有类似的东西。否则就是从 v2 降级到 v1...
    • 有一种设置 AWSServiceConfiguration 的方法,但文档真的很糟糕,现在让我陷入困境...... AWSServiceConfiguration 实际上在文档中没有类引用,尽管他们在 AWSS3TransferManager 的 init 中提到了它。 .. 一秒...
    • @LyndseyScott,当我从 S3 下载图像时遇到问题。而以上所说的功能在V2.2.2中是不存在的。我需要你的帮助
    【解决方案3】:

    每当 Amazon AWS 移动开发工具包在控制台中显示不明确的警告时,打开 详细 日志记录以进行调试:

    (斯威夫特 3) AWSLogger.default().logLevel = .verbose
    (斯威夫特 2)AWSLogger.defaultLogger().logLevel = .Verbose

    ...揭示更多关于正在使用的 S3 存储桶、区域、端点等的信息。


    我发现这对于找出在尝试在存储桶之间切换时发生的什么特别有用,因为错误消息

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

    ...没有提供有关实际/当前传输管理器配置的太多信息。

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 2018-09-14
      • 2017-07-25
      • 1970-01-01
      • 2020-09-13
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      相关资源
      最近更新 更多