Python调用AWS AppSync遇未授权错误:如何正确认证请求?
解决Lambda调用AppSync时的未授权错误
核心问题定位
你遇到的Not Authorized to access getUserPlan on type UserPlan错误,本质是AppSync的权限规则未允许当前使用的认证方式访问该Query,而非Lambda的IAM权限或API Key本身的问题。以下是具体排查和修复步骤:
1. 检查AppSync API的认证模式启用状态
- 登录AWS控制台进入AppSync服务,找到目标API:
- 若使用API Key认证:确认「设置」>「API密钥」中密钥处于启用状态,且API的「默认认证模式」包含API Key,或该Query的单独认证配置允许API Key访问。
- 若使用IAM认证:确认「设置」>「认证」中已将IAM列为认证提供者之一。
2. 修正GraphQL Schema的权限规则(@auth指令)
Amplify生成的Schema默认可能仅启用用户池认证,需手动添加API Key或IAM的访问权限:
打开Amplify项目中amplify/backend/api/[你的API名称]/schema.graphql,给UserPlan类型添加对应权限规则:
type UserPlan @model @auth(rules: [ { allow: apiKey }, # 允许API Key访问 { allow: iam } # 允许IAM角色访问 ]) { id: ID! traits: [String] traitCount: Int # 其他字段... }
修改后执行amplify push重新部署API。
3. 配置Lambda执行角色的IAM权限
Lambda依赖自身执行角色的权限,而非本地CLI用户权限,需给该角色添加AppSync访问权限:
- 进入IAM控制台,找到目标Lambda的执行角色;
- 添加以下内联策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:GraphQL", "Resource": "arn:aws:appsync:ap-northeast-1:[你的AWS账号ID]:apis/[你的AppSync API ID]/*" } ] }
4. 修正Lambda调用AppSync的代码
- API Key方式的正确请求:
确保请求头使用x-api-key而非Authorization:response = requests.post( url=url, json={"query": query}, headers={"x-api-key": api_key} ) - IAM方式的正确请求:
你代码中的AWS4Auth配置是正确的,但需确保Lambda执行角色已配置上述AppSync权限,且Schema允许IAM访问。
5. 直接验证AppSync API权限
在AppSync控制台的「Query」页面,分别用两种认证方式测试getUserPlan:
- API Key:添加
x-api-key请求头后执行Query,确认是否成功; - IAM:选择「IAM」认证后执行Query,确认是否成功。
这一步可快速定位问题出在权限配置还是Lambda代码。
内容的提问来源于stack exchange,提问作者Electric Dragon
相关产品推荐
相关产品推荐

