【问题标题】:AWS S3: confusion on bucket region and identityPoolId (Swift)AWS S3:对存储桶区域和 identityPoolId (Swift) 的混淆
【发布时间】:2017-03-17 20:22:04
【问题描述】:

我在从我的 AWS S3 存储桶(Swift/iOS 应用程序)下载文件时遇到问题。这似乎是两个问题之一,但我不知道是哪一个:

  1. 我的 identityPoolId 有问题
  2. 存储桶的区域问题

如果我这样创建凭据提供程序:

AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"];

我收到以下错误:

[Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=10 "(null)" UserInfo={__type=ResourceNotFoundException, message=Identity 'us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found.}]

我注意到创建凭证提供程序的行不匹配:regionType 是 AWSRegionUSEast1,但我将“us-west-2”作为 identityPoolId 的一部分。

如果我将 regionType 更改为 AWSRegionUSWest2(以匹配我的 id),ResourceNotFoundExeception 就会消失。但后来我明白了:

<Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message><Bucket>sportsmanregs</Bucket><Endpoint>s3.amazonaws.com</Endpoint><RequestId>AEFD833FF4E7B6F1</RequestId><HostId>mYxbBKlzTeWgVZW4W060+ESiBhWuxmfDDFE6UriXG7bqxA5NWuRbH9lu4NuGCaU/7H8f1hjAukA=</HostId></Error>

有趣的是,在完成处理程序的数据对象中发现了上述错误,如下面的“数据”中:

completionHandler = {
        (task, location, data, error) -> Void in DispatchQueue.main.async( execute: {

所以completionHandler 被调用OK。在 S3 控制台中,我尝试下载的文件的 URL 以“https://s3.amazonaws.com//xxx/xxx.tiff”开头。有没有人知道这里的问题是什么?

【问题讨论】:

    标签: swift amazon-s3


    【解决方案1】:

    听起来您的身份池和 S3 存储桶都在 us-west-2 区域。您自己解决了身份池部分,这是正确的。为了修复代码中的存储桶区域,您还需要将该区域传递给 S3 调用,否则它将使用默认的 us-east-1 并给您该错误。

    另一种方法是使用 [bucketname].s3.amazonaws.com 指定您的 url,有些人似乎在这方面取得了成功,但它可能只是通过修复区域来实现。

    【讨论】:

    • 当您说“将区域传递给 S3 调用”时,您指的是哪个调用?我正在使用 AWSS3TransferUtility.downloadData,但我没有看到它的区域参数。
    • 我注意到(在 Amazon S3 控制台中)它说我的存储桶有一个“美国标准”区域。根据我的阅读,这意味着东部 1 地区。因此,我为 East 1 区域创建了另一个身份池 ID,并在调用中使用它来创建凭据提供程序。 AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"]; 所以区域应该都匹配。
    • 现在我得到一个不同的错误:AccessDeniedAccess Denied1149B0237A37D778EYni7fxxxx=
    • 现在听起来您只需要调整您的 Cognito 角色对新存储桶的权限就可以了。
    • 好的,谢谢。我仍在努力更好地理解 Cognito。我们应用程序的用户不登录;我们只希望应用程序能够在启动时从 S3 下载一些文件。那么这种类型的身份验证是如何工作的呢?创建身份池时,我已选中“启用对未经身份验证的身份的访问”框。我是否还需要使用此处所述的 AWSCognitoCredentialsProviderHelper? docs.aws.amazon.com/cognito/latest/developerguide/…
    【解决方案2】:
    AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"];
    

    这是正确的,但您需要添加一些代码行。请添加此代码:

     NSString *cognitoId = credentialsProvider.identityId;
        NSString *cognitopoolId = credentialsProvider.identityPoolId;
        NSLog(@"This is cognitoId: %@",cognitoId);
        NSLog(@"This is cognitopoolId: %@",cognitopoolId);
    
        [[credentialsProvider getIdentityId] continueWithBlock:^id(AWSTask *task){
    
            if (task.error == nil) {
                NSString* cognitoId = credentialsProvider.identityId;
                NSLog(@"cognitoId: %@", cognitoId);
            } else {
                NSLog(@"Error : %@", task.error);
            }
            return nil;
        }];
    

    【讨论】:

    • 自己编码不是答案。您应该回答问题:有人知道这里的问题是什么吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 2017-06-11
    • 2015-06-29
    • 2020-11-09
    • 2017-01-28
    • 1970-01-01
    • 2020-09-25
    • 2014-02-16
    相关资源
    最近更新 更多