Resolver problemas comuns ao usar o Terraform no Azure

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

Se encontrar um problema específico do Terraform, utilize um dos canais de apoio comunitário da HashiCorp.

Canais de suporte específicos para Terraform da HashiCorp

Não é possível indicar o estado do registo do prestador

Mensagem de erro:

Erro: Não é possível indicar o estado do registo do prestador. Este erro pode ocorrer devido a credenciais inválidas ou porque o principal do serviço não tem permissão para usar a API do Resource Manager. Erro do Azure: resources.ProvidersClient#List: Falha na resposta ao pedido: StatusCode=403 -- Erro original: autorest/azure: o serviço devolveu 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 executar a ação 'Microsoft.Resources/subscriptions/providers/read' sobre o âmbito '/subscriptions/00000000-0000-0000-0000-000000000000' ou o âmbito é inválido. Se o acesso tiver sido concedido recentemente, atualize as credenciais."

Contexto: Se executares comandos Terraform a partir da Cloud Shell e definires certas variáveis de ambiente Terraform/Azure, podes encontrar conflitos. A tabela seguinte lista as variáveis de ambiente e os valores do Azure que representam:

Variável de ambiente Valor do Azure
ARM_SUBSCRIPTION_ID ID de subscrição do Azure
ARM_TENANT_ID ID do inquilino da conta Microsoft
ARM_CLIENT_ID ID da aplicação do principal de serviço do Azure
ARM_CLIENT_SECRET Palavra-passe do principal de serviço do Azure

Causa: À data em que este texto foi escrito, o script do Terraform que é executado no Cloud Shell substitui as variáveis de ambiente ARM_SUBSCRIPTION_ID e ARM_TENANT_ID utilizando os valores da subscrição atual do Azure. Como resultado, se o principal de serviço referenciado pelas variáveis de ambiente não tiver direitos sobre a subscrição atual do Azure, as operações do Terraform falham.

Erro na aquisição do bloqueio de estado

Mensagem de erro:

Erro: Erro ao adquirir o bloqueio de estado; Mensagem de erro: Ocorreram 2 erros:
* o blob de estado já está bloqueado
* metadados do blob "terraformlockid" estavam vazios
O Terraform obtém um bloqueio do estado para impedir que o estado seja escrito por vários utilizadores ao mesmo tempo. Por favor, resolva o problema acima e tente novamente. Para a maioria dos comandos, podes desativar o bloqueio com a flag "-lock=false", mas isso não é recomendado.

Contexto: Se estiver a executar comandos Terraform num ficheiro de estado Terraform e esta mensagem for a única que aparece, as seguintes causas podem aplicar-se. Este erro aplica-se a ficheiros de estado locais e remotos.

Causa: Existem duas possíveis causas para este erro. A primeira causa é que já está em execução um comando do Terraform sobre o ficheiro de estado e que esse comando impôs um bloqueio ao ficheiro, para que nada se corrompa. A segunda causa potencial é que ocorreu uma interrupção de ligação entre o ficheiro de estado e a CLI quando os comandos estavam a correr. Esta interrupção ocorre mais frequentemente quando está a usar ficheiros de estado remotos.

Resolução: Primeiro, certifique-se de que não está a executar nenhum comando contra o ficheiro de estado. Se estiveres a trabalhar com um ficheiro de estado local, verifica se tens terminais a executar algum comando. Alternativamente, verifica os teus pipelines de implementação para ver se algo em execução pode estar a usar o ficheiro de estado. Se esta condição não resolver o problema, é possível que a segunda causa tenha desencadeado o erro. Para um ficheiro de estado remoto guardado num contentor de conta Armazenamento do Azure, pode localizar o ficheiro e usar o botão Quebrar arrendamento.

Captura de ecrã que mostra o botão Quebrar arrendamento do contentor Armazenamento do Azure.

Se estiver a usar outros backends para armazenar o seu ficheiro de estado, para recomendações, consulte a documentação da HashiCorp.

Erros de VPN

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

A Terraform planeia eliminar e recriar uma conta de armazenamento

A Terraform pode planear apagar e recriar uma conta de armazenamento Azure depois de o Azure alterar a conta de armazenamento fora da Terraform. Este comportamento pode ocorrer durante uma conversão suportada da redundância de uma conta do Armazenamento do Azure, em que account_replication_type atravessa o limite entre o conjunto sem zonas (LRS, GRS, RA-GRS) e o conjunto com zonas (ZRS, GZRS, RA-GZRS).

Antes de aplicar o plano, reveja as alterações propostas e confirme porque é que a Terraform considera necessária a substituição da conta de armazenamento. Recriar uma conta de armazenamento pode causar inatividade de aplicações ou perda de dados.

Para reduzir este risco:

  • Desative a aprovação automática para implementações que gerem contas de armazenamento e reveja cada terraform plan.
  • Configura 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, corre terraform apply -refresh-only para atualizar o estado do Terraform e depois atualiza a configuração do Terraform para corresponder à conta de armazenamento implementada.
  • Remova ignore_changes apenas depois de correr terraform plan e confirmar que não há alterações inesperadas.

Para obter orientações detalhadas sobre conversão, consulte Evitar o desvio do Terraform em recursos do Azure com estado.