Solucionar problemas comuns ao usar o Terraform no Azure

Este artigo lista problemas comuns e possíveis soluções ao usar o Terraform em Azure.

Se você encontrar um problema específico do Terraform, use um dos canais de suporte da comunidade da HashiCorp.

Canais de suporte específicos do HashiCorp Terraform

Não é possível listar o status de registro do provedor

Mensagem de erro:

Erro: não é possível listar o status de registro do provedor. Esse erro pode ocorrer devido a credenciais inválidas ou porque a entidade de serviço não tem permissão para usar a API Resource Manager. Erro do Azure: resources.ProvidersClient#List: Falha ao responder à solicitação: StatusCode=403 -- Erro original: autorest/azure: o serviço retornou um erro. Status=403 Code="AuthorizationFailed" Message="O cliente '00000000-0000-0000-0000-000000000000' com o ID do objeto '00000000-0000-0000-0000-000000000000' não tem autorização para realizar a ação 'Microsoft.Resources/subscriptions/providers/read' sobre o escopo '/subscriptions/00000000-0000-0000-0000-000000000000' ou o escopo é inválido." Se o acesso foi concedido recentemente, atualize suas credenciais."

Plano de fundo: Se você executar comandos terraform do Cloud Shell e definir determinadas variáveis de ambiente do Terraform/Azure, poderá ver conflitos. A tabela a seguir lista as variáveis de ambiente e os valores Azure que elas representam:

Variável de ambiente Valor do Azure
ARM_SUBSCRIPTION_ID ID de assinatura do Azure
ARM_TENANT_ID ID do locatário de conta Microsoft
ARM_CLIENT_ID ID do aplicativo da entidade de serviço Azure
ARM_CLIENT_SECRET Senha da entidade de serviço do Azure

Causa: No momento em que este texto foi escrito, o script do Terraform executado no Cloud Shell substitui as variáveis de ambiente ARM_SUBSCRIPTION_ID e ARM_TENANT_ID usando valores da assinatura atual do Azure. Como resultado, se o principal de serviço para o qual as variáveis de ambiente apontam não tiver permissões na assinatura atual do Azure, as operações do Terraform falharão.

Erro ao adquirir o bloqueio de estado

Mensagem de erro:

Erro: erro ao adquirir o bloqueio de estado; Mensagem de erro: ocorreram dois erros:
* O blob de estado já está bloqueado
* Os metadados do blob "terraformlockid" estavam vazios
O Terraform obtém um bloqueio de estado para evitar que o estado seja gravado por vários usuários ao mesmo tempo. Resolva o problema acima e tente novamente. Para a maioria dos comandos, você pode desabilitar o bloqueio com o sinalizador "-lock=false", mas isso não é recomendado.

Contexto: Se você estiver executando comandos Terraform em um arquivo de estado do Terraform e esse erro for a única mensagem exibida, as causas a seguir podem ser a causa. Esse erro se aplica a arquivos de estado local e remoto.

Causa: Há duas possíveis causas para esse erro. A primeira causa é que um comando do Terraform já está em execução usando o arquivo de estado e aplicou um bloqueio nesse arquivo, para que nada quebre. A segunda causa potencial é que ocorreu uma interrupção de conexão entre o arquivo de estado e a CLI quando os comandos estavam em execução. Essa interrupção geralmente ocorre quando você está usando arquivos de estado remoto.

Resolução: Primeiro, verifique se você ainda não está executando nenhum comando no arquivo de estado. Se você estiver trabalhando com um arquivo de estado local, verifique se você tem terminais executando comandos. Como alternativa, verifique os pipelines de implantação para identificar se algum processo em execução pode estar usando o arquivo de estado. Se essa condição não resolver o problema, é possível que a segunda causa tenha disparado o erro. Para um arquivo de estado remoto armazenado em um contêiner de conta Armazenamento do Azure, você pode localizar o arquivo e usar o botão Interromper concessão.

Captura de tela que mostra o botão Break lease do contêiner do Armazenamento do Azure.

Se você estiver usando outros back-ends para armazenar seu arquivo de estado, para obter recomendações, consulte a documentação da HashiCorp.

Erros de VPN

Para obter informações sobre como resolver erros de VPN, consulte o artigo, solucionar problemas de uma conexão VPN híbrida.

O Terraform planeja excluir e recriar uma conta de armazenamento

O Terraform pode planejar excluir e recriar uma conta de armazenamento do Azure depois que o Azure fizer alterações nessa conta de armazenamento fora do Terraform. Esse comportamento pode ocorrer durante uma conversão com suporte da redundância de uma conta do Armazenamento do Azure, em que account_replication_type cruza o limite entre o conjunto não zonal (LRS, GRS, RA-GRS) e o conjunto zonal (ZRS, GZRS, RA-GZRS).

Antes de aplicar o plano, examine as alterações propostas e confirme por que o Terraform considera a substituição da conta de armazenamento necessária. Recriar uma conta de armazenamento pode causar tempo de inatividade ou perda de dados do aplicativo.

Para reduzir este risco:

  • Desabilite a aprovação automática para implantações que gerenciam contas de armazenamento e examine cada terraform plan.
  • Configure prevent_destroy = true no bloco lifecycle do recurso da conta de armazenamento.
  • Antes de iniciar a conversão, adicione account_replication_type temporariamente a ignore_changes.
  • Após a conversão, execute terraform apply -refresh-only para atualizar o estado do Terraform e atualize a configuração do Terraform para corresponder à conta de armazenamento implantada.
  • Remova ignore_changes somente após a execução terraform plan e confirme se não há alterações inesperadas.

Para obter orientações detalhadas sobre conversão, consulte Evitar divergência do Terraform para recursos do Azure com estado.