【发布时间】:2018-01-05 18:15:44
【问题描述】:
我正在使用 Terraform 创建一个脚本,用于构建一些 EC2 服务器和一个 MySQL RDS(使用 AWS Amazon Provider)。
有没有办法在这个创建的 RDS 上执行 SQL 脚本(我想创建用户、表等)?
提前致谢,
态度,
【问题讨论】:
标签: terraform
我正在使用 Terraform 创建一个脚本,用于构建一些 EC2 服务器和一个 MySQL RDS(使用 AWS Amazon Provider)。
有没有办法在这个创建的 RDS 上执行 SQL 脚本(我想创建用户、表等)?
提前致谢,
态度,
【问题讨论】:
标签: terraform
与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。
【讨论】:
environment 之后需要等号以避免“不支持的块类型”错误?
基于 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}"
}
}
}
【讨论】:
您需要在配置器资源中使用 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
【讨论】:
用 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}"
}
}
【讨论】: