如何在serverless.yml中统一配置跨函数共享CORS规则?
Serverless 全局复用CORS配置的实现方案
一、原生无插件实现(适合大部分场景)
1. 公共配置抽离 + 变量引用
这是最稳妥、兼容性最好的方案,不需要安装任何额外依赖,只需要把通用CORS规则抽到全局自定义配置块,所有函数的HTTP事件直接引用即可:
# 全局自定义配置块,所有CORS规则只需要在这里维护一次 custom: defaultCors: origin: '*' headers: - Content-Type - X-Amz-Date - Authorization - X-Api-Key - X-Amz-Security-Token - X-Amz-User-Agent functions: function1: handler: api.refresh events: - http: path: function1 method: post # 直接引用全局CORS配置,无需重复编写字段 cors: ${self:custom.defaultCors} function2: handler: api.other events: - http: path: function2 method: get cors: ${self:custom.defaultCors}
后续新增、修改CORS头字段时,只需要调整custom.defaultCors内的内容,所有引用的位置会自动同步生效。如果某个函数需要单独定制CORS规则(比如更换允许的来源),可以在对应函数的cors字段内局部覆盖配置,不会影响全局默认规则。
2. 纯YAML锚点复用
如果不想依赖Serverless的变量解析能力,也可以直接用YAML原生的锚点、别名语法实现配置复用,效果和上面的变量引用完全一致:
# 顶层定义CORS配置的YAML锚点 x-default-cors: &defaultCors origin: '*' headers: - Content-Type - X-Amz-Date - Authorization - X-Api-Key - X-Amz-Security-Token - X-Amz-User-Agent functions: function1: handler: api.refresh events: - http: path: function1 method: post # 通过YAML别名直接复用锚点配置 cors: *defaultCors
如果需要给单个函数做局部配置覆盖,可以结合YAML的合并语法实现:
cors: # 继承全局默认CORS配置 <<: *defaultCors # 仅覆盖需要自定义的字段 origin: 'https://your-specific-domain.com'
二、网关联动实现零侵入CORS配置(适合函数数量多的大型项目)
如果使用的是AWS API Gateway v2(HTTP API),可以直接在网关层面配置全局CORS规则,完全不需要在每个函数的事件定义里重复写CORS字段,还能把OPTIONS预检请求的处理直接交给网关,不会转发到Lambda函数,降低调用成本、提升响应速度:
provider: name: aws # 在HTTP API网关层直接定义全局CORS规则 httpApi: cors: allowOrigins: - '*' allowHeaders: - Content-Type - X-Amz-Date - Authorization - X-Api-Key - X-Amz-Security-Token - X-Amz-User-Agent # 所有函数的HTTP事件完全不需要额外配置cors字段 functions: function1: handler: api.refresh events: - httpApi: path: /function1 method: post function2: handler: api.other events: - httpApi: path: /function2 method: get
如果还在使用API Gateway v1(REST API)、无法切换到HTTP API的场景,可以通过轻量的事件默认值插件实现自动注入:插件会在部署前自动遍历所有函数的HTTP事件,把全局定义的CORS配置自动合并到每个事件的cors字段中,最终实现零配置复用的效果,配置形式和上面的全局配置一致,只是不需要在每个事件里手动引用CORS字段。
内容的提问来源于stack exchange,提问作者Zout
相关产品推荐
相关产品推荐

