使用 Terraform 创建数据库模式

10

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

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
}

我可以翻译。使用terraform apply可以从文件schema.sql创建数据库模式吗?
$ tree -L 1                                                                                               
.
├── main.tf
└── schema.sql

3
数据库通常具有长寿命并需要随着时间的推移修改其架构,因此我建议不要使用Terraform来管理架构,除非您确信它很少或永远不会更改。在更改数据库架构时,我们 tend to 需要明确说明如何进行迁移(以避免数据丢失)。这并不适合 Terraform 的声明性方法,其中我们告诉 Terraform 我们想要的结果,让 Terraform 找出实现它的方法。有专门针对此问题的工具,我建议在让 Terraform 创建空数据库之后再使用这些工具。 - Martin Atkins
项目处于非常早期的设计阶段。我需要设置基本环境并提供虚拟数据,以便为应用程序提供一些基础功能;) - Taz
1个回答

18

你可以使用一个 provisioner (https://www.terraform.io/docs/provisioners/index.html) 来实现这个目的:

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

您的设备需要安装mysql客户端。

如果您无法直接访问您的数据库,则还有一个remote-exec预配程序,您可以使用跳板主机(首先使用file预配程序将文件传输到远程位置)。

如果您的模式不太复杂,您也可以使用terraform的MySQL提供程序: https://www.terraform.io/docs/providers/mysql/index.html


@DJAIPee,你能展示一下如何通过堡垒机来完成吗? - Shell_Leko
@Shell_Leko 我更新了我的配置文件。虽然没有经过测试,但应该能给你一个大概的想法,它应该如何工作。 - DJAlPee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接