API Gateway报502及AccessDeniedException错误求助(AWS SAM环境)
问题场景
我在使用带嵌套栈的AWS SAM部署架构中,遇到了API Gateway返回502 Bad Gateway的问题,同时伴随如下异常:
Endpoint response body before transformations:
return (<AccessDeniedException> <Message>Unable to determine service/operation name to be authorized</Message> </AccessDeniedException>)
经过测试,这个问题仅出现在配置了自定义Authorizer Lambda的端点上——授权器本身能正常执行完成所有转换,但请求转发到后端Lambda时就触发了上述权限错误。
已尝试但无效的操作
- 通过
aws-cli手动为后端Lambda添加Invoke权限,无任何效果 - 按相关配置指南添加Invoke Permissions声明,问题依旧存在
临时修复方法
手动进入API Gateway控制台操作,无需修改任何配置内容,仅需触发一次权限同步即可解决:
- 找到出现问题的端点,进入集成请求设置页面
- 点击编辑Lambda函数按钮
- 直接勾选对应选项并保存(无需修改Lambda函数名称)
操作完成后错误会立即消失,但重新构建SAM栈后问题会再次出现,因为SAM部署时不会保留手动添加的权限配置。
持久化解决方案(从SAM模板层面修复)
这个问题的核心原因是:嵌套栈架构下,SAM默认不会自动为API Gateway生成调用后端Lambda的完整权限,尤其是搭配自定义Authorizer时,权限关联容易因栈隔离出现遗漏。
你需要在SAM模板中显式声明API Gateway调用后端Lambda的权限资源,示例配置如下:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: # 后端业务Lambda函数 BackendFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/backend/ Handler: index.handler Runtime: nodejs18.x # 带自定义授权器的API Gateway ApiGateway: Type: AWS::Serverless::Api Properties: StageName: prod Auth: DefaultAuthorizer: CustomAuthorizer Authorizers: CustomAuthorizer: FunctionArn: !GetAtt AuthorizerFunction.Arn # 关键:添加API Gateway调用后端Lambda的权限声明 ApiInvokeBackendPermission: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunction FunctionName: !GetAtt BackendFunction.Arn Principal: apigateway.amazonaws.com SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${ApiGateway}/*/*/*"
如果使用嵌套栈,还要确保权限资源在正确的栈层级中,或者通过栈输出值跨栈传递Lambda ARN和API Gateway ARN,避免因栈隔离导致权限无法正确关联。
原理说明
手动编辑集成请求并保存时,API Gateway会自动补全缺失的Lambda Invoke权限;而SAM部署时如果没有显式声明该权限,嵌套栈的资源隔离机制会阻止自动权限生成,最终导致请求转发时出现权限判定失败的错误。
内容的提问来源于stack exchange,提问作者cMathis
相关产品推荐
相关产品推荐

