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

Amazon s3 为池中的每个Cognito标识提供单个S3存储桶的最佳方法,amazon-s3,amazon-cognito,Amazon S3,Amazon Cognito,我正在评估在平台中使用Cognito开发者身份验证身份和S3存储的选项。本质上,我想做的是为每个客户创建一个单独的S3 bucket和Cognito标识。此时,我们不需要为每个用户提供单独的Cognito标识,我们只使用该标识来允许访问S3存储。在这个场景中,我们将需要支持数百个客户(因此数百个具有相关Cognito标识的bucket) 我发现了几个例子,说明了如何在单个S3存储桶中使用专用文件夹来实现这一点(请参阅和)。我不认为在我们的案例中,针对所有客户的单一存储桶是可行的解决方案,原因有几

我正在评估在平台中使用Cognito开发者身份验证身份和S3存储的选项。本质上,我想做的是为每个客户创建一个单独的S3 bucket和Cognito标识。此时,我们不需要为每个用户提供单独的Cognito标识,我们只使用该标识来允许访问S3存储。在这个场景中,我们将需要支持数百个客户(因此数百个具有相关Cognito标识的bucket)

我发现了几个例子,说明了如何在单个S3存储桶中使用专用文件夹来实现这一点(请参阅和)。我不认为在我们的案例中,针对所有客户的单一存储桶是可行的解决方案,原因有几个(其中一个原因是S3API速率限制显然与唯一的存储桶相关联)

我尝试在客户存储桶上创建访问策略,只允许访问特定的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身份

如果我将类似的策略附加到用于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"
          ]
        }
      }
    }
  ]
}
这似乎是可行的,但显然我必须为每个标识和bucket组合添加一个策略,这将遇到可以添加到单个角色的内联策略的大小限制(总共10240个字符)


我正在抓挠我的头在这一点上试图想出一个办法,将工作。如果您有任何建议,我们将不胜感激。

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

您应该考虑使用创建一个适用于所有用户的策略

您可以在S3策略中使用Cognito ID作为前缀。请参阅文档中的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存储桶的子目录中的对象


至于使用单个桶的问题,我建议您尝试一下,然后看看是否会出现问题。AmazonS3是高度可扩展的,并且被一些非常大的web服务使用,所以它很可能支持您的用例。请参阅:。

我试图使用“每个公司一桶”的策略,而不是每个用户。每个公司可能有数百或数千个用户,但每个公司只有一个Cognito标识。我熟悉S3请求速率和性能方面的考虑,这就是为什么我希望将访问扩展到多个存储桶。我确信所有用户共享一个bucket在某个时候都会成为一个问题。不需要很长时间,就可以达到每秒100个请求的限制。我想我必须从亚马逊那里得到一些关于如何处理这个问题的建议。我建议你在做奇怪的事情之前先试试看,以避免你可能没有的问题。像DropBox这样的公司已经将S3用于更大规模的事情(但我不知道他们的bucket设置)。John回答中的例子是Cognito推荐的通过Cognito缩小对S3 bucket访问的方法。它允许您避免您提到的角色限制。我的第一个建议是试一下他说的话,用一个桶。如果您发现这是真正的阻塞,那么您可以向角色中的资源数组添加其他属性吗?