如何使用未认证身份调用AWS Video Rekognition?权限报错求助
这是AWS IAM权限体系里典型的角色传递(PassRole)问题,我来帮你拆解清楚:
问题核心原因
当你在Rekognition请求里配置NotificationChannel时,Rekognition服务需要借助你指定的IAM角色来发送SNS通知。这就要求当前执行请求的角色(也就是你这里的CognitoRkUnauth_Role)必须拥有iam:PassRole权限,允许把目标角色传递给Rekognition服务。而你去掉NotificationChannel后能正常拿到jobId,是因为此时Rekognition不需要传递任何角色,自然跳过了这个权限检查环节。
具体解决步骤
1. 给CognitoRkUnauth_Role添加iam:PassRole权限
登录AWS IAM控制台,找到CognitoRkUnauth_Role,新增一条自定义内联策略,内容如下(记得替换xxxxxxxxxx为你的AWS账号ID):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::xxxxxxxxxx:role/CognitoRkUnauth_Role", "Condition": { "StringEquals": { "iam:PassedToService": "rekognition.amazonaws.com" } } } ] }
这里的Condition是为了最小化权限风险,只允许把这个角色传递给Rekognition服务,避免过度授权。
2. 确保目标角色信任Rekognition服务
进入CognitoRkUnauth_Role的信任关系标签页,编辑信任策略,添加允许Rekognition服务假设该角色的规则(注意保留原有的Cognito相关信任规则,不要删除):
{ "Version": "2012-10-17", "Statement": [ // 保留你原有的Cognito信任规则 { "Effect": "Allow", "Principal": { "Service": "rekognition.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
3. 给目标角色添加SNS发布权限
最后还要确保CognitoRkUnauth_Role有向你指定的SNS主题发送消息的权限,否则即使PassRole权限搞定,后续Rekognition发送通知时还是会失败。添加一条类似的策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-1:xxxxxxxxxx:your-notification-topic" } ] }
替换us-east-1为你的SNS主题所在区域,your-notification-topic为你的主题ARN或名称。
完成以上三步后,重新运行带NotificationChannel配置的Rekognition请求,应该就能正常执行了。
内容的提问来源于stack exchange,提问作者Marco Antonio

