首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为池中的每个S3标识提供一个单一的桶的最佳方法

为池中的每个S3标识提供一个单一的桶的最佳方法
EN

Stack Overflow用户
提问于 2017-04-26 11:59:04
回答 1查看 2.4K关注 0票数 2

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

我已经找到了几个示例,说明如何使用单个S3桶中的专用文件夹(请参阅示例1示例2)来完成此操作。在我们的情况下,我不认为对所有客户都是一个可行的解决方案,原因有几个(原因之一是,S3 API的速率限制显然与唯一的桶相关联)。

我尝试在客户桶上创建访问策略,只允许访问特定的认知身份,即,

代码语言:javascript
复制
{
  "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不承认认知-标识.amazonaws.com:子条件。

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

代码语言:javascript
复制
{
  "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个字符)的内联策略的大小限制。

在这一点上,我绞尽脑汁想出一种可行的办法。如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2017-04-26 23:30:14

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

您应该考虑使用IAM政策变量来创建一个适用于所有用户的策略。

您可以在S3策略中使用认知ID作为前缀。请参阅S3前缀一节中的IAM角色文档:

代码语言:javascript
复制
{
  "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具有高度的可伸缩性,并且被一些非常大的web服务所使用,因此它很可能支持您的用例。见:亚马逊S3请求率和性能考虑

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43633575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档