如何在具有Terraform的RDS上应用SQL脚本

Ade*_*Jr. 8 terraform

我正在使用Terraform创建一个脚本,该脚本构建一些EC2服务器和一个MySQL RDS(使用AWS Amazon Provider)。

有没有一种方法可以在此创建的RDS上执行SQL脚本(我想创建用户,表等)?

提前致谢,

Att,

eco*_*coe 6

像此解决方案一样,如果RDS数据库是公开可用的并且您已设置ingress允许计算机连接,则还可以通过将本地计算机与local-exec一起使用来避免实例设置的时间/成本。然后,将凭据安全地存储在您的环境中,您将可以执行以下操作:

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}"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,密码和其他敏感变量可以分别输入到terraform中。


ris*_*rri 5

基于ecoe的答案:

对于使用 Postgres RDS 实例的未来读者,这对我有用(您必须在您的机器上安装psql):

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}"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这是一个很好的观点 - 这种方法假设您已经有一个已启动并正在运行的数据库。如果您正在构建数据库并在同一“terraform apply”上运行此代码片段,则这可能不起作用,因为数据库可能尚未准备好接收 SQL 命令。为了避免这种情况,请确保在运行之前设置您的 RDS 实例。这是否回答你的问题? (2认同)

str*_*gjz 2

您需要在配置程序资源中使用 terraform 远程执行。获取实例的数据库凭据是另一回事。您可以使用consul之类的工具或从 s3 中提取凭据并进行脚本解析。

resource "aws_instance" "web" {


  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/script.sh",
      "/tmp/script.sh args",
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

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