尝试使用Terraform来构建RDS

首先

由于开始学习Terraform,我准备将我的学习笔记兼作发布。我已经执行了以下三个发布内容并进行了RDS的构建。
1. 安装Terraform并使用其在AWS上创建EC2实例。
2. 使用Terraform设置IAM并通过会话管理器连接到EC2实例。
3. 使用Terraform设置安全组以便EC2实例可以进行HTTP连接。

向Terraform中添加RDS的定义

定义用于RDS连接的安全组。

这次,连接到RDS将从EC2进行。因此,我们将只允许从EC2所分配的安全组连接到RDS。

resource "aws_security_group" "test_rds" {
  name = "tf_test_rds"

  tags = {
    Name = "tf_test_rds"
  }
}

resource "aws_security_group_rule" "rds" {
  type                     = "ingress"
  from_port                = 3306
  to_port                  = 3306
  protocol                 = "tcp"
  source_security_group_id = aws_security_group.test.id
  security_group_id        = aws_security_group.test_rds.id
}

只允许连接到设置的安全组ID的source_security_group_id。
aws_security_group.test.id是使用以下链接创建的安全组:
https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad#http%E6%8E%A5%E7%B6%9A%E7%94%A8%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E5%AE%9A%E7%BE%A9

定义RDS实例

我们将定义有关RDS的信息。

resource "aws_db_instance" "test" {
  allocated_storage       = 10
  engine                  = "mysql"
  engine_version          = "8.0.31"
  instance_class          = "db.t2.micro"
  storage_type            = "gp2"
  username                = "username"
  password                = "password"
  backup_retention_period = 0
  skip_final_snapshot     = true
  vpc_security_group_ids = [
    aws_security_group.test_rds.id
  ]
  tags = {
    Name = "tf_test"
  }
}

将定义在vpc_security_group_ids中用于RDS连接的安全组ID设置

密码以明文形式设置可能有些微妙,但这次我们直接进行了设置。
通过使用密码生成器和SSM参数存储,似乎可以在Terraform文件中不定义明文密码进行操作,这将是另一个机会。

使用Terraform创建了安全组和RDS

执行Terraform的计划应用

执行Terraform的plan apply命令,在AWS上创建资源。

terraform plan
terraform apply

连接到EC2并连接到RDS。

连接到使用Session Manager创建的EC2实例。

我們以與以下相同的方式連接到EC2。

 

在EC2上安装mysql。

sudo yum install mysql

使用mysql命令连接到RDS

mysql -u username -h RDSのエンドポイント -p

用户,请使用在rds.tf上设置的用户名和密码。
您可以从AWS控制台确认要设置的RDS终端节点。

删除已创建的资源

运行 Terraform destroy 命令,将删除 AWS 上的资源。

terraform destroy

最后一点

这次我在执行terraform destroy时,设置了将在删除rds时保留快照的配置,但是由于没有设置final_snapshot_identifier,导致destroy出现了错误。
虽然这是理所当然的事情,但在练习阶段已经意识到应用成功并不意味着能顺利进行destroy,这真是太好了。

广告
将在 10 秒后关闭
bannerAds