亚马逊认知身份 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:xxxxx-xx-xx-xx-xx

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

期待任何提示/建议:)

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

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

以下策略(取自访问策略示例的示例 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}/*"]
}
]
}

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