AWS SAM如何为现有API Gateway添加Lambda Authorizer
核心原因
你遇到的新API生成、手动配置丢失问题来自两个常见配置误区:
- 模板中新增
AWS::Serverless::HttpApi资源块时,SAM默认会创建全新的HTTP API实例,不会自动复用存量API,直接部署就会出现原有路由丢失、访问URL变更的问题。 - 控制台手动添加的授权器、集成配置自动消失,属于IaC配置漂移现象:被SAM/CloudFormation纳管的资源,所有未写入模板的手动变更,都会在下次部署时被模板中的存量配置覆盖,不存在"自动消失",是被部署流程回滚了。
分两种场景适配:
场景1:现有API本身就是当前SAM栈创建的HttpApi资源
不要新建HttpApi资源,直接在原有HttpApi的资源块上追加授权器配置,同时给需要鉴权的路由单独绑定授权器即可,参考配置:
# 这是你模板中已经存在的HttpApi资源,不要新增同类型资源 MyExistingHttpApi: Type: AWS::Serverless::HttpApi Properties: # 保留原有所有配置(CORS、阶段设置、访问日志等),不要删除 CorsConfiguration: AllowOrigins: - "https://your-domain.com" AllowMethods: - GET - POST - OPTIONS StageName: prod # 追加授权器配置 Auth: DefaultAuthorizer: NONE # 全局默认关闭鉴权,不影响原有公开路由 Authorizers: CustomLambdaAuthorizer: AuthorizerPayloadFormatVersion: "2.0" FunctionArn: !GetAtt AuthLambda.Arn # 替换为你的授权器Lambda ARN FunctionInvokeRole: !GetAtt LambdaAuthInvokeRole.Arn # 替换为Lambda调用角色ARN Identity: Headers: - Authorization ReauthorizeEvery: 300 # 鉴权结果缓存时间,单位秒,可按需调整
给需要保护的路由绑定授权器时,在对应Lambda函数的HttpApi事件中补充Auth配置即可:
ProtectedBizFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/protected-biz/ Handler: index.handler Runtime: nodejs20.x Events: ProtectedRoute: Type: HttpApi Properties: ApiId: !Ref MyExistingHttpApi # 关联原有API Path: /api/user/info Method: GET Auth: Authorizer: CustomLambdaAuthorizer # 绑定刚才定义的授权器
场景2:现有API是在控制台/其他工具创建的,不属于当前SAM栈
不要使用AWS::Serverless::HttpApi资源新建API,改用AWS::ApiGatewayV2::Authorizer资源直接挂载到存量API上,参考配置:
# 为存量API创建Lambda授权器 ImportedApiAuthorizer: Type: AWS::ApiGatewayV2::Authorizer Properties: ApiId: "替换为你的存量API ID" # 可通过SSM参数/模板变量传入 AuthorizerType: REQUEST Name: LambdaAuth AuthorizerUri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${AuthLambda.Arn}/invocations AuthorizerPayloadFormatVersion: "2.0" IdentitySource: - $request.header.Authorization EnableSimpleResponses: true AuthorizerCredentialsArn: !GetAtt LambdaAuthInvokeRole.Arn
后续新增路由、集成配置时,直接引用该存量API ID和新建的授权器ID即可,部署过程不会重建API。
避免手动配置丢失的方案
- 所有API Gateway相关配置(授权器、路由、集成、CORS、限流规则等)全部写入template.yaml,统一通过
sam deploy完成变更,不要在控制台直接修改被SAM/CloudFormation纳管的资源。 - 部署前执行
sam deploy --no-execute-changeset生成变更集,确认不存在重建API、删除存量路由/集成的操作后再执行部署,避免误操作。 - 不要混用控制台、AWS CLI、SAM、其他IaC工具管理同一个API实例,统一基础设施管理入口。
- 如果确实需要临时手动调整配置,调整后第一时间将对应配置同步到模板中,避免下次部署被覆盖。
内容的提问来源于stack exchange,提问作者Riddick
相关产品推荐
相关产品推荐

