Azure YAML流水线中Terraform二次Apply失败,状态文件未存入Blob存储
使用Azure YAML流水线结合Terraform部署Azure Blob存储时,首次从零部署可成功创建资源组、Blob存储等资源,但第二次部署失败,提示资源组已存在。第二次执行terraform plan时仍显示要创建旧资源,apply阶段必然失败。经检查,首次部署后的Terraform状态文件并未存储到Azure Blob容器中。
流水线配置
steps: - bash: | cd ./terraform terraform -version terraform init \ -backend-config="storage_account_name=$(tfcicd-blob-account-name-kv)" \ -backend-config="access_key=$(tfcicd-blob-key-kv)" \ -backend-config="container_name=$(terraformStateContainer)" \ -backend-config="key=$(terraformStateFile)" displayName: Terraform Init - bash: | cd ./terraform terraform plan \ -var-file=$(terraformVarFile) \ -out $(terraformPlanFile) displayName: Terraform Plan env: ARM_SUBSCRIPTION_ID: $(tfcicd-subscription-id-kv) ARM_CLIENT_ID: $(tfcicd-sp-clientid-kv) ARM_CLIENT_SECRET: $(tfcicd-client-secret-kv) ARM_TENANT_ID: $(tfcicd-sp-tenantid-kv) - bash: | cd ./terraform terraform apply -auto-approve $(terraformPlanFile) displayName: Terraform Apply env: ARM_SUBSCRIPTION_ID: $(tfcicd-subscription-id-kv) ARM_CLIENT_ID: $(tfcicd-sp-clientid-kv) ARM_CLIENT_SECRET: $(tfcicd-client-secret-kv) ARM_TENANT_ID: $(tfcicd-sp-tenantid-kv)
Terraform配置
在terraform/backend目录下有backend.tf文件,内容如下:
terraform { backend "azurerm" { } }
1. 检查backend.tf的存放路径
Terraform会自动加载当前工作目录下的.tf文件,你的backend.tf放在terraform/backend子目录中,而流水线执行terraform init时进入的是./terraform目录,此时Terraform无法自动读取子目录里的后端配置,导致后端未生效,状态文件默认存在本地(流水线执行完后本地状态被清理,下次部署无状态记录)。
解决:将backend.tf移动到terraform根目录下,确保terraform init时能读取到后端配置。
2. 验证流水线变量的正确性
- 查看
Terraform Init阶段的日志,确认storage_account_name、container_name等参数是否正确获取到值,有没有出现空值或占位符未替换的情况。 - 手动使用
access_key尝试访问目标Blob存储容器,验证密钥是否有效、权限是否正常。
3. 检查Terraform init的执行日志
查看Terraform Init步骤的完整日志,确认是否存在以下关键信息:
- 出现
Initializing the backend...的提示,且无报错。 - 显示
Successfully configured the backend "azurerm"! Terraform will automatically use this backend unless the backend configuration changes.的成功提示。
如果日志中没有这些内容,说明后端初始化未完成,需排查配置问题。
4. 确认状态文件存储容器的存在性
Terraform不会自动创建存储容器,需提前确认目标Azure Blob存储容器$(terraformStateContainer)是否已创建。如果容器不存在,terraform init会失败;若日志无报错,可能是变量引用错误导致指向了不存在的容器。
5. 检查流水线工作目录
确认流水线执行时cd ./terraform是否确实进入了Terraform配置文件所在的目录,避免因目录错误导致无法读取backend.tf或其他配置文件。
内容的提问来源于stack exchange,提问作者Auto geek

