es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo ejecutar “terraform import” sin fallo cuando el recurso no existe?

Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en formato Markdown.

Soy un desarrollador en QHub, que es una colección de scripts de Terraform con plantillas para implementar una plataforma de ciencias de datos en varios proveedores de servicios en la nube (AWS, GCP, Azure, Digital Ocean). Utiliza buckets S3 para almacenar el estado de Terraform y como parte de la implementación, es necesario importar ese estado si está disponible. En el caso de que se implemente la infraestructura inicialmente o si se está implementando utilizando git-ops, los archivos de estado no existen localmente. Esto resulta en el requisito de una funcionalidad de “importar si existe, de lo contrario continuar” que me resulta difícil de encontrar.

Anteriormente ejecutábamos terraform import y si el bucket no existía, el comando fallaba en silencio y continuaba. Con la actualización a Terraform v1.0.5, el comando de importación se colgará hasta que Terraform se agote, lo que es demasiado tiempo.

Mi solución alternativa actual es usar el comando predeterminado de GNU timeout y forzar el comando a fallar así: timeout 10 terraform import module.terraform-state.module.gcs.google_storage_bucket.static-site test-dev-terraform-state. Si esto falla, entonces ejecutaré terraform apply para crear el recurso.

Hay un requisito adicional para evitar el uso de herramientas CLI específicas de la nube para determinar si el bucket existe.

Tiene que haber una mejor manera de hacer esto. ¿Alguna idea?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para Importar el Estado de Terraform Si Existe

    Al desplegar infraestructura utilizando Terraform, es común almacenar el estado en un back-end remoto como un bucket S3. En casos en los que la infraestructura se despliega inicialmente o si se está desplegando utilizando git-ops, los archivos de estado no existen localmente. Por lo tanto, al importar el estado, es necesario verificar si existe antes de intentar la importación.

    Una solución a este problema es utilizar el comando terraform state list, que devolverá una lista de nombres de recursos que están siendo gestionados por Terraform. Podemos utilizar esta lista para comprobar si el recurso que deseamos importar ya existe. Si existe, podemos proceder con la importación, y si no existe, podemos omitir la importación y continuar con el despliegue.

    Aquí hay un ejemplo de cómo implementar esta solución:

    resource "aws_s3_bucket" "example" {
      # ...
    }
    
    locals {
      import_exists = contains(terraform state list, "aws_s3_bucket.example")
    }
    
    # Solo importar el estado si existe
    resource "null_resource" "import_state" {
      provisioner "local-exec" {
        command = "terraform import aws_s3_bucket.example example" if local.import_exists
      }
    }
    

    En este ejemplo, utilizamos la función contains para comprobar si el recurso aws_s3_bucket.example existe en la lista devuelta por terraform state list. Si existe, ejecutamos el comando terraform import. Si no existe, se omite el provisioner.

    Este enfoque nos permite evitar el uso de herramientas CLI específicas de la nube para determinar si el bucket existe y elimina la necesidad de utilizar el comando timeout para forzar que la importación falle. Es una forma más fiable y eficiente de importar el estado de Terraform y desplegar infraestructura utilizando Terraform.

Comments are closed.