让我们使用Terraform构建AWS的RDS(Postgres)!

简介

这次我想要解释如何使用Terraform构建RDS(Postgres)的方法。

RDS-ページ1.drawio.png

假设或条件

    • Terraformのmain.tfを作成済み

 

    • VPC、プライベートサブネットをはじめとするネットワークを構築済み

 

    今回はPostgresのDBインスタンスを作成します

如果您尚未创建main.tf文件,请参考以下文章。

 

如果您想了解使用Terraform建立网络的方法,请参考以下文章。

 

此外,如果通过容器来使用Terraform,则在多个项目中使用时无需考虑版本差异。对于希望使用容器的人来说,您也可以参考这篇文章。

 

目录结构

构成如下所示。

(Note: The translation provided is in Simplified Chinese script. If you prefer Traditional Chinese, please let me know.)

tree 
.
├── database.tf
├── main.tf
├── network.tf
└── variables.tf
    • variables.tf

 

    database.tf

我将按照顺序记录RDS的设置。

变量.tf

创建RDS实例时

    • ユーザ名

 

    パスワード

由于可以指定,则会提供设置选项。

# ------------------------------
# Variables
# ------------------------------

# プリフィックスを設定
variable "prefix" {
  default = "tf-pg"
}

# プロジェクトを識別する一意の識別子を設定
variable "project" {
  default = "terraform-playground"
}

# プロジェクトのオーナーを設定
variable "owner" {
  default = "shun198"
}

# DBのユーザ名を設定
variable "db_username" {
  description = "Username for the RDS postgres instance"
}

# DBのパスワードを設定
variable "db_password" {
  description = "Password for the RDS postgres instance"
}

数据库.tf (databases.tf)

以下是对RDS的描述:

RDS(关系型数据库服务)

    • ネットワーク関連

 

    RDSのインスタンス

我会写下设定内容。

# ------------------------------
# Database Configuration
# ------------------------------
resource "aws_db_subnet_group" "main" {
  name = "${local.prefix}-main"
  subnet_ids = [
    aws_subnet.private_a.id,
    aws_subnet.private_c.id,
  ]


  tags = merge(
    local.common_tags,
    tomap({ "Name" = "${local.prefix}-main" })
  )
}

resource "aws_security_group" "rds" {
  description = "Allow access to RDS"
  name        = "${local.prefix}-rds-sg"
  vpc_id      = aws_vpc.main.id

  ingress {
    protocol    = "tcp"
    from_port   = 5432
    to_port     = 5432
    cidr_blocks = ["10.0.0.0/16"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = merge(
    local.common_tags,
    tomap({ "Name" = "${local.prefix}-rds-sg" })
  )
}

resource "aws_db_instance" "main" {
  identifier              = "${local.prefix}-db"
  db_name                 = "postgres"
  allocated_storage       = 20
  storage_type            = "gp2"
  engine                  = "postgres"
  engine_version          = "15.2"
  instance_class          = "db.t3.small"
  db_subnet_group_name    = aws_db_subnet_group.main.name
  password                = var.db_password
  username                = var.db_username
  backup_retention_period = 0
  multi_az                = false
  skip_final_snapshot     = true
  vpc_security_group_ids  = [aws_security_group.rds.id]

  tags = merge(
    local.common_tags,
    tomap({ "Name" = "${local.prefix}-main" })
  )
}

网络相关的设置

    • サブネット

 

    セキュリティグループ

将RDS配置在私有子网中,所以这次在subnet_ids中进行设置。

    • プライベートサブネットA

 

    プライベートサブネットC

设定为放置在某个地方

# ------------------------------
# Database Configuration
# ------------------------------
resource "aws_db_subnet_group" "main" {
  name = "${local.prefix}-main"
  subnet_ids = [
    aws_subnet.private_a.id,
    aws_subnet.private_c.id,
  ]


  tags = merge(
    local.common_tags,
    tomap({ "Name" = "${local.prefix}-main" })
  )
}

关于安全组的设置,如下所示:
入站规则仅允许 TCP 的 5432 端口(Postgres),
出站规则允许所有流量。
根据项目要求,希望可以灵活决定。

resource "aws_security_group" "rds" {
  description = "Allow access to RDS"
  name        = "${local.prefix}-rds-sg"
  vpc_id      = aws_vpc.main.id

  ingress {
    protocol    = "tcp"
    from_port   = 5432
    to_port     = 5432
    cidr_blocks = ["10.0.0.0/16"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = merge(
    local.common_tags,
    tomap({ "Name" = "${local.prefix}-rds-sg" })
  )
}

RDS的设置

我会进行RDS的设置
每个项目的详细信息如下

項目説明identifierRDSインスタンスを識別する一意の名前db_nameDB名allocated_storageRDSに割り当てるストレージの量storage_typeストレージの種類engineDBの種類engine_versionDBのバージョンinstance_classインスタンスの種類db_subnet_group_nameRDSを配置するサブネットusernameRDSのユーザ名
今回はインスタンス作成時に入力するよう設定しますpasswordRDSのパスワード
今回はインスタンス作成時に入力するよう設定しますbackup_retention_period自動バックアップの保持期間
今回は検証用で作成するため0(バックアップを作成しない)に設定しますmulti_az複数のAZでインスタンスを生成するかどうかskip_final_snapshotインスタンスを削除する前にDBのスナップショットを作成するかどうか
今回は検証用で作成するためfalseに設定しますvpc_security_group_idsRDSに設定するセキュリティグループ
resource "aws_db_instance" "main" {
  identifier              = "${local.prefix}-db"
  db_name                 = "postgres"
  allocated_storage       = 20
  storage_type            = "gp2"
  engine                  = "postgres"
  engine_version          = "15.2"
  instance_class          = "db.t3.small"
  db_subnet_group_name    = aws_db_subnet_group.main.name
  username                = var.db_username
  password                = var.db_password
  backup_retention_period = 0
  multi_az                = true
  skip_final_snapshot     = true
  vpc_security_group_ids  = [aws_security_group.rds.id]

  tags = merge(
    local.common_tags,
    tomap({ "Name" = "${local.prefix}-main" })
  )
}

创建标签

这是可选的事项。
虽然也可以硬编码,但这次我们将使用在main.tf中定义的变量。
我们将使用merge函数,将任意的变量添加到main.tf中的local.common_tags变量中。
由于可以重复使用共同部分并添加自定义变量,所以建议使用。

从上述的variables.tf中获取var.prefix
var.project
var.owner

main.tf
# ——————————
# 本地变量
# ——————————
本地 {
# 从variables.tf中获取变量
# 从terraform工作区列表中获取匹配的工作区(dev,stg,prd等)
prefix = “${var.prefix}-${terraform.workspace}”
common_tags = {
环境 = terraform.workspace
项目 = var.project
拥有者 = var.owner
管理者 = “Terraform”
}
}

来试试亲自制作吧!

当格式修正、验证和计划确认完成后,请使用以下命令应用。

terraform apply -auto-approve

执行上述命令后,将要求输入RDS的用户名和密码
这次用户名将设为shun198。

var.db_password
  Password for the RDS postgres instance

  Enter a value: password

var.db_username
  Username for the RDS postgres instance

  Enter a value: shun198 

然而,关于密码,必须遵守以下约束条件。

限制事项:请输入至少8个可能的ASCII字符,并且不得包含以下字符:/(斜杠)、’(单引号)、”(双引号)和@(at符号)。

当想要自动化输入用户名和密码时,应该怎么做?

可以通过在 terraform.tfvars 文件中进行填写来实现自动输入。

tree 
.
tree 
.
├── database.tf
├── main.tf
├── network.tf
├── terraform.tfvars # 新たに追加
├── variables.tf
└── .gitignore              # 新たに追加

这一次

    • db_username

 

    db_password

我会添加2个选项

db_username = "shun198"
db_password = "password"

由于上述信息属于机密信息,请将其添加到.gitignore文件中。

terraform.tfvars

让我们来确认是否已经创建了!

确认已创建RDS并已添加相应的标签。

    • RDSインスタンス

 

    RDSのセキュリティグループ

请确认已经创建并添加了相应的标签。

RDS(关系型数据库服务)

スクリーンショット 2023-04-01 17.52.44.png
スクリーンショット 2023-04-01 17.59.51.png
スクリーンショット 2023-04-01 17.43.39.png

安全组

スクリーンショット 2023-04-01 18.06.02.png
スクリーンショット 2023-04-01 18.06.20.png

删除资源

请使用以下命令删除未使用的资源。

terraform destroy

总结

手动构建RDS会有很多输入项目和需要配置网络设置,很麻烦。但是只需要一个命令就能创建,真是太好了。
我计划以后也写关于ALB、Route53和ECS等托管服务的文章。

请参阅

 

广告
将在 10 秒后关闭
bannerAds