使用Cognito未认证角色调用RDS DescribeDBInstances API时遭遇IAM权限拒绝问题求助
排查Cognito未认证角色调用RDS
DescribeDBInstances 权限拒绝问题 看起来你已经做了不少配置,但还是遇到了权限拒绝的问题,我来帮你梳理几个容易遗漏的关键点:
1. 确认身份池与UnAuth角色的绑定关系
有时候我们会不小心把策略加到错误的角色上,或者身份池没正确关联目标角色:
- 打开AWS控制台的Cognito身份池页面,找到你的身份池
- 进入身份池设置 → 身份验证提供商 → 未认证身份,检查这里指定的角色是否是你附加了自定义策略的
Cognito_TestUnauth_Role - 如果绑定的是其他角色,修改为正确角色后等待1-5分钟让配置生效
2. 检查角色的信任策略是否允许未认证用户扮演角色
即使权限策略正确,若信任策略不允许Cognito为未认证用户分配该角色,也会触发权限问题。你的UnAuth角色信任策略应该包含以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "你的身份池ID" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" } } } ] }
你可以在IAM控制台找到该角色,进入信任关系标签页验证上述配置是否正确(替换你的身份池ID为实际值)。
3. 尝试使用更具体的资源ARN
虽然你用了*作为资源,但部分AWS API的权限检查对资源格式有更明确的要求。根据错误信息中的资源格式,修改你的自定义策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "rds:DescribeDBInstances", "Resource": "arn:aws:rds:us-east-1:你的账号ID:db:*" } ] }
替换你的账号ID为实际AWS账号ID,保存后等待几分钟再测试。
4. 排查是否有其他策略限制访问
- 服务控制策略(SCP):如果你的账号属于AWS组织,检查是否有SCP禁止了未认证用户访问RDS API,SCP会优先于IAM角色权限生效。
- IAM拒绝策略:检查该UnAuth角色是否附加了包含
Deny语句的其他策略,拒绝策略的优先级高于允许策略,会直接导致权限被拒绝。
5. 验证策略生效状态
IAM策略变更通常需要1-5分钟才能全局生效,如果你刚修改完就测试,可能还未生效。等待一段时间后重新调用API试试。
你也可以用AWS CLI模拟权限检查,快速定位问题:
aws iam simulate-principal-policy --policy-source-arn "arn:aws:sts::你的账号ID:assumed-role/Cognito_TestUnauth_Role/CognitoIdentityCredentials" --action-names "rds:DescribeDBInstances" --resource-arns "arn:aws:rds:us-east-1:你的账号ID:db:*"
这个命令会返回权限检查的详细结果,帮助你确认是否是策略本身的问题。
内容的提问来源于stack exchange,提问作者akerra




