【问题标题】:How to apply SQL Scripts on RDS with Terraform如何使用 Terraform 在 RDS 上应用 SQL 脚本
【发布时间】:2018-01-05 18:15:44
【问题描述】:

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

有没有办法在这个创建的 RDS 上执行 SQL 脚本(我想创建用户、表等)?

提前致谢,

态度,

【问题讨论】:

    标签: terraform


    【解决方案1】:

    this solution 一样,您还可以通过使用您自己的机器和local-exec 来避免实例设置时间/成本如果您的RDS 数据库是公开可用的并且您已设置ingress 以允许您的机器连接。然后,将凭据安全地存储在您的环境中,您只需执行以下操作:

    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}"
            }
        }
    }
    

    请记住,密码和其他敏感变量可以是input into terraform separately

    【讨论】:

    • 请注意,正如 sub-OP 所述,这意味着需要对数据库进行“公共”访问(通过 VPN 或允许从 Internet 连接到数据库)。
    • environment 之后需要等号以避免“不支持的块类型”错误?
    • 如果我的 RDS 在私有子网中,此配置将如何更改..?
    【解决方案2】:

    基于 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}"
        }
      }
    }
    

    【讨论】:

    • 如果数据库迁移时间过长,那么超时怎么办?似乎 health_checks 可能会失败并终止任务。这不是这种方法的问题吗?
    • 嗯,这是一个很好的观点 - 这种方法假设您已经有一个正在运行的数据库。如果你正在构建你的数据库并在同一个“terraform apply”上运行这个 sn-p,这可能不起作用,因为数据库可能还没有准备好接收 SQL 命令。为避免这种情况,请确保在运行之前设置您的 RDS 实例。这能回答你的问题吗?
    • 有没有办法在VPC或私有RDS实例中执行SQL脚本?
    【解决方案3】:

    您需要在配置器资源中使用 terraform remote exec。获取实例的数据库凭据是另一回事。您可以使用 consul 之类的东西或从 s3 中提取凭据并解析脚本。

    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

    【讨论】:

      【解决方案4】:

      用 MySQL 版本详细说明以前的答案。

      带文件的 MySQL 版本

      resource "null_resource" "db_setup" {
        depends_on = [module.db, aws_security_group.rds_main, aws_default_security_group.default]
        provisioner "local-exec" {
          command = "mysql --host=${module.db.this_db_instance_address} --port=${var.dbport} --user=${var.dbusername} --password=${var.dbpassword} --database=${var.dbname} < ${file(${path.module}/init/db_structure.sql)}"
        }
      }
      

      带有 local_file 的 MySQL 版本

      data "local_file" "sql_script" {
        filename = "${path.module}/init/db_structure.sql"
      }
      
      resource "null_resource" "db_setup" {
        depends_on = [module.db, aws_security_group.rds_main, aws_default_security_group.default]
        provisioner "local-exec" {
          command = "mysql --host=${module.db.this_db_instance_address} --port=${var.dbport} --user=${var.dbusername} --password=${var.dbpassword} --database=${var.dbname} < ${data.local_file.sql_script.content}"
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-18
        • 2017-02-14
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 2021-09-29
        • 2021-11-23
        • 2021-02-15
        相关资源
        最近更新 更多