如何通过Serverless框架为Azure Functions配置自定义域名与证书
解决方案
配置被清空的原因
sls deploy 执行时手动配置的APIM自定义域名被清空,核心原因是serverless-azure-functions插件默认开启apim: true后,每次部署会全量重写APIM实例的所有配置,手动在Azure Portal添加的自定义域名、证书等全局配置不在插件的部署清单中,因此会被覆盖。
方案1:直接在serverless.yml中配置自定义域名
将apim配置从布尔值改为对象,补充自定义域名、证书相关参数,实现全配置代码化,无需手动操作Azure Portal,适配CI/CD流程。修改后的配置参考:
service: my-service-${env:STAGE, 'develop'} configValidationMode: off provider: name: azure runtime: nodejs12 region: north-europe resourceGroup: My-Service-Group subscriptionId: MySubscriptionId stage: ${env:STAGE, 'develop'} apim: name: 你的APIM实例名称 # 若APIM和函数不在同一个资源组,需显式指定资源组 # resourceGroup: APIM资源组名称 customDomains: - name: 你的自定义域名,例如api.example.com certificatePath: ./本地PFX证书存储路径.pfx # 证书密码从环境变量读取,禁止明文写入配置文件 certificatePassword: ${env:APIM_CERT_PASSWORD} type: Proxy # 对应APIM代理端点类型 plugins: - serverless-azure-functions functions: graphql: handler: lib/azure.handler events: - http: true methods: - GET - POST authLevel: anonymous route: graphql apim: # 可选:配置该API在APIM中的路径、限流等规则 api: path: / displayName: GraphQL服务 - http: true direction: out name: "$return" route: graphql
方案2:禁用APIM全局配置覆盖,保留手动设置
如果不想把证书、域名配置放到代码仓库,可开启skipFullUpdate参数,插件仅会更新函数接口到APIM的映射规则,不会修改APIM本身的全局配置(包括手动添加的自定义域名、证书、全局策略等)。修改后的provider配置参考:
provider: name: azure runtime: nodejs12 region: north-europe resourceGroup: My-Service-Group subscriptionId: MySubscriptionId stage: ${env:STAGE, 'develop'} apim: name: 你的APIM实例名称 skipFullUpdate: true # 核心参数,禁止全量覆盖APIM全局配置
注意事项
- 方案1中证书密码严禁明文写入配置文件,需通过环境变量或者Azure Key Vault引用传递,避免密钥泄露
- 若配置不生效,请先升级
serverless-azure-functions插件到最新稳定版 - 当前使用的nodejs12 runtime已停止官方安全维护,建议升级到nodejs18及以上的LTS版本
内容的提问来源于stack exchange,提问作者Stefan H Singer
相关产品推荐
相关产品推荐

