如何在AWS SAM部署中配置Cognito身份池IAM认证?
SAM部署中API Gateway AWS IAM授权配置问题解决
问题本质
你在SAM里设置DefaultAuthorizer: AWS_IAM后触发403,是因为SAM模板的API资源配置未正确匹配原API Gateway的IAM授权逻辑,并非授权器本身的问题。而尝试自定义授权器完全是多余操作——原API Gateway用的是AWS内置的IAM授权,根本不需要自定义Lambda授权器,报错“Invalid Authorizer URI”就是因为自定义授权器必须绑定Lambda函数,这一步对你的场景完全没必要。
正确配置方案
要复现原API Gateway的AWS IAM授权,只需在SAM模板里正确配置AWS::Serverless::Api资源,确保全局或方法级的授权规则生效:
示例SAM模板片段
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: MyServerlessApi: Type: AWS::Serverless::Api Properties: StageName: prod # 全局默认启用AWS IAM授权 DefaultAuthorizer: AWS_IAM Auth: # 避免OPTIONS预检请求被IAM授权拦截 AddDefaultAuthorizerToCorsPreflight: false MyBackendFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src/ Handler: main.handler Runtime: nodejs20.x Events: ApiRequest: Type: Api Properties: RestApiId: !Ref MyServerlessApi Path: /user/data Method: GET # 继承全局的AWS_IAM授权,无需额外配置
403错误排查清单
如果配置后还是返回403,逐一检查以下项:
- 请求签名正确性:确保客户端用Cognito身份池返回的临时凭证(Access Key、Secret Key、Session Token),通过AWS SigV4算法对请求签名,别直接用Cognito的ID Token或Access Token。
- Lambda角色权限:确认Lambda的执行角色允许API Gateway调用(SAM默认会生成这个权限,但若手动修改过角色,需检查是否存在
execute-api:Invoke权限)。 - API阶段配置:登录AWS控制台,查看API Gateway的对应阶段,确认“默认授权器”已设为“AWS_IAM”。
- 是否存在覆盖规则:检查模板中是否有某个端点单独设置了
Authorizer: NONE,会覆盖全局的AWS_IAM配置。
原API Gateway配置的等效逻辑
之前手动在API Gateway的“Method Request→Authorization”选择“AWS IAM”,本质是为单个方法启用内置IAM授权。SAM里的DefaultAuthorizer: AWS_IAM是全局配置,效果和手动给每个方法设置一致,只要模板里没有冲突的配置,就能完全复现原逻辑。
内容的提问来源于stack exchange,提问作者Matt Saunders
相关产品推荐
相关产品推荐

