让我们使用Terraform构建AWS的RDS(Postgres)!
简介
这次我想要解释如何使用Terraform构建RDS(Postgres)的方法。
假设或条件
-
- 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的设置
每个项目的详细信息如下
今回はインスタンス作成時に入力するよう設定します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变量中。
由于可以重复使用共同部分并添加自定义变量,所以建议使用。
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(关系型数据库服务)
安全组
删除资源
请使用以下命令删除未使用的资源。
terraform destroy
总结
手动构建RDS会有很多输入项目和需要配置网络设置,很麻烦。但是只需要一个命令就能创建,真是太好了。
我计划以后也写关于ALB、Route53和ECS等托管服务的文章。
请参阅