Database 使用terraform创建数据库架构

Database 使用terraform创建数据库架构,database,amazon-web-services,terraform,amazon-rds,Database,Amazon Web Services,Terraform,Amazon Rds,我使用aws_db_instance(main.tf)创建了RDS实例: 我还可以使用terraform apply从文件schema.sql创建数据库架构吗 $ tree -L 1 . ├── main.tf └── schema.sql 您可以使用provisioner()进行以下操作: resourc

我使用
aws_db_instance
main.tf
)创建了RDS实例:

我还可以使用terraform apply从文件
schema.sql
创建数据库架构吗

$ tree -L 1                                                                                               
.
├── main.tf
└── schema.sql
您可以使用provisioner()进行以下操作:

resource "aws_db_instance" "default" {
  identifier           = module.config.database["db_inst_name"]
  allocated_storage    = 20
  storage_type         = "gp2"
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t3.micro"
  name                 = "${module.config.database["db_name_prefix"]}${terraform.workspace}"
  username             = module.config.database["db_username"]
  password             = module.config.database["db_password"]
  parameter_group_name = "default.mysql5.7"
  skip_final_snapshot  = true

  provisioner "local-exec" {
    command = "mysql --host=${self.address} --port=${self.port} --user=${self.username} --password=${self.password} < ./schema.sql"
    }
  }

#Apply scheme by using bastion host
resource "aws_db_instance" "default_bastion" {
  identifier           = module.config.database["db_inst_name"]
  allocated_storage    = 20
  storage_type         = "gp2"
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t3.micro"
  name                 = "${module.config.database["db_name_prefix"]}${terraform.workspace}"
  username             = module.config.database["db_username"]
  password             = module.config.database["db_password"]
  parameter_group_name = "default.mysql5.7"
  skip_final_snapshot  = true

  provisioner "file" {
      connection {
      user        = "ec2-user"
      host        = "bastion.example.com"
      private_key = file("~/.ssh/ec2_cert.pem")
    }

    source      = "./schema.sql"
    destination = "~"
  }

  provisioner "remote-exec" {
    connection {
      user        = "ec2-user"
      host        = "bastion.example.com"
      private_key = file("~/.ssh/ec2_cert.pem")
    }

    command = "mysql --host=${self.address} --port=${self.port} --user=${self.username} --password=${self.password} < ~/schema.sql"
  }
}
资源“aws\u db\u实例”“默认”{
标识符=module.config.database[“db\u inst\u name”]
已分配存储=20
存储类型=“gp2”
engine=“mysql”
引擎版本=“5.7”
instance_class=“db.t3.micro”
name=“${module.config.database[“db_name_prefix”]}${terraform.workspace}”
用户名=module.config.database[“db_username”]
password=module.config.database[“db_password”]
参数_group_name=“default.mysql5.7”
跳过\u最终\u快照=真
供应人“本地执行官”{
command=“mysql--host=${self.address}--port=${self.port}--user=${self.username}--password=${self.password}<./schema.sql”
}
}
#使用bastion主机应用方案
资源“aws\U db\U实例”“默认\U堡垒”{
标识符=module.config.database[“db\u inst\u name”]
已分配存储=20
存储类型=“gp2”
engine=“mysql”
引擎版本=“5.7”
instance_class=“db.t3.micro”
name=“${module.config.database[“db_name_prefix”]}${terraform.workspace}”
用户名=module.config.database[“db_username”]
password=module.config.database[“db_password”]
参数_group_name=“default.mysql5.7”
跳过\u最终\u快照=真
供应器“文件”{
联系{
user=“ec2用户”
host=“bastion.example.com”
私钥=文件(“~/.ssh/ec2\u cert.pem”)
}
source=“./schema.sql”
destination=“~”
}
供应器“远程执行”{
联系{
user=“ec2用户”
host=“bastion.example.com”
私钥=文件(“~/.ssh/ec2\u cert.pem”)
}
command=“mysql--host=${self.address}--port=${self.port}--user=${self.username}--password=${self.password}<~/schema.sql”
}
}
mysql客户端需要安装在您的设备上

如果您不能直接访问数据库,还可以使用
remote exec
provisioner,在那里您可以使用bastion主机(首先使用
file
provisioner将文件传输到远程位置)

如果您的模式不太复杂,还可以使用terraform的MySQL提供程序:

数据库往往是长期存在的,需要随着时间的推移对其模式进行修改,因此我建议不要使用Terraform来管理模式,除非您确信它很少或永远不会改变。在更改数据库模式时,我们往往需要明确说明如何迁移(以避免数据丢失)。这不适合Terraform的声明式方法,我们告诉Terraform我们想要的结果,让Terraform知道如何实现。有专门的工具专门针对这个问题,我建议在Terraform创建空数据库后使用。项目处于非常早期的设计阶段。我需要它来设置带有虚拟数据的基本环境,为应用程序的工作提供一些基础;)@DJAIPee你能告诉我你是如何通过堡垒主机做到这一点的吗?@Shell_Leko我更新了我的配置。它没有经过测试,但应该会给你一个大概的想法,它应该如何工作。
resource "aws_db_instance" "default" {
  identifier           = module.config.database["db_inst_name"]
  allocated_storage    = 20
  storage_type         = "gp2"
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t3.micro"
  name                 = "${module.config.database["db_name_prefix"]}${terraform.workspace}"
  username             = module.config.database["db_username"]
  password             = module.config.database["db_password"]
  parameter_group_name = "default.mysql5.7"
  skip_final_snapshot  = true

  provisioner "local-exec" {
    command = "mysql --host=${self.address} --port=${self.port} --user=${self.username} --password=${self.password} < ./schema.sql"
    }
  }

#Apply scheme by using bastion host
resource "aws_db_instance" "default_bastion" {
  identifier           = module.config.database["db_inst_name"]
  allocated_storage    = 20
  storage_type         = "gp2"
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t3.micro"
  name                 = "${module.config.database["db_name_prefix"]}${terraform.workspace}"
  username             = module.config.database["db_username"]
  password             = module.config.database["db_password"]
  parameter_group_name = "default.mysql5.7"
  skip_final_snapshot  = true

  provisioner "file" {
      connection {
      user        = "ec2-user"
      host        = "bastion.example.com"
      private_key = file("~/.ssh/ec2_cert.pem")
    }

    source      = "./schema.sql"
    destination = "~"
  }

  provisioner "remote-exec" {
    connection {
      user        = "ec2-user"
      host        = "bastion.example.com"
      private_key = file("~/.ssh/ec2_cert.pem")
    }

    command = "mysql --host=${self.address} --port=${self.port} --user=${self.username} --password=${self.password} < ~/schema.sql"
  }
}