Задача Azure Pipeline TerraformCLI пытается воссоздать уже существующий ресурс

Я пытаюсь создать лазурный конвейер с помощью Terraform. Но когда я запустил это в первый раз, он создал половину ресурсов и не смог применить шаг. Когда я исправил шаги, это не удалось с ошибкой ниже.

      Error: A resource with the ID "/subscriptions/2c13ad21-ae92-4e09-b64f-2e24445dc076/resourceGroups/apim-resource-gp" already exists - to be managed via Terraform this resource needs to be imported into the State. Please see the resource documentation for "azurerm_resource_group" for more information.
│ 
│   with module.resource_gp.azurerm_resource_group.apim_rg,
│   on resourcegroup/resource-group.tf line 1, in resource "azurerm_resource_group" "apim_rg":
│    1:  resource "azurerm_resource_group" "apim_rg" {

Здесь я заметил проблему: шаг плана снова создает файл плана, в котором говорится, что все ресурсы должны быть «созданы», а не пропущен уже созданный ресурс. Другое наблюдение заключается в том, что мой файл tfstate, который должен был быть создан в учетной записи хранения, не был создан. Но я не могу понять, что здесь пошло не так. Вставка моего azure-pipelines.yaml

лазурные конвейеры.yaml

      # Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
variables:
  tf_version: "latest"
  tf_state_rg: "blogpost-tfstate-rg"
  tz_state_location: "centralus"
  tf_state_sa_name: "apimstrgaccount"
  tf_state_container_name: "tfstate"
  tf_state_tags: ("env=blogpost-terraform-devops-pipeline" "deployedBy=devops")
  tf_environment: "dev"
  tf_state_sku: "Standard_LRS"
  SUBSCRIPTION_NAME: "pipeline-terraform"
trigger:
- main

pool:
  vmImage: ubuntu-latest

steps:
  - task: terraformInstaller@0
    displayName: "Install Terraform $(tf_version)"
    inputs:
      terraformVersion: "$(tf_version)"
  - task: TerraformCLI@0
    inputs:
      command: "init"
      backendType: "azurerm"
      backendServiceArm: "$(SUBSCRIPTION_NAME)"
      ensureBackend: true
      backendAzureRmResourceGroupName: "$(tf_environment)-$(tf_state_rg)"
      backendAzureRmResourceGroupLocation: "$(tz_state_location)"
      backendAzureRmStorageAccountName: "$(tf_state_sa_name)"
      backendAzureRmStorageAccountSku: "$(tf_state_sku)"
      backendAzureRmContainerName: $(tf_state_container_name)
      backendAzureRmKey: "$(tf_environment).terraform.tstate"
    displayName: "Run > terraform init"

  - task: TerraformCLI@0
    inputs:
      command: "validate"
      environmentServiceName: "$(SUBSCRIPTION_NAME)"
    displayName: "Run > terraform validate"

  - task: TerraformCLI@0
    displayName: 'terraform plan'
    inputs:
      command: plan
      publishPlanResults: "$(SUBSCRIPTION_NAME)"
      environmentServiceName: "$(SUBSCRIPTION_NAME)"
      commandOptions: '-out=$(System.DefaultWorkingDirectory)/terraform.tfplan -detailed-exitcode'

  - task: TerraformCLI@0
    displayName: 'terraform apply'
    condition: and(succeeded(), eq(variables['TERRAFORM_PLAN_HAS_CHANGES'], 'true'))
    inputs:
      command: apply
      environmentServiceName: "$(SUBSCRIPTION_NAME)"
      commandOptions: '$(System.DefaultWorkingDirectory)/terraform.tfplan'

1 ответ

Я столкнулся с подобной ошибкой:resource with the ID "/subscriptions/xxxx/resourceGroups/<rg>" already exists - to be managed via Terraform this resource needs to be imported into the State. Please see the resource documentation for "azurerm_resource_group" for more informationкогда я пытался создать конвейер Terraform в azure devops.

Конвейер devops не мог найти состояние в пользовательском интерфейсе Azure, и у меня даже был установлен этот поставщик azure_rm.

      terraform {
  required_providers {
   
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=3.0.2"
      
    }

  }

Ошибка возникает, когда состояние терраформирования может не совпадать с реальным состоянием.

  • У меня есть этот файл terraform.tfstate, где текущее состояние хранится в локальном файле. Но все же это происходило. Но когда я попытался добавить бэкэнд terraform в файл «main.tf», файл выполнился без этой ошибки.

Попробуйте без значений, как показано ниже.

      terraform {
  backend "azurerm" {
    resource_group_name = ""
    storage_account_name = "" 
    container_name       = "" 
    key                  = ""  
  }
}

Или укажите значения:

      terraform {
  backend "azurerm" {
    resource_group_name      = "<rg>"
    storage_account_name     = "<give acct >"
    container_name           = "terraform"
    key                      = "terraform.tfstate"
  }

И состояние блокирует состояние терраформирования для сохранения в учетной записи хранения Azure.

Также попробуйте импортировать состояние, используяterraform import <terraform_id> <azure_resource_id>