実践Terraform ch13 データストア (1/2)

Terraform勉強メモ

出典: 


[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_instanceplacement_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"

    • 公式
    • 数カ月に一度程度行われるメンテナンスの時間帯(UTC)
    • メンテナンスの対象

      • H/W
      • OS
      • DBエンジン
    • シングルAZだと数分程度利用不可能になる

  • 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
...
  • これでちゃんと消える