对于我的每个客户,他们都将数据存储在单独的 Dropbox 帐户中,我正在将所有这些数据以单个 S3 存储桶的形式整合到 AWS 中,每个客户都可以控制该存储桶中的单个文件夹。
为了增加安全性,我计划为每个客户创建一个 IAM 用户(通过我的应用程序控制程序访问),并限制存储桶策略以仅允许对与该客户相关的文件夹的请求。
{
Sid = "VisualEditor0"
Effect = "Allow"
Action = "s3:*"
Resource = "arn:aws:s3:::customer_data/${aws:username}/*"
}
这一切对我来说似乎都是合理的,直到我意识到每个帐户的 IAM 用户数有 5000 个硬性限制。理论上,这个行业的发展必须非常顺利才能达到这个限制,但正如你所预料的那样,硬性限制让我有理由感到紧张。
还有更好的解决办法吗?
我发现这篇类似的帖子其中一个答案建议使用 AWS Cognito,它似乎可能需要用户输入,而不是允许我完全设置用户?
答案1
事实证明,我并没有真正理解 AWS Cognito 用户池与其身份池的区别。使用已启用未经身份验证身份访问权限的身份池,我能够存储多达 200 万个客户,每个客户都可以访问长达一小时的会话令牌……使用示例可能如下所示
cognito = boto3.client("cognito-identity", aws_access_key_id=access_key, aws_secret_access_key=secret)
get_id = cognito.get_id(AccountId=aws_account_id, IdentityPoolId=pool_id)
print("Users Cognito", get_id,sep="\n\n")
users_id = get_id["IdentityId"]
user_creds = cognito.get_credentials_for_identity(IdentityId=users_id)["Credentials"]
print("User Creds", user_creds,sep="\n\n")
user_key = user_creds['AccessKeyId']
user_secret = user_creds['SecretKey']
user_session = user_creds['SessionToken']
bucket_name = "customer-data"
s3 = boto3.client("s3", aws_access_key_id=user_key, aws_secret_access_key=user_secret, aws_session_token=user_session)
bucket_of_stuff = s3.list_objects_v2(Bucket=bucket_name)