Configurar Terraform e Yandex Cloud na máquina local para se conectar à nuvem

Terraform

Resumindo: no Linux, geralmente instala-se o Terraform, o CLI do Yandex Cloud (yc), realiza-se a inicialização e, em seguida, configuram-se as credenciais (token IAM ou chave de conta de serviço).

1. Terraform

Através do binário oficial (universal):

# exemplo para amd64; substitua a versão e arquitetura conforme necessário
TERRAFORM_VERSION=1.9.8
wget "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
unzip "terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
sudo mv terraform /usr/local/bin/
terraform version

Ou via gerenciador de pacotes (se você usar Ubuntu/Debian e tiver o repositório do HashiCorp configurado — como descrito na documentação do seu distributivo).

2. CLI do Yandex Cloud (yc)

curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
exec -l $SHELL   # ou abra um novo terminal
yc version

3. Perfil e acesso à nuvem

Interativamente (conveniente na primeira vez):

yc init

Serão necessários:

  • nome do perfil (escolha default ou crie um novo)
  • token OAuth (ele fornecerá um link para obter)
  • nome da nuvem (ele sugerirá uma opção — isso afeta o faturamento, ou seja, em qual nuvem será emitida a fatura)
  • nome da pasta (ele sugerirá uma opção)
  • zona padrão de computação (ele sugerirá criar uma das opções ru-central1-a...k)

Depois, o yc salvará o perfil; para verificar:

yc config list
yc resource-manager cloud list
yc resource-manager folder list

4. Variáveis para Terraform (provedor Yandex)

O provedor lê variáveis de ambiente padrão. São necessárias, no mínimo, identificadores e um dos métodos de autenticação.

Variante A — do usuário (token IAM do yc):

export YC_TOKEN=$(yc iam create-token)
export YC_CLOUD_ID="<seu-cloud-id>"
export YC_FOLDER_ID="<seu-folder-id>"

O token IAM é temporário; para uso prolongado, é mais conveniente usar uma conta de serviço.

Variante B — conta de serviço (chave JSON):

export YC_SERVICE_ACCOUNT_KEY_FILE="/absolute/path/to/key.json"
export YC_CLOUD_ID="<cloud-id>"
```export YC_FOLDER_ID=""<folder-id>

(O nome da variável para a chave do arquivo no provedor é exatamente esse, consulte a documentação do provedor Yandex.)

5. No diretório com a configuração do Terraform

cd /caminho/para/seu/projeto/terraform
terraform init
terraform plan

Observações práticas:

  • YC_TOKEN=$(yc iam create-token) deve ser atualizado periodicamente.
  • Para CI e “sempre funciona”, geralmente cria-se um conta de serviço com as permissões necessárias no diretório/cloud e uma chave estática no formato JSON.
  • cloud_id e folder_id podem ser obtidos do output de yc resource-manager cloud list / folder list ou da console do Yandex Cloud.

Bucket

Como eu obtenho access_key e secret_key para um bucket existente https://console.yandex.cloud/folders/b1g/storage/buckets/bucket?

No Yandex Object Storage, os buckets não possuem seus próprios access_key / secret_key. As chaves são emitidas para um conta de serviço (ou você está usando chaves já criadas para ele). O bucket, por sua vez, é vinculado via permissões IAM no bucket ou no diretório.

Via console

  1. Acesse o diretório b1gObject Storage → o bucket bucket.
  2. Verifique se existe uma conta de serviço que precisa acessar o bucket (ou crie uma nova).
  3. No bucket: Permissões de acesso → conceda uma função como storage.editor (ou a função já configurada em sua organização com acesso ao Object Storage) a essa conta de serviço.
  4. Acesse Contas de serviçoconta necessária → aba Chaves de acesso estáticas (ou “Chaves de acesso”) → Criar nova chave.
  5. Salve o ID da chave e o segredo — o segredo é exibido apenas uma vez.

O ID da chave = o que normalmente é chamado de access_key / AWS_ACCESS_KEY_ID nos clientes S3, o segredo = secret_key / AWS_SECRET_ACCESS_KEY.

Via CLI (yc)

Lista de contas de serviço no diretório:

yc iam service-account list --folder-id b1g

Crie uma chave estática (substitua <SERVICE_ACCOUNT_ID> pelo ID da conta de serviço necessária):

yc iam access-key create --service-account-id <SERVICE_ACCOUNT_ID>

Na resposta, serão exibidos key_id e secret — essa é a dupla para o API S3.

As permissões sobre o bucket devem ser concedidas previamente (função no recurso do bucket ou no diretório), por exemplo, storage.editor no bucket — via console ou API IAM; em cenários típicos, muitas vezes é suficiente conceder a função no diretório, se for o padrão em sua organização.

Importante

  • O segredo existente não pode ser “revisado” novamente — apenas criar uma nova chave e revogar a antiga, se necessário.
  • Para o estado do Terraform no S3, use as mesmas chaves + endpoint https://storage.yandexcloud.net e região ru-central1 (ou sua região).

A lógica oficial está descrita na documentação do Yandex Cloud sobre chaves de acesso estáticas e acesso ao Object Storage via API S3.


Repositório local

Entre na pasta com o repositório, use a chave da conta de serviço para inicializar o repositório Terraform na pasta:

terraform init \
  -backend-config="access_key=<key_id>" \
  -backend-config="secret_key=<secret>"

Assim, você vinculará a pasta no cloud com a local.


Restrições do Hashicorp

Se você receberterraform init -backend-config=“access_key=YCA” -backend-config=“secret_key=YCN”
Inicializando o backend…

Configuração do backend “s3” concluída com sucesso! O Terraform usará automaticamente este backend, a menos que a configuração do backend seja alterada.
Inicializando plugins de provedor…

  • Buscando a versão mais recente do yandex-cloud/yandex…
  • Buscando versões compatíveis de hashicorp/null com “~> 3.2”…
  • Buscando a versão mais recente do hashicorp/local…
  • Instalando yandex-cloud/yandex v0.200.0…
  • Instalado yandex-cloud/yandex v0.200.0 (assinado com chave E40F590B50BB8E40)
    Provedores de parceiros e comunidade são assinados pelos seus desenvolvedores.
    Se você quiser saber mais sobre assinatura de provedores, pode ler aqui:
    Plugin signatures | Terraform | HashiCorp Developer

    │ Erro: Falha ao consultar pacotes de provedores disponíveis

    │ Não foi possível recuperar a lista de versões disponíveis para o provedor hashicorp/null: o repositório
    │ registry registry.terraform.io não possui um provedor chamado
    registry.terraform.io/hashicorp/null

    │ Todos os módulos devem especificar seus required_providers para que consumidores externos recebam os
    │ provedores corretos ao usar um módulo. Para ver quais módulos atualmente dependem de
    │ hashicorp/null, execute o seguinte comando:
    │ terraform providers


    │ Erro: Falha ao consultar pacotes de provedores disponíveis

    │ Não foi possível recuperar a lista de versões disponíveis para o provedor hashicorp/local: o repositório
    │ registry registry.terraform.io não possui um provedor chamado
    registry.terraform.io/hashicorp/local

    │ Todos os módulos devem especificar seus required_providers para que consumidores externos recebam os
    │ provedores corretos ao usar um módulo. Para ver quais módulos atualmente dependem de
    │ hashicorp/local, execute o seguinte comando:
    │ terraform providers
Execute os passos abaixo.

### O que está acontecendo

O `yandex-cloud/yandex` foi baixado, mas **`hashicorp/null`** e **`hashicorp/local`** não foram. Isso acontece quando o **`registry.terraform.io` está indisponível** (rede, DNS, política) ou responde incorretamente: o Terraform então informa que o provedor "não existe".

### O que fazer no seu ambiente

1. **Espelho do Yandex Cloud** — copie o arquivo de configuração do Terraform para o diretório pessoal (copie o `terraform.rc.example` do repositório):

   ```bash
   cp ~/terraform.rc.example ~/.terraformrc

Nele, é definido https://terraform-mirror.yandexcloud.net/ para registry.terraform.io/*/*, conforme descrito na documentação do Yandex Cloud.

  1. Repita:

    cd ~/yc-cloud
    terraform init
    
  2. No código, foi adicionado explicitamente o provedor local no arquivo provider.tf (anteriormente havia apenas null), para fixar as versões em um único local.

Se você precisar de acesso direto sem espelho: verifique seu VPN/proxy e confirme se curl -sI https://registry.terraform.io está acessível.$ terraform init -backend-config=“access_key=YCA” -backend-config=“secret_key=YCN”
Inicializando o backend…
Inicializando plugins de provedor…

  • Encontrando versões compatíveis de hashicorp/null com “~> 3.2”…
  • Encontrando versões compatíveis de hashicorp/local com “~> 2.5”…
  • Encontrando a versão mais recente de yandex-cloud/yandex…
  • Instalando yandex-cloud/yandex v0.200.0…
  • Instalado yandex-cloud/yandex v0.200.0 (sem autenticação)
  • Instalando hashicorp/null v3.2.4…
  • Instalado hashicorp/null v3.2.4 (sem autenticação)
  • Instalando hashicorp/local v2.8.0…
  • Instalado hashicorp/local v2.8.0 (sem autenticação)

O Terraform criou um arquivo de bloqueio .terraform.lock.hcl para registrar as seleções de provedores que ele fez acima. Inclua este arquivo em seu repositório de controle de versão para que o Terraform possa garantir que faça as mesmas seleções por padrão quando você executar “terraform init” no futuro.


│ Aviso: Informações incompletas no arquivo de bloqueio para provedores

│ Devido aos métodos personalizados de instalação de provedores, o Terraform foi forçado a calcular
│ checksums locais para os seguintes provedores:
│ - hashicorp/local
│ - hashicorp/null
│ - yandex-cloud/yandex

│ O arquivo atual .terraform.lock.hcl só inclui checksums para linux_amd64, portanto, o Terraform
│ executado em outra plataforma falhará ao instalar esses provedores.

│ Para calcular checksums adicionais para outra plataforma, execute:
│ terraform providers lock -platform=linux_amd64
│ (onde linux_amd64 é a plataforma a ser gerada)

O Terraform foi inicializado com sucesso!

Você agora pode começar a trabalhar com o Terraform. Tente executar “terraform plan” para ver
quais alterações são necessárias para sua infraestrutura. Todos os comandos do Terraform agora devem funcionar.

Se você definir ou alterar módulos ou configurações de backend para o Terraform,
execute novamente este comando para re-inicializar seu diretório de trabalho. Se você esquecer, outros
comandos detectarão isso e lembrarão você de fazê-lo, se necessário.


# Plano e aplicação do Terraform

terraform plan -input=false -var-file=count_vars.vars -out=tfplan
terraform apply -auto-approve tfplan
terraform destroy -auto-approve -var-file=“count_vars.vars”