求助:Terraform更新Azure Function App配置时随机删除部署的二进制文件
解决Terraform更新Azure Function App配置时删除部署二进制文件的问题
问题根源
当Terraform管理Azure Function App时,若未明确忽略由外部部署(如Azure DevOps)维护的部署相关属性,执行terraform apply时会将资源状态强制同步到代码定义的状态,覆盖外部推送的二进制文件。随机性出现的原因通常是:
- 部分配置修改会触发Function App的站点同步逻辑(如修改特定AppSettings),而部分不会
- 不同环境的
WEBSITE_ENABLE_SYNC_UPDATE_SITE等配置存在差异,同步行为不一致
具体解决方案
1. 扩展Lifecycle忽略规则
修改Terraform代码中的lifecycle块,加入所有与部署内容相关的属性,禁止Terraform干预外部部署的内容:
lifecycle { ignore_changes = [ # 忽略部署相关的应用设置 app_settings["WEBSITE_RUN_FROM_PACKAGE"], app_settings["WEBSITE_CONTENTSHARE"], app_settings["WEBSITE_CONTENTAZUREFILECONNECTIONSTRING"], app_settings["WEBSITE_ENABLE_SYNC_UPDATE_SITE"], # 忽略Linux运行时部署相关配置 site_config.linux_fx_version, ] }
2. 调整同步配置
若你的二进制文件通过Azure DevOps直接推送至Function App关联存储的$web容器,建议将WEBSITE_ENABLE_SYNC_UPDATE_SITE设置为false,避免自动同步清空内容。如果业务需要保留该设置,务必将其加入上述ignore_changes列表,防止Terraform覆盖。
3. 锁定存储账户配置
确保代码中storage_account_name和storage_account_access_key的值固定不变,避免Terraform更新时切换关联存储账户,导致原$web容器的二进制文件无法访问。若必须更新存储账户,需提前迁移内容,或把这两个属性加入ignore_changes。
4. 分离配置与部署管理(可选)
如果需要Terraform与Azure DevOps协同工作,可使用azurerm_function_app_deployment单独管理部署包,让主Function App资源仅负责配置:
resource "azurerm_function_app_deployment" "function_deployment" { count = length(var.function) function_app_id = azurerm_linux_function_app.function[count.index].id source_code_hash = filebase64sha256("path/to/deployment/package.zip") package_uri = "https://your-storage-account.blob.core.windows.net/deploy-packages/package.zip" }
此方式下,配置更新不会影响已部署的二进制文件。
内容的提问来源于stack exchange,提问作者admin
相关产品推荐
相关产品推荐

