[https://github.com/wand2016/terraformch13example_1:embed:cite]
RDS: Relational Database Service
DBパラメータグループ
my.cnf
ファイルに定義するような設定
variable "mysql_version" {
type = string
default = "5.7"
}
resource "aws_db_parameter_group" "example" {
name = "example"
family = "mysql${var.mysql_version}"
parameter {
name = "character_set_database"
value = "utf8mb4"
}
parameter {
name = "character_set_server"
value = "utf8mb4"
}
}
DBオプショングループ
- データベースエンジンにオプション追加
resource "aws_db_option_group" "example" {
name = "example"
engine_name = "mysql"
major_engine_version = var.mysql_version
option {
option_name = "MARIADB_AUDIT_PLUGIN"
}
}
DBサブネットグループ
- DBをサブネットをまたいで稼働させる
resource "aws_db_subnet_group" "example" {
name = "example"
subnet_ids = [aws_subnet.private_0.id, aws_subnet.private_1.id]
}
-
【所感】これはhasMany
- 他の多くのリソースはbelongsTo
- 例: aws_instanceは
placement_group
を指定して0-1個のプレースメントグループに所属する - 1つのサブネットが複数のサブネットグループに属することができるから、でしょうね
DBインスタンス
resource "aws_db_instance" "example" {
identifier = "example"
engine = "mysql"
engine_version = var.mysql_minor_version
instance_class = "db.t3.small"
allocated_storage = 20
max_allocated_storage = 100
storage_type = "gp2"
storage_encrypted = true
kms_key_id = aws_kms_key.example.arn
username = "admin"
password = "uninitialized"
multi_az = true
publicly_accessible = false
backup_window = "09:10-09:40"
backup_retention_period = 30
maintenance_window = "mon:10:10-mon:10:40"
auto_minor_version_upgrade = false
deletion_protection = true
skip_final_snapshot = false
port = var.mysql_port
apply_immediately = false
vpc_security_group_ids = [module.mysql_sg.security_group_id]
parameter_group_name = aws_db_parameter_group.example.name
option_group_name = aws_db_option_group.example.name
db_subnet_group_name = aws_db_subnet_group.example.name
lifecycle {
ignore_changes = [password]
}
}
module "mysql_sg" {
source = "./security_group"
name = "mysql-sg"
vpc_id = aws_vpc.example.id
port = var.mysql_port
cidr_blocks = [aws_vpc.example.cidr_block]
}
-
backup_window = "09:10-09:40"
- 公式
- 日次バックアップ時間帯(UTC)
-
maintenance_window = "mon:10:10-mon:10:40"
-
multi_az = true db
,subnet_group_name = aws_db_subnet_group.example.name
- マルチAZ(可用性向上)
- AZをまたがったサブネットグループの指定が必要
-
skip_final_snapshot
- DBインスタンス削除時にスナップショット生成をスキップする
- falseなのでスキップしない = スナップショットを生成する
マスターパスワードの変更
- passwordはrequired
- variableでapply実行時に流し込んでも、tfstateファイルに平文で書き込まれてしまうので使えない
- ダミーを入れておいて、あとでaws cliで書き換える
main.tf
...
password = "uninitialized"
...
commandline
aws rds modify-db-instance --db-instance-identifier 'example' \
--master-user-password 'NewMasterPassword!'
【補】後始末
...
deletion_protection = true
...
- 削除保護有効でdestroyを試みると怒られる
Error: error deleting Database Instance "example": InvalidParameterCombination:
Cannot delete protected DB Instance, please disable deletion protection and try again.
...
deletion_protection = false
skip_final_snapshot = false
...
- 削除保護無効でも、
skip_final_snapshot
が無効 = スナップショットが必要だと怒られる
Error: DB Instance FinalSnapshotIdentifier is required when a final snapshot is required
...
deletion_protection = false
skip_final_snapshot = true
...
- これでちゃんと消える