web-dev-qa-db-fra.com

Comment appliquer des scripts SQL sur RDS avec Terraform

J'utilise Terraform pour créer un script qui construit des serveurs EC2 et un RDS MySQL (en utilisant AWS Amazon Provider).

Existe-t-il un moyen d'exécuter un script SQL sur ce RDS créé (je veux créer des utilisateurs, des tables, etc.)?

Merci d'avance,

Att,

12
Ademir Carvalho Jr.

Comme cette solution , vous pouvez également éviter le temps/coût de configuration de l'instance en utilisant votre propre machine avec local-exec SI votre base de données RDS est accessible au public et que vous avez configuré ingress pour permettre à votre machine de se connecter . Ensuite, avec les informations d'identification stockées en toute sécurité dans votre environnement, vous feriez simplement quelque chose comme:

resource "null_resource" "db_setup" {

  # runs after database and security group providing external access is created
  depends_on = ["aws_db_instance.your_database_instance", "aws_security_group.sg_allowing_external_access"]

    provisioner "local-exec" {
        command = "database connection command goes here"
        environment {
          # for instance, postgres would need the password here:
          PGPASSWORD = "${var.database_admin_password}"
        }
    }
}

Gardez à l'esprit que les mots de passe et autres variables sensibles peuvent être entrée dans terraform séparément .

6
ecoe

S'appuyant sur la réponse d'Ecoe:

Pour les futurs lecteurs utilisant une instance Postgres RDS, voici ce qui a fonctionné pour moi (vous devez avoir psql installé sur votre machine):

variable "db_username" {
  type = string
}

variable "db_password" {
  type = string
}

resource "null_resource" "db_setup" {

  provisioner "local-exec" {

    command = "psql -h Host_name_here -p 5432 -U \"${var.db_username}\" -d database_name_here -f \"path-to-file-with-sql-commands\""

    environment = {
      PGPASSWORD = "${var.db_password}"
    }
  }
}
1
rishikarri

Vous voudrez utiliser l'exécutable distant terraform dans une ressource de provisioning. Obtenir des informations d'identification db sur l'instance est une autre histoire. Vous pouvez utiliser quelque chose comme consul ou extraire les crédits de s3 et faire analyser le script.

resource "aws_instance" "web" {


  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/script.sh",
      "/tmp/script.sh args",
    ]
  }
}

https://www.terraform.io/docs/provisioners/remote-exec.html#script

1
strongjz