为池中的每个Cognito标识提供单个S3存储桶的最佳方法

时间:2017-04-26 11:59:05

标签: amazon-s3 amazon-cognito

我正在评估在平台中使用Cognito开发人员身份验证身份和S3存储的选项。基本上,我想要做的是为每个客户创建一个单独的S3存储桶和Cognito标识。此时我们不需要为每个用户单独的Cognito身份,我们只使用身份来允许访问S3存储。在这种情况下,我们需要支持数百个客户(因此数百个存储桶具有相关的Cognito身份)。

我找到了几个如何使用单个S3存储桶中的专用文件夹执行此操作的示例(请参阅Example 1Example 2)。我不认为所有客户的单个存储桶在我们的情况下都是可行的解决方案,原因有多种(原因之一是S3 API速率限制显然与独特的存储桶有关)。

我尝试在客户存储桶上创建访问策略,仅允许访问特定的Cognito身份,即

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::CUSTOMER-BUCKET/*"
      ],
      "Principal": {
        "AWS": "my IAM role for Cognito"
      },
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:sub": [
            "us-east-1:customer's cognito identity"
          ]
        }
      }
    }
  ]
}

但S3不承认cognito-identity.amazonaws.com:sub条件。

如果我将类似的策略附加到用于Cognito身份池的IAM角色,即

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::CUSTOMER-BUCKET/*"
      ],
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:sub": [
            "us-east-1:customer's cognito identity"
          ]
        }
      }
    }
  ]
}

它似乎有效,但显然我必须为每个标识和存储桶组合添加一个策略,这会遇到可以添加到单个角色的内联策略大小的限制(总共10240个字符)。 / p>

此时我正试图想出一种可行的方法。任何建议都会非常感激。

1 个答案:

答案 0 :(得分:3)

您绝对应该使用单个存储桶而不是每个用户使用一个存储桶。甚至不要考虑“每用户桶”策略。

您应该使用IAM Policy Variables创建一个适用于所有用户的策略。

您可以使用Cognito ID作为S3策略中的前缀。请参阅IAM Roles文档中的 S3前缀部分:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket"],
      "Condition": {"StringLike": {"s3:prefix": ["${cognito-identity.amazonaws.com:sub}/*"]}}
    },
    {
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"]
    }
  ]
}

然后,用户可以访问同一S3存储桶子目录中的对象。

关于使用单个存储桶的问题,我建议您尝试一下,然后查看问题是否真正导致。 Amazon S3具有高度可扩展性,可供一些非常大的Web服务使用,因此可能会支持您的用例。请参阅:Amazon S3 Request Rate and Performance Considerations