Configurar Terraform y Yandex Cloud en la máquina local para conectarse a la nube

Terraform

Resumen: En Linux, generalmente se instalan Terraform, la CLI de Yandex Cloud (yc), se realiza la inicialización, y luego se configuran las credenciales (token IAM o clave de cuenta de servicio).

1. Terraform

A través del binario oficial (universalmente):

# Ejemplo para amd64; sustituya la versión y arquitectura si es necesario
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

O mediante un gestor de paquetes (si usas Ubuntu/Debian y tienes configurado el repositorio de HashiCorp — como se indica en la documentación de tu distribución).

2. CLI de Yandex Cloud (yc)

curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
exec -l $SHELL   # o abre un nuevo terminal
yc version

3. Perfil y acceso a la nube

Interactivamente (cómodo en la primera vez):

yc init

Se necesitarán:

  • Nombre de perfil (elige default o crea uno nuevo)
  • Token OAuth (te proporcionará un enlace para obtenerlo)
  • Nombre de la nube (te sugerirá elegir uno — esto determinará el billing, es decir, a qué nube se facturará)
  • Nombre de la carpeta (te sugerirá elegir uno)
  • Zona de cálculo predeterminada (te sugerirá crear una de la lista ru-central1-a...k)

Después, yc guardará el perfil; para verificarlo:

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

4. Variables para Terraform (proveedor de Yandex)

El proveedor lee variables de entorno estándar. Mínimamente se necesitan identificadores y una forma de autenticación.

Opción A — desde el usuario (token IAM de yc):

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

El token IAM es de corta duración; para un uso prolongado, es más conveniente usar una cuenta de servicio.

Opción B — cuenta de servicio (clave JSON):

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

(Nombre de la variable para la clave del archivo en el proveedor — exactamente este, consulte la documentación del proveedor Yandex.)

5. En el directorio con la configuración de Terraform

cd /path/to/your/terraform/project
terraform init
terraform plan

Notas prácticas:

  • YC_TOKEN=$(yc iam create-token) debe actualizarse periódicamente.
  • Para CI y “siempre funciona”, normalmente se crea un cuenta de servicio con los roles necesarios en el catálogo/nube y una clave estática en formato JSON.
  • cloud_id y folder_id pueden obtenerse del resultado de yc resource-manager cloud list / folder list o de la consola de Yandex Cloud.

Bucket

¿Cómo puedo obtener access_key y secret_key para un bucket existente https://console.yandex.cloud/folders/b1g/storage/buckets/bucket?

En Yandex Object Storage, el bucket no tiene sus propios access_key / secret_key. Las claves se asignan al cuenta de servicio (o se usan claves ya creadas para él). El bucket se vincula mediante permisos IAM sobre el bucket o el catálogo.

A través de la consola

  1. Abra el catálogo b1gObject Storage → el bucket bucket.
  2. Asegúrese de que exista un cuenta de servicio al que se le necesita acceso al bucket (o créelo).
  3. En el bucket: Permisos de acceso → otorgue un rol como storage.editor (o un rol ya configurado con acceso a Object Storage) a este cuenta de servicio.
  4. Vaya a Cuentas de serviciocuenta necesaria → pestaña Claves de acceso estáticas (o “Claves de acceso”) → Crear nueva clave.
  5. Guarde el identificador de la clave y el secreto — el secreto solo se muestra una vez.

El identificador de la clave = lo que normalmente se llama access_key / AWS_ACCESS_KEY_ID en los clientes S3, el secreto = secret_key / AWS_SECRET_ACCESS_KEY.

A través de CLI (yc)

Lista de cuentas de servicio en el catálogo:

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

Crear una clave estática (sustituya id de la cuenta de servicio adecuada):

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

En la respuesta se mostrarán key_id y secret — esta es la pareja para el API S3.

Los permisos sobre el bucket se recomienda otorgar previamente (rol sobre el recurso del bucket o el catálogo), por ejemplo, storage.editor sobre el bucket — mediante la consola o API IAM; para escenarios típicos, a menudo basta con el rol sobre el catálogo, si es así en su organización.

Importante

  • No se puede volver a ver un secreto existente — solo se puede crear una nueva clave y revocar la antigua si es necesario.
  • Para el estado de Terraform en S3, se usan las mismas claves más el endpoint https://storage.yandexcloud.net y la región ru-central1 (o su región).

La lógica oficial se describe en la documentación de Yandex Cloud sobre claves de acceso estáticas y el acceso a Object Storage mediante el API S3.

Repositorio local

Acceda al directorio con el repositorio, use la clave del cuenta de servicio para inicializar el repositorio Terraform en la carpeta:

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

De esta forma, vinculará la carpeta en la nube con la local.

Restricciones de Hashicorp

Si obtieneterraform init -backend-config=“access_key=YCA” -backend-config=“secret_key=YCN”
Inicializando el backend…

¡Configurado correctamente el backend “s3”! Terraform lo usará automáticamente a menos que la configuración del backend cambie.
Inicializando plugins de proveedor…

  • Buscando la última versión de yandex-cloud/yandex…
  • Buscando versiones de hashicorp/null que coincidan con “~> 3.2”…
  • Buscando la última versión de hashicorp/local…
  • Instalando yandex-cloud/yandex v0.200.0…
  • Instalado yandex-cloud/yandex v0.200.0 (firmado con clave autógrafa, ID de clave E40F590B50BB8E40)
    Los proveedores de socios y comunidad están firmados por sus desarrolladores.
    Si deseas saber más sobre la firma de proveedores, puedes leerlo aquí:
    Plugin signatures | Terraform | HashiCorp Developer

    │ Error: Falló la consulta de paquetes de proveedores disponibles

    │ No se pudo recuperar la lista de versiones disponibles para el proveedor hashicorp/null: el registro
    registry.terraform.io no tiene un proveedor llamado
    registry.terraform.io/hashicorp/null

    │ Todos los módulos deben especificar sus required_providers para que los consumidores externos obtengan los
    │ proveedores correctos al usar un módulo. Para ver qué módulos actualmente dependen de
    │ hashicorp/null, ejecuta el siguiente comando:
    │ terraform providers


    │ Error: Falló la consulta de paquetes de proveedores disponibles

    │ No se pudo recuperar la lista de versiones disponibles para el proveedor hashicorp/local: el registro
    registry.terraform.io no tiene un proveedor llamado
    registry.terraform.io/hashicorp/local

    │ Todos los módulos deben especificar sus required_providers para que los consumidores externos obtengan los
    │ proveedores correctos al usar un módulo. Para ver qué módulos actualmente dependen de
    │ hashicorp/local, ejecuta el siguiente comando:
    │ terraform providers
Realice los pasos siguientes.

### ¿Qué está pasando?

`yandex-cloud/yandex` se ha descargado, pero **`hashicorp/null`** y **`hashicorp/local`** no. Esto ocurre cuando **`registry.terraform.io` no está disponible** (red, DNS, política) o responde incorrectamente: Terraform entonces indica que el proveedor "no existe".

### ¿Qué hacer en su caso?

1. **Espejo de Yandex Cloud** — copie el archivo de configuración de Terraform en su directorio de inicio (copiado desde el repositorio `terraform.rc.example`):

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

En él se establece https://terraform-mirror.yandexcloud.net/ para registry.terraform.io/*/*, como en la documentación de Yandex Cloud.

  1. Repita:

    cd ~/yc-cloud
    terraform init
    
  2. En el código, se ha añadido una declaración explícita del proveedor local en provider.tf (antes solo estaba null), para fijar las versiones en un solo lugar.

Si necesita acceso directo sin espejo: verifique su VPN/proxy y que curl -sI https://registry.terraform.io se abra correctamente.

$ terraform init   -backend-config="access_key=YCA" -backend-config="secret_key=YCN"
Inicializando el backend...
Inicializando plugins de proveedor...
- Buscando versiones de hashicorp/null que coincidan con "~> 3.2"...
- Buscando versiones de hashicorp/local que coincidan con "~> 2.5"...
- Buscando la última versión de yandex-cloud/yandex...
- Instalando yandex-cloud/yandex v0.200.0...
- Instalado yandex-cloud/yandex v0.200.0 (sin autenticación)
- Instalando hashicorp/null v3.2.4...
- Instalado hashicorp/null v3.2.4 (sin autenticación)
- Instalando hashicorp/local v2.8.0...
- Instalado hashicorp/local v2.8.0 (sin autenticación)
Terraform ha creado un archivo de bloqueo .terraform.lock.hcl para registrar las selecciones de proveedor que realizó anteriormente. Incluye este archivo en tu repositorio de control de versiones para que Terraform pueda garantizar que realice las mismas selecciones por defecto en el futuro cuando ejecutes "terraform init".

╷
│ Advertencia: Información incompleta en el archivo de bloqueo para proveedores
│ 
│ Debido a tus métodos personalizados de instalación de proveedores, Terraform tuvo que calcular
│ los checksums del archivo de bloqueo localmente para los siguientes proveedores:
│   - hashicorp/local
│   - hashicorp/null
│   - yandex-cloud/yandex
│ 
│ El archivo actual .terraform.lock.hcl solo incluye checksums para linux_amd64, por lo que Terraform
│ ejecutado en otra plataforma fallará al instalar estos proveedores.
│ 
│ Para calcular checksums adicionales para otra plataforma, ejecuta:
│   terraform providers lock -platform=linux_amd64
│ (donde linux_amd64 es la plataforma a generar)
╵
¡Terraform se ha inicializado correctamente!

Ahora puedes comenzar a trabajar con Terraform. Intenta ejecutar "terraform plan" para ver
cualquier cambio que se requiera para tu infraestructura. Todos los comandos de Terraform
deberían funcionar ahora.

Si en algún momento configuras o cambias módulos o configuración de backend para Terraform,
vuelve a ejecutar este comando para reinitializar tu directorio de trabajo. Si olvidas hacerlo,
otros comandos lo detectarán y te recordarán hacerlo si es necesario.
```

``` 
# Plan y aplicar 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"
```