【问题标题】:Amazon AWS S3 Uploads from iOS Device从 iOS 设备上传 Amazon AWS S3
【发布时间】:2018-09-29 12:30:32
【问题描述】:

我一直在尝试按照他们的文档将图像/视频上传到 s3。但是,经过多次尝试后,我不断收到拒绝访问错误。

我已经在其 UnAuth 角色中为 s3:* 访问设置了一个认知池。但问题是我无法让它在 iOS 设备上运行。我使用 AWSTransferManager 创建上传功能,但这是我得到的响应:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message> 
<RequestId>DEE11EF134B50C8D</RequestId><HostId>/+qV8CLvPZHi4lIAHrVnKf1sDmWFcFS1dcfMX5XG0yfPG/TIASBfo/T5aGZRZg77wdn7siOrRVc=</HostId></Error>
Upload failed with error: (The operation couldn’t be completed. (com.amazonaws.AWSServiceErrorDomain error 11.))

存储桶政策-:

{
    "Version": "2012-10-17",
    "Id": "Policy1460611228663",
    "Statement": [
        {
            "Sid": "Stmt1460611220793",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::MY_ACCOUNT_ID:root"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::MY_BUCKET_NAME/*"
        }
    ]
}

IAM UnAuth 角色政策-:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

我被困在这个问题上。请建议我做错了什么?

let accK = "myaccesskey"
let secretK = "mysecretkey"
let credentialsProvider = AWSStaticCredentialsProvider(accessKey: accK, secretKey: secretK)
let configuration = AWSServiceConfiguration(region: AwsRegion, credentialsProvider: credentialsProvider)
AWSS3TransferManager.register(with: configuration!, forKey: "mys3")

【问题讨论】:

  • “UnAuth 角色策略”是什么意思?据我所知,我们可以定义用户角色策略和存储桶策略。即我们如何为用户提供访问权限以及哪些 access_token 能够访问存储桶。但我没有听说“UnAuth 角色政策”?在这里阅读docs.aws.amazon.com/AmazonS3/latest/dev/…
  • 谢谢。所以我必须创建一个 IAM 用户并将 S3 的策略添加到该用户,然后使用该用户的访问密钥和秘密密钥在 iOS 中创建凭证?
  • 是的。正确的。此外,我们可以使用根管理员的访问密钥和密钥。(即不创建 IAM 用户)。但亚马逊不会喜欢单独使用管理员访问密钥访问 S3 存储桶。这不是最佳做法。还有一点,您无需在 iOS 中创建任何凭据,只需在 S3 设置期间使用访问密钥和密钥即可。
  • 好的,我试过了,但得到了同样的错误。添加 iOS 代码。
  • 你有没有检查桶名和上传路径(应该有相同的桶名)。?

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


【解决方案1】:

配置了身份池和 IAM 策略,以便身份池的 unauth 角色可以访问存储桶,以下代码应该可以工作

//Setup credentials
let credentialProvider = AWSCognitoCredentialsProvider(regionType: YOUR-IDENTITY-POOL-REGION, identityPoolId: "YOUR-IDENTITY-POOL-ID")

//Setup the service configuration
let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialProvider)

//Setup the transfer utility configuration
let tuConf = AWSS3TransferUtilityConfiguration()

//Register a transfer utility object
AWSS3TransferUtility.register(
with: configuration!,
transferUtilityConfiguration: tuConf,
forKey: "transfer-utility-with-advanced-options"
)

//Look up the transfer utility object from the registry to use for your transfers.
let transferUtility = AWSS3TransferUtility.s3TransferUtility(forKey: "transfer-utility-with-advanced-options")


transferUtility.uploadData(
        testData,
        bucket: "BUCKET",
        key: "KEY",
        contentType: "video/mp4",
        expression: uploadExpression,
        completionHandler: uploadCompletionHandler
        ).continueWith (block: { (task) -> AnyObject? in
            XCTAssertNil(task.error)

            return nil
    })

请查看我之前发布的链接以获取更多信息。

【讨论】:

  • 您能告诉我应该设置什么存储桶策略以使其可由 IAM 角色访问吗?这行得通吗 - 校长:{"AWS":"my_unauth_role_arn"}
  • 您无需在 S3 控制台上指定存储桶策略。相反,您可以转到 IAM 控制台,导航到 unauth 角色并使用“AttachPolicy”按钮设置访问权限。例如 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject " ], "资源": [ "arn:aws:s3:::bucket/*" ] } ] }
  • 您的意思是我应该将存储桶策略留空?
  • 非常感谢,这有效。我做错的是,即使在重新配置配置后,我在创建 TransferUtility 对象时调用了 default() 方法。
  • 我遇到了问题,我正在使用带有多部分API的上层配置,但是当我上传图片时,第一次上传后,我无法再次上传图片,再次上传我需要重新启动应用
【解决方案2】:

使用访问密钥和密钥是解决问题的一种方法。另一种方法是设置 Cognito 身份池并从中获取临时的、短期的凭证以访问存储桶。这将是一种更安全的方式,也是我们推荐的最佳做法。

当您创建 Cognito 身份池时,它会自动创建 2 个角色,即“auth”和“unauth”角色。这是一种便利机制,因为许多移动应用程序都有登录用户和匿名用户(尚未登录的用户)的概念。典型的例子是一个电子商务应用程序,您可以使用它来搜索和浏览,并且只需登录即可添加到购物车/进行购买。

您可以设置“auth”或“unauth”或两个角色(取决于您的场景)以对存储桶拥有权限,这将使您能够通过应用程序访问存储桶。请参阅https://docs.aws.amazon.com/aws-mobile/latest/developerguide/how-to-integrate-an-existing-bucket.html 了解更多信息。

另外,我建议您使用 TransferUtility 而不是 TransferManager 进行 S3 上传/下载。

【讨论】:

  • 这就是我正在做的。使用 cognito 设置新的联合身份,然后将权限授予 S3 作为身份的角色。然后我尝试了 TransferUtility 但我得到错误代码 2 (null)
  • 我对如何创建存储桶策略本身以及我必须在其中设置什么感到困惑。
  • 您可以分享您在身份角色中设置的策略吗?
  • 我已经在我的问题 IAM 政策中找到了 unauth 角色。同样为 Auth 角色设置。
  • 现在我正在尝试 TransferUtility 并获取错误代码 2 (null)
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 2013-01-28
  • 2013-05-19
  • 2020-04-25
  • 2010-12-17
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多