実践Terraform ch13 データストア (1/2)
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"
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 ...
- これでちゃんと消える