我想要的是让aws cognito用户组(家族)对S3存储桶进行读写,而S3存储桶仅对这些用户家族可用。
我使用boto3 python库创建了一个用户。现在,我需要授予该用户访问其存储桶中文件夹的权限。
我发现了一些建议创建存储桶策略的帖子:
policy = {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Grant user access to his folder",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:PutObject"],
"Resource": "arn:aws:s3:::BUCKET/users/${cognito-identity.amazonaws.com:sub}",
"Condition": {
"StringLike": {
"cognito-identity.amazonaws.com:sub": [
"us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"us-east-1:yyyyyyyy-xxxx-xxxx-xxxx-xxxxxxxxxx"
]
}
}
}
]}
但是事实证明,我们无法在存储桶的策略条件中指定“ cognito-identity.amazonaws.com:sub”。
我们非常感谢您的帮助。
答案 0 :(得分:0)
您应在用户池中创建组,并将IAM角色分配给该组。
然后将用户添加到组中。
更多文档在这里:https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-user-groups.html
答案 1 :(得分:0)
我认为您具有的上述策略必须针对经过身份验证的用户使用IAM角色,而不是存储桶策略的一部分。
答案 2 :(得分:0)
您需要用户联合身份池以及cognito用户池。 联合身份池将具有两种IAM角色:经过身份验证的用户和未经身份验证的用户。您需要将此策略附加到经过身份验证的IAM角色。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucketname",
],
"Condition": {
"StringLike": {
"s3:prefix": [
"${cognito-identity.amazonaws.com:sub}/*"
]
}
}
},
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucketname/${cognito-identity.amazonaws.com:sub}/*",
]
}
]
}
此策略将允许认知用户在存储桶“ bucketname”中写入/读取/删除到特定文件夹(文件夹名称为用户的identity_id)。
这是获取身份ID的方法。身份池ID是联合身份池的池ID。 id_token是用户通过cognito登录后将收到的令牌。
id_token = event["id_token"]
identity_pool_id = "ap-south-1:5dd90c82-c562-4a68-babf-6174fd8c03ef"
identity_client = boto3.client('cognito-identity')
try:
identity_response = identity_client.get_id(IdentityPoolId=identity_pool_id,
Logins = {
PROVIDER: id_token
}
)
except Exception as e:
return {"error": True, "success": False, "message": e.__str__(), "data": None}
identity_id = identity_response['IdentityId']