如何通过Cognito身份池配置S3策略实现用户私有文件夹访问及报错修复
问题分析与解决方案
错误根源
你混淆了IAM角色策略和S3桶策略的用途:
- S3桶策略是资源级策略,仅能配置与S3相关的操作,且必须明确指定
Principal(允许访问的实体); - 你添加的
mobileanalytics:PutEvents、cognito-sync:*、execute-api:Invoke等操作不属于S3范畴,因此被拒绝; - 桶策略无法直接使用
${cognito-identity.amazonaws.com:sub}变量,需通过Condition匹配用户身份ID; - 非S3资源的ARN(比如execute-api的ARN)不能出现在S3桶策略中。
正确的S3桶策略
这个策略会允许Cognito身份池的已认证用户角色访问桶内private/${cognito-identity.amazonaws.com:sub}/路径下的对象,且仅能访问自己的子目录:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账户ID:role/Cognito_你的身份池名称Auth_Role" }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::uploads-api-attachmentBucket-123456789/private/${cognito-identity.amazonaws.com:sub}/*", "Condition": { "StringEquals": { "s3:prefix": "private/${cognito-identity.amazonaws.com:sub}/" } } } ] }
配套的IAM身份池角色策略
你需要同时给Cognito身份池的已认证用户角色配置以下IAM策略,用来授权用户执行对应的S3操作(注意替换占位符):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::uploads-api-attachmentBucket-123456789/private/${cognito-identity.amazonaws.com:sub}/*" } ] }
注意事项
- 替换策略中的
你的AWS账户ID、Cognito_你的身份池名称Auth_Role为实际的资源信息; - 避免使用
s3:*这样的全权限操作,仅授予业务需要的最小权限; - 如果你使用AWS Amplify,确保Amplify配置文件正确关联Cognito身份池和S3桶,Amplify会自动处理部分权限映射。
内容的提问来源于stack exchange,提问作者lopezdp
相关产品推荐
相关产品推荐

