AWS Serverless:能否配置serverless.yml让Lambda复用同文件定义的API Gateway
问题根因
当前部署生成两个独立API Gateway资源的核心原因:
provider.apiGateway下配置的restApiId、restApiRootResourceId是硬编码占位值xxxxxxxxxx,既没有和你在resources字段手动定义的WebApiGW资源建立关联,也不是有效API的真实标识。Serverless框架检测到传入的配置无效时,会自动触发默认逻辑:为所有带http事件的Lambda函数新建独立的API Gateway资源。- 你在
resources字段手动定义的WebApiGW是完全独立的CloudFormation资源,没有和框架内置的API路由生成逻辑打通,框架默认不会自动把Lambda的http事件挂载到这个自定义资源上。
调整方案
按照以下步骤修改配置,即可实现所有http事件复用自定义API Gateway、不再生成多余API资源的目标:
- 替换
provider.apiGateway下的硬编码占位值,直接通过CloudFormation内置引用关联你自定义的WebApiGW资源,从根源上告知框架复用现有API、关闭自动新建逻辑:provider: name: aws runtime: nodejs12.x stage: ${opt:stage, 'dev'} region: ${opt:region, 'us-east-2'} apiGateway: restApiId: Ref: WebApiGW restApiRootResourceId: Fn::GetAtt: - WebApiGW - RootResourceId environment: VERSION: 'v1' - 保留
resources字段下原有的WebApiGW资源定义和输出导出逻辑,这部分是支撑跨服务复用同一API入口的基础:- 其他拆分部署的独立服务,只需要在自身的
provider.apiGateway配置中,通过Fn::ImportValue导入当前服务导出的WebApiGateway-restApiId和WebApiGateway-rootResourceId,就能把自身的Lambda路由挂载到同一个主API入口下。
- 其他拆分部署的独立服务,只需要在自身的
- 调整完成后的框架执行逻辑:
- 跳过默认的「自动创建新RestApi」流程,不会生成多余的API Gateway资源
- 所有带http事件的Lambda函数,会自动将对应路由、请求方法、CORS配置挂载到
WebApiGW的根路径下 - 自动完成路由对应的Deployment创建、Stage关联流程,不会出现路由挂载后无法访问的问题
常见坑位说明
- 不要在同一个
serverless.yml中既开启自定义API引用、又在resources里重复定义和引用指向不一致的RestApi资源,否则会再次出现API资源冗余的问题 - 跨服务复用时,要确保所有服务引用的API所在区域、Stage配置保持一致,避免路由挂载到错误的环境中
内容的提问来源于stack exchange,提问作者jpizzo
相关产品推荐
相关产品推荐

