适用于iOS的AWS开发工具包:无法列出S3存储桶中的文件

时间:2016-06-30 09:38:28

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

我按照第一步here来配置凭据和S3存储桶。然后,在我的代码中,我有:

func setupCredentialsProvider() {
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.USEast1, identityPoolId:identityPoolIdStr)
    let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialsProvider)
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration

    AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)
}

func listObjects() {
    let s3 = AWSS3.defaultS3()

    let listObjectsRequest = AWSS3ListObjectsRequest()
    listObjectsRequest.bucket = S3BucketName
    s3.listObjects(listObjectsRequest).continueWithBlock { (task) -> AnyObject! in
        if let error = task.error {
            print("listObjects failed: [\(error)]")
        }
        if let exception = task.exception {
            print("listObjects failed: [\(exception)]")
        }
}

当我运行应用程序并调用listObjects()时,我收到此错误:

  

listObjects failed:[Error Domain = com.amazonaws.AWSServiceErrorDomain Code = 11“(null)”UserInfo = {HostId =,Message = Access Denied,Code = AccessDenied,RequestId =}]

我错过了什么?

1 个答案:

答案 0 :(得分:0)

如果它与我遇到的问题类似,那么经过身份验证的Cognito用户无权访问特定的S3存储桶。阅读Understanding Amazon Cognito Authentication Part 3: Roles and Policies给了我所需的线索,特别是:

  

当您通过Cognito控制台创建身份池时,它将为您创建两个角色,一个用于经过身份验证的用户,另一个用于未经身份验证的用户,但您可以访问IAM控制台并创建更多角色而不仅仅是这些角色。您还可以修改现有角色,以根据您的使用情况添加对Amazon S3或Amazon DynamoDB等其他服务的支持。

所以我决定修改已认证用户的创建角色,以允许访问我的S3存储桶:

  1. 切换到您的IAM控制台并找到一个名为的角色: xxxx_auth_yyy - auth子字符串是其中的重要部分 将角色标识为经过身份验证的用户的角色。
  2. 使用此角色通过以下方式为经过身份验证的用户分配权限:
  3. 创建策略(策略 - >创建策略)以提供特定存储桶所需的访问权限。
  4. "附加"此政策对经过身份验证的角色(角色 - > xxxx_auth_yyy - >附加政策)。
  5. 您的代码现在应该能够列出特定S3存储桶中的文件。
  6. 示例政策(第3步):

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetObject",
                    "s3:PutObject"
                ],
                "Resource": [
                    "arn:aws:s3:::BUCKET_NAME*"
                ]
            }
        ]
    }