首页 > 解决方案 > Amazon cognito 身份 ID(子)+ S3 存储桶名称

问题描述

我目前正在开发一个 webApp,让经过身份验证的用户(通过 Cognito 用户池)处理他们自己的 s3 存储桶。这样,我想使用以下变量 ${cognito-identity.amazonaws.com:sub} 来动态命名我的 s3 存储桶。这就是我对我的 s3 角色的期望,该角色与我的 Cognito 联合身份中的经过身份验证的用户相关联:

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

${cognito-identity.amazonaws.com:sub} 的值看起来像“eu-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx”,但我知道 S3 名称不能包含“:”特殊字符...

是否有任何解决方法可以根据每个 cognito Identity ID 动态命名我的 s3 存储桶?

期待任何提示/建议:)

标签: amazon-s3amazon-cognito

解决方案


正如@Rasikh 在他的评论中提到的那样,每个账户的 S3 存储桶数量是有限制的。默认情况下为 100,但您可以通过向 AWS 提交服务限制请求将其增加到最多 1,000。但是,该解决方案不能扩展到任何数量的用户。

sub一种更常见的模式是只创建一个 s3 存储桶,并且仅授予每个经过身份验证的用户根据其认知身份的属性访问特定前缀(路径或文件夹)的权限。

以下策略(取自访问策略示例的示例 2)提供 cognito Web 身份s3:ListBucket权限,但仅限于其特定前缀,以及获取和放置对象的能力,但同样仅限于其前缀内。

{
  "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}/*"]
    }
  ]
}

值得注意的是,这仅适用于经过身份验证的用户,因为未经身份验证的用户每次都会获得不同的认知身份,因此sub每次都不同。


推荐阅读