如何通过Terraform CLI更新存储Blob内容并重部署函数应用代码
解决Terraform更新存储Blob及函数应用代码的问题
问题原因
Terraform 默认仅跟踪 source 参数的文件路径,不会校验文件内容的变化。因此即使本地 sample-func.zip 内容更新,只要文件名不变,Terraform 就会认为资源状态无变化,不会触发Blob更新。
解决方案
1. 让Terraform感知Blob内容变化
修改 azurerm_storage_blob 资源块,添加文件哈希校验参数,当文件内容变化时触发Blob更新:
resource "azurerm_storage_blob" "function_code" { name = "sample-func.zip" storage_account_name = azurerm_storage_account.st-func.name storage_container_name = azurerm_storage_container.container-deploy.name type = "Block" source = "sample-func.zip" # 通过文件MD5哈希检测内容变化,触发Blob更新 content_md5 = filemd5("sample-func.zip") }
2. 触发函数应用重部署
Blob更新后,函数应用不会自动拉取新代码,需通过以下方式触发重部署:
方法一:通过应用设置触发重启(推荐)
在函数应用资源中添加依赖于Blob哈希的应用设置,当Blob更新时,该设置值变化会触发函数应用重启并拉取新代码:
resource "azurerm_function_app" "example" { # 保留原有配置(如name、resource_group_name、storage_account_name等) app_settings = { # 指向Blob的包地址 "WEBSITE_RUN_FROM_PACKAGE" = "https://${azurerm_storage_account.st-func.name}.blob.core.windows.net/${azurerm_storage_container.container-deploy.name}/${azurerm_storage_blob.function_code.name}" # 用Blob的MD5作为版本标识,值变化时触发函数应用更新 "WEBSITE_RUN_FROM_PACKAGE_VERSION" = azurerm_storage_blob.function_code.content_md5 } }
方法二:通过本地执行命令重启函数应用
在Blob资源中添加local-exec provisioner,当Blob更新时调用Azure CLI重启函数应用:
resource "azurerm_storage_blob" "function_code" { name = "sample-func.zip" storage_account_name = azurerm_storage_account.st-func.name storage_container_name = azurerm_storage_container.container-deploy.name type = "Block" source = "sample-func.zip" content_md5 = filemd5("sample-func.zip") provisioner "local-exec" { command = "az functionapp restart --name ${azurerm_function_app.example.name} --resource-group ${azurerm_resource_group.example.name}" # 仅在Blob创建/更新时执行 when = create } }
3. 执行更新操作
修改配置后,运行以下Terraform命令即可完成Blob更新与函数应用重部署:
terraform plan terraform apply
内容的提问来源于stack exchange,提问作者some_random_dude
相关产品推荐
相关产品推荐

