如何在CI/CD流程中自动将Azure函数定义导入API Management
Azure Functions 自动导入APIM的CD流水线落地方案
你之前用C# OpenAPI库手动维护端点定义的方案属于绕路,完全没必要。门户点按钮导入函数应用到APIM的操作没有专属的独立CLI/PowerShell封装,但底层是调用APIM的官方管理接口,直接拉取Functions运行时自动生成的OpenAPI定义写入,完全可以用原生Azure CLI在流水线里复刻,和门户操作效果100%一致,不需要额外维护代码里的OpenAPI注解。
核心逻辑
Azure Functions v3及以上版本的运行时默认内置OpenAPI自动生成能力,门户导入时不会读取你代码里手写的OpenAPI特性或注释,而是直接调用运行时的托管接口拉取全量端点信息,再同步到APIM,整个过程不需要修改业务代码。
具体操作步骤
- 开启函数运行时的内置OpenAPI开关,零代码改动:
在函数应用的应用设置中添加配置项OpenApi__Enabled,值为true即可,这个配置可以直接在CD流水线部署函数的步骤里一并设置,不需要改项目代码。 - 在Azure DevOps的CD流水线中,函数部署完成后添加Azure CLI任务,执行以下逻辑:
- 先升级APIM扩展,确保版本支持原生Function App导入参数:
az extension add --name apim --upgrade - 执行导入操作,不需要提前生成、存储任何OpenAPI文件,APIM会自动完成和函数侧的鉴权、拉取、写入全流程:
# 以下变量可直接绑定DevOps流水线内置变量、前序部署步骤的输出值 APIM_SERVICE_NAME="<你的APIM实例名称>" RESOURCE_GROUP="<资源组名称>" FUNC_APP_NAME="<函数应用名称>" API_VERSION_TAG=$(Build.BuildId) # 可直接用流水线构建号做API版本标识 # 自动获取函数应用的资源ID FUNC_RES_ID=$(az functionapp show -n $FUNC_APP_NAME -g $RESOURCE_GROUP --query id -o tsv) # 首次创建API时执行 az apim api create \ --service-name $APIM_SERVICE_NAME \ -g $RESOURCE_GROUP \ --api-id "func-app-api" \ --api-revision $API_VERSION_TAG \ --display-name "函数应用API" \ --path "func" \ --protocols https \ --source-function-app $FUNC_RES_ID \ --subscription-required true # 后续更新已有API时,把create替换为import即可,参数保持一致
- 先升级APIM扩展,确保版本支持原生Function App导入参数:
- 给流水线绑定的Azure服务连接配置最小权限:服务主体授予函数应用的读取权限、APIM实例的API编辑权限即可正常运行。
可选优化项
- 需要灰度发布时,可在导入命令中加
--is-current false参数,先将新版本导入为非线上修订版,验证通过后再切流 - 如果你习惯用基础设施即代码的方式部署,也可以用Bicep/ARM模板定义APIM的API资源,配置源为函数应用的内置OpenAPI端点,逻辑和CLI调用完全一致
- 不需要引入任何第三方OpenAPI类库,也不需要在每次新增/修改函数时同步更新注解,所有API定义由函数运行时在部署后自动生成,和门户读取的数据源完全相同。

内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

