Diagnosticando e Solucionando Problemas do Provedor Terraform

Este tópico descreve como solucionar problemas comuns do provedor Terraform do Oracle Cloud Infrastructure (OCI).

Comece com Conceitos Básicos de Solução de Problemas e consulte as seguintes seções:

Conceitos Básicos de Solução de Problemas

Ao solucionar problemas ou obter suporte para o provedor Terraform do Oracle Cloud Infrastructure (OCI), geralmente é útil verificar primeiro o status dos serviços do OCI, a versão do Terraform e o provedor, além de ativar e coletar registro em log detalhado.

Dica

A verificação do status do serviço e da saída de log detalhado pode ajudar você a determinar se um problema está relacionado ao provedor Terraform ou ao serviço do OCI que o provedor está usando.

Consulte a lista de problemas comuns depois de começar com os princípios básicos.

Verificando Status e Interrupções dos Serviços do OCI

Para verificar o status mais recente e se há alguma interrupção no OCI, consulte Status do OCI.

Verificando as Versões do Terraform e do Provedor Terraform do OCI

Para verificar a versão do Terraform e do provedor Terraform do OCI, inicialize o Terraform por um diretório com suas configurações e execute o comando -version. Por exemplo:

terraform init
terraform -version

As versões são exibidas:

Terraform v0.12.20
+ provider registry.terraform.io/hashicorp/oci v3.95.0
Dica

As versões mais recentes do provedor Terraform do OCI incluem a versão do provedor em mensagens de erro.

A documentação do provedor Terraform do OCI reflete a versão mais recente. Você pode exibir a documentação de versões anteriores do provedor visitando a referência do HashiCorp e selecionando uma versão específica. Também é possível fazer download e instalar uma versão específica do provedor.

Registro em Log Detalhado do Provedor Terraform do OCI

Para obter a saída detalhada da console quando o provedor estiver em execução, preceda o comando Terraform com os flags TF_LOG e OCI_GO_SDK_DEBUG. Por exemplo:

TF_LOG=DEBUG OCI_GO_SDK_DEBUG=v terraform plan

O nível TF_LOG e os flags OCI_GO_SDK_DEBUG também podem ser definidos como variáveis de ambiente.

Repetições Automáticas

Ao aplicar, atualizar ou destruir um plano, o Terraform pode encontrar alguns erros intermitentes do OCI (como 429 ou 500) que podem ser bem-sucedidos na repetição. Por padrão, o provedor Terraform do OCI repete automaticamente essas operações por até 10 minutos. Os seguintes campos podem ser especificados no bloco provider para configurar melhor o comportamento de repetição:

  • disable_auto_retries - Desative repetições automáticas para erros repetíveis.
  • retry_duration_seconds - A duração mínima (em segundos) para repetir uma operação de recurso em resposta aos erros HTTP 429 e HTTP 500. A duração real da repetição pode ser um pouco maior em decorrência da instabilidade das operações de repetição. Esse valor será ignorado se o campo disable_auto_retries for definido como true.

Controle de Simultaneidade Usando Repetir Backoff e Jitter

Para diminuir o conflito entre operações paralelas nos serviços OCI, o provedor Terraform do OCI programa tentativas de repetição usando backoff quadrático e jitter completo. O backoff quadrático aumenta o intervalo máximo entre as tentativas de repetição subsequentes, enquanto o jitter completo seleciona aleatoriamente um intervalo de repetição dentro da faixa de backoff.

Por exemplo, o tempo de espera entre a primeira e a segunda tentativas é escolhido aleatoriamente entre 1 e 8 segundos. O tempo de espera entre a segunda e a terceira tentativas de repetição é escolhido aleatoriamente entre 1 e 18 segundos. Independentemente do número de tentativas de repetição, o tempo de intervalo de repetição é limitado após a 12ª tentativa em 288 segundos.

Observe que o campo retry_duration_seconds só afeta a duração da repetição em resposta a erros HTTP 429 e 500, visto que esses erros muito provavelmente resultarão em sucesso após uma longa duração da repetição. É improvável que outros erros HTTP (como 400, 401, 403, 404 e 409) sejam bem-sucedidos na repetição. O campo retry_duration_seconds não afeta o comportamento de repetição desses erros.

Problemas Comuns

Observação

Consulte Problemas Conhecidos de Tags para saber um problema conhecido com tags relacionadas ao Terraform.

Os Recursos São Destruídos ao Aplicar as Alterações

Os recursos existentes do OCI podem ser destruídos e recriados quando as configurações do Terraform tentam atualizar uma propriedade de recurso que não é atualizável. O Terraform avisa quando as alterações destruirão um recurso. Sempre execute terraform plan antes de aplicar alterações para ver quais recursos serão afetados. Consulte Alterações Destrutivas para obter mais informações.

Não é Possível Atualizar o Recurso Dependente

Às vezes, uma atualização de um recurso do OCI deve forçar o recurso a ser destruído e recriado, mas a dependência de outro recurso no recurso não permite a operação.

Por exemplo, talvez você queira fazer uma atualização para um recurso oci_core_instance_configuration, mas um pool de instâncias usa essa configuração de instância. A configuração da instância não pode ser excluída porque o pool de instâncias faz referência a ela em um argumento obrigatório.

Para contornar esse tipo de comportamento, você pode usar os meta-argumentos lifecycle e create_before_destroy no bloco de recursos.

Neste exemplo, o Terraform cria um segundo recurso oci_core_instance_configuration que inclui suas atualizações e, em seguida, designa a nova configuração de instância ao pool de instâncias relacionadas. Por fim, o Terraform destrói a configuração da instância original. Por exemplo:

resource "oci_core_instance_configuration" "test_instance_configuration" {
...

 lifecycle {
    create_before_destroy = true
  }
}

Consulte O Meta-Argumento lifecycle e Alterações Destrutivas para obter mais informações.

O Recurso Não Pode Ser Destruído ou Atualizado

Você pode impedir que um recurso do OCI seja destruído incluindo os metaargumentos lifecycle e prevent_destroy = true no bloco de recursos do arquivo de configuração do Terraform. A seguinte configuração, por exemplo, resulta em um bucket do serviço Object Storage que não pode ser destruído:

resource "oci_objectstorage_bucket" "test_bucket" {
  #Required
  compartment_id = var.tenancy
  name = "test"
  namespace = "exampleNamespace"

  lifecycle {
    prevent_destroy = true
  }
} 

Esse metaargumento impede o uso de terraform destroy. Como determinadas atualizações de configuração exigem que os recursos sejam destruídos para que possam ser aplicados, essa definição também pode tornar algumas atualizações impossíveis de serem aplicadas. Neste exemplo, name é uma propriedade que não pode ser atualizada sem destruir e recriar o recurso. Portanto, você não pode atualizar o nome do bucket sem remover ou alterar o metaargumento lifecycle.

Consulte O Metaargumento lifecycle para obter mais informações.

Não É Possível Cancelar a Definição do Argumento de Recurso

Muitos recursos do Oracle Cloud Infrastructure gerenciados pelo provedor Terraform do OCI aceitam argumentos de configuração opcionais. Uma vez definidos, seja durante a criação do recurso ou uma atualização subsequente, não é possível cancelar a definição desses argumentos informando uma string vazia ou removendo o argumento da configuração. As tentativas de cancelar a definição desses argumentos são ignoradas pelo Terraform.

A referência completa dos recursos e origens de dados suportados do provedor Terraform do OCI contém detalhes de uso, argumento e atributo. A referência completa está disponível em docs.oracle.com e Terraform Registry.

As origens de dados e os recursos são agrupados por serviço dentro da referência.

Referenciando Triggers em Metaargumentos de Ciclo de Vida

O Terraform v0.14 e mais recente pode exigir que você substitua variáveis globais em seus arquivos de configuração por uma combinação de variáveis locais e triggers. Para referenciar um trigger nos metaargumentos lifecycle e ignore_changes e evitar a execução da configuração nas operações subsequentes de aplicação do Terraform, referencie o trigger da seguinte forma:

resource "null_resource" "exampleB" {
  depends_on = [null_resource.exampleA]
  triggers = {
    os_user = var.os_user
  }
  lifecycle {
    ignore_changes = [
      triggers["os_user"]
    ]
  }

Não É Possível Excluir o Compartimento

Por padrão, o provedor Terraform não exclui um compartimento ao usar o comando destroy.

Defina o argumento enable_delete como true para que o provedor tente excluir o compartimento. Por exemplo:

resource "oci_identity_compartment" "test_compartment" {
    compartment_id = var.compartment_id
    description = var.compartment_description
    name = var.compartment_name

    enable_delete = true
}
Observação

Para destruir um compartimento, ele também deverá estar vazio. Use o argumento depends_on para garantir que quaisquer dependências ocultas sejam definidas. Consulte Recursos para obter mais informações.

Erro de "Timeout da Operação"

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error: Operation Timeout
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: timeout while waiting for state to become 'SUCCEEDED, FAILED, CANCELED' (last state: 'IN_PROGRESS', timeout: 15m)

Então, o serviço do OCI especificado está indicando que o recurso ainda não atingiu o estado esperado após a sondagem por algum tempo.

Talvez seja necessário aumentar o timeout da operação para que seu recurso continue sondando por mais tempo. Consulte Timeouts de Operação para obter detalhes sobre como fazer isso.

Erro de "Estado inesperado do Ciclo de Vida"

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error: Unexpected LifeCycle state
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: During deletion, Terraform expected the resource to reach state: TERMINATED, but the service reported unexpected state: RUNNING.
Resource OCID: exampleuniqueID
Suggestion: Please retry or contact support for help with service: <service>

Então, o serviço do OCI especificado encontrou um erro desconhecido. Tente novamente ou entre em contato com o suporte a respeito desse serviço.

Problemas da CLI do Terraform

Esta seção contém informações que tratam da instalação e da configuração da CLI do Terraform.

Erro "No such file" Após o Upgrade do Provedor Terraform do OCI

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error asking for user input: 1 error(s) occurred:

* provider.oci: dial unix /var/folders/6r/8fk5dmbj4_z3sl0mc_y_fhjw0000gn/T/plugin811254328|netrpc: connect: no such file or directory

É provável que você esteja usando uma versão do provedor Terraform do OCI que não seja compatível com o binário instalado do Terraform. Para as versões v3.x.x e mais recente do Provedor do OCI, é necessária uma versão mínima v.0.10.1 do Terraform.

Mensagem "TCP...i/o timeout" ao Estabelecer Conexão Via Proxy

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

* provider.oci: ... dial tcp 134.70.16.0:443: i/o timeout

Pode ser que você não tenha configurado corretamente suas definições de proxy. O provedor Terraform do OCI suporta as variáveis http_proxy, https_proxy e no_proxy em que as listas de inclusão ou exclusão podem ser definidas da seguinte forma:

export http_proxy=http://www.your-proxy.com:80/
export https_proxy=http://www.your-proxy.com:80/
export no_proxy=localhost,127.0.0.1

Mensagem de Erro "x509: certificate signed by unknown authority"

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error: Get https://iaas.<region>.oraclecloud.com/20160918/services: x509: certificate signed by unknown authority
  on ../modules/network/modules/main/main.tf line 3...

Verifique se o Terraform está usando certificados TLS confiáveis e se a cadeia de certificados é válida. Consulte Falha nas execuções do Terraform com o erro "x509: certificate signed by unknown authority" para obter mais informações. Se estiver usando o MacOS Catalina, consulte a seção MacOS do documento para obter mais detalhes sobre como resolver problemas de certificado.

Mensagem de Erro "Outdated GPG key...unable to verify new provider releases"

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Warning: registry.terraform.io: 
This version of Terraform has an outdated GPG key and is unable to verify new provider releases.
Please upgrade Terraform to at least <version> to receive new provider updates.
For details see: https://discuss.hashicorp.com/t/hcsec-2021-12-codecov-security-event-and-hashicorp-gpg-key-exposure/23512

Essa mensagem significa que o registro do Terraform está omitido as versões do provedor Terraform assinadas por uma nova chave GPG. A CLI do Terraform instalará a última versão do provedor Terraform do OCI que ele pode verificar com sucesso, que pode não ser a versão mais recente.

Para remover essa mensagem e garantir que você possa usar a versão mais recente do provedor Terraform do OCI, faça upgrade da CLI do Terraform para a release de manutenção mais recente disponível para a versão principal do Terraform que você está usando. Por exemplo, se você estiver usando o Terraform v0.12.21, faça upgrade para a versão disponível mais recente da v0.12.

Problemas do Provedor Terraform

Esta seção contém informações relacionadas à instalação e configuração do provedor Terraform do OCI.

Erro "NotAuthenticated" ao Usar Módulos

Se você estiver usando módulos e a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error: 401-NotAuthenticated, The required information to complete authentication was not provided or was incorrect.

Verifique se cada módulo declara seus próprios requisitos de provedor. Para obter mais informações, consulte Provedores nos Módulos.

Erro "NotAuthenticated"ao Usar o Terraform

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error: 401-NotAuthenticated
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current.
Service: <service>
Error Message: The required information to complete authentication was not provided or was incorrect.
OPC request ID: exampleuniqueID
Suggestion: Please retry or contact support for help with service: <service>
  • Verifique se você definiu corretamente user_ocid, tenancy_ocid, fingerprint e private_key_path.
  • Verifique se private_key_path está apontando para sua chave privada e não para a chave pública correspondente.
  • Verifique se você adicionou a chave pública correspondente à conta de usuário especificada com user_ocid.
  • Verifique se os pares de chaves públicas/privadas que você está usando estão no formato correto. Consulte Chaves Obrigatórias para obter detalhes sobre o formato correto e como gerar chaves.
  • Verifique se a conta de usuário faz parte de um grupo com as permissões apropriadas para executar as ações no plano que você está executando.
  • Verifique se sua Tenancy foi inscrita na Região que você está direcionando em seu plano.
  • Se você estiver usando módulos, verifique se cada módulo declara seus próprios requisitos de provedor. Para obter mais informações, consulte Provedores nos Módulos.

Mensagem "Can not create client, bad configuration: did not find a proper configuration for tenancy" ao Usar Aliases

Se a CLI do Terraform retornar uma mensagem como essa, poderá indicar um problema com seu ambiente:

Error: can not create client, bad configuration: did not find a proper configuration for tenancy

Se a configuração do provedor incluir um alias, os recursos deverão especificar explicitamente o alias do provedor usando provider = "oci.alias_name". Se um recurso não usar o alias para especificar o provedor, o Terraform criará um provedor padrão a ser usado com esses recursos. O provedor padrão carrega os valores de configuração das variáveis de ambiente ou o arquivo ~/.oci/config. Esses valores podem ser diferentes daqueles usados pelo seu provedor com alias e causar erro de configuração.

Remova o alias da configuração do provedor ou certifique-se de que cada recurso especifique o provedor pelo alias correto. Leia mais sobre como usar alias na documentação oficial do Terraform e consulte Configurando o Provedor para obter mais informações sobre como o Terraform usa variáveis de ambiente e o arquivo de configuração do OCI.

Mensagem de Erro "Field cannot be set"

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

* Error: "field_name": this field cannot be set

É provável que você esteja usando uma versão mais antiga do provedor Terraform do OCI e o campo que você está tentando definir foi liberado em uma versão mais recente. Use o comando a seguir para verificar a versão do seu provedor Terraform.

terraform -version

A documentação do provedor Terraform do OCI reflete a versão mais recente.

Mensagem de Erro "Could not get info about the first DbHome in the dbSystem" ao Importar db_home

Se o oci_database_db_system que está sendo importado não tiver um db_home principal, um placeholder vazio para db_home será definido no arquivo de estado do Terraform. Para manter as configurações consistentes com o estado importado, adicione à configuração um placeholder vazio para db_home. Por exemplo:

# Add this placeholder into your oci_database_db_system configuration to indicate that the primary db home is empty. 
db_home {
 database { 
  admin_password = "" 
  } 
}

Mensagem de Erro "Failed to query available provider packages" ao Executar a Descoberta de Recursos

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte ao usar a descoberta de recursos:

Failed to query available provider packages
 
Could not retrieve the list of available versions for provider hashicorp/oci:
the previously-selected version is no longer available

Então, você pode garantir que o Terraform use um binário do provedor local existente especificando a localização dele com a variável de ambiente provider_bin_path. Por exemplo:

export provider_bin_path=/Users/user/go/bin/

O Terraform tenta fazer download da versão mais recente do provedor Terraform do OCI quando você usa a descoberta de recursos.

Tags Padrão Excluídas na Aplicação

Às vezes, o provedor Terraform do OCI pode excluir inesperadamente os padrões de tag existentes de um recurso ao executar terraform apply. Esse problema afeta especialmente os padrões de tag automática Oracle-Tags.

Para contornar esse problema, você pode adicionar o atributo ignore_defined_tags ao bloco do provedor.

O atributo ignore_defined_tags permite listar as chaves das tags definidas que o Terraform ignorará como parte do plano ou aplicará. O atributo ignore_defined_tags só pode ser especificado no nível do provedor e tem um tamanho máximo permitido de 100. As tags fornecidas nesse atributo são ignoradas para todos os recursos nesse arquivo do Terraform.

No exemplo a seguir, "Oracle-Tags.CreatedOn" e "Oracle-Tags.CreatedBy" são as chaves no mapa defined_tags associadas a um recurso remoto:

provider "oci" {
    ignore_defined_tags = ["Oracle-Tags.CreatedBy", "Oracle-Tags.CreatedOn"]
}

Para obter mais informações, consulte Definições do Provedor e consulte o problema relacionado ao GitHub.

Erros de API de Serviços

Como o provedor Terraform interage com os serviços do OCI em seu nome, muitas mensagens de erro exibidas pelo provedor Terraform vêm diretamente dos serviços do OCI. A referência Erros de API lista os erros comuns retornados por todos os serviços.

As mensagens de erro de serviço retornadas pelo provedor Terraform do OCI incluem as seguintes informações:

  • Erro - o status HTTP e códigos de erro de API
  • Versão do provedor - a versão do provedor Terraform do OCI usada para fazer a solicitação
  • Serviço - o serviço do OCI que responde com o erro
  • Mensagem de erro - detalhes sobre o erro retornado pelo serviço
  • ID de solicitação do OPC - o ID da solicitação
  • Sugestão - próximas etapas sugeridas

Por exemplo:

Error: <http_code>-<api_error_code>
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: <error_message>
OPC request ID: exampleuniqueID
Suggestion: <next_steps>

Esta seção detalha alguns dos erros de serviço mais comumente retornados.

Erro "400-InvalidParameter"

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error: 400-InvalidParameter
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: <error_message>
OPC request ID: exampleuniqueID
Suggestion: Please update the parameter(s) in the Terraform config as per error message: <error_message>

Atualize o parâmetro especificado na mensagem de erro na configuração do Terraform para o recurso.

Erro "400-LimitExceeded"

Ao usar o Terraform, você poderá encontrar erros indicando que atingiu ou excedeu os limites de serviço de um recurso. Por exemplo:

Error: 400-LimitExceeded
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: Fulfilling this request exceeds the Oracle-defined limit for this tenancy for this resource type.
OPC request ID: exampleuniqueID
Suggestion: Request a service limit increase for this resource <service>

Para entender mais sobre seus limites de serviço do OCI e como solicitar um aumento de limite, consulte Limites de Serviço

Erro "404-NotAuthorized"

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error: 404-NotAuthorizedOrNotFound
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current.
Service: <service>
Error Message: Authorization failed or requested resource not found.
OPC request ID: exampleuniqueID
Suggestion: Either the resource has been deleted or service <service> need policy to access this resource. Policy reference: <link>

Verifique se a conta de usuário faz parte de um grupo com as permissões apropriadas para executar as ações no plano que você está executando. Consulte a Referência de Política do serviço para obter mais informações.

Erro "500-InternalError"

Se a CLI do Terraform retornar uma mensagem de erro como a seguinte:

Error: 500-InternalError
Provider version: <provider_version>, released on <release_date>. This provider is <n> updates behind to current. 
Service: <service>
Error Message: Internal error occurred
OPC request ID: exampleuniqueID
Suggestion: The service for this resource encountered an error. Please contact support for help with service <service>

O serviço respondeu à solicitação do provedor Terraform com um erro interno. Se você entrar em contato com o suporte para falar sobre esse problema, mencione as informações da mensagem.