作りながら覚えるTerraform入門(7) – RDS編

这是Terraform入门系列的第7篇,边做边学。
本次我们将使用多可用区(Multi-AZ)配置来构建RDS。数据库引擎我们选择MySQL 8.0进行进展。

边创建边学习的Terraform入门系列
    1. インストールと初期設定

 

    1. 基本編

 

    1. VPC編

 

    1. EC2編

 

    1. Route53 + ACM編

 

    1. ELB編

RDS編 => 今回はコチラ

今回の学習ポイントは・・・
変更を無視するignore_changesというlifecycleが登場しますが、RDSを構築する上でのAWS観点でのポイントがいくつかあると思いますので、参考になれば嬉しいです!

创建子网组

DBインスタンスを作成する前に○○グループを順番に作成していきましょう。
まずは、サブネットグループを作成します。
rds.tfを作成して、以下のコードを貼り付けます。

################################
# RDS
################################
# Subnet group
resource "aws_db_subnet_group" "subnet" {
  name = "${var.prefix}-db-subnet"

  subnet_ids = [
    aws_subnet.private_subnet_1a.id,
    aws_subnet.private_subnet_1c.id
  ]
}

这只是指定了私有子网的ID,所以很简单。

创建参数组

接下来,我们将创建参数组。
请在rds.tf文件中添加以下代码。

# Parameter group
resource "aws_db_parameter_group" "mysql" {
  name   = "${var.prefix}-parameter-group"
  family = "mysql8.0"

  parameter {
    name         = "general_log"
    value        = "1"
    apply_method = "immediate"
  }

  parameter {
    name         = "slow_query_log"
    value        = "1"
    apply_method = "immediate"
  }

  parameter {
    name         = "long_query_time"
    value        = "0"
    apply_method = "immediate"
  }

  parameter {
    name         = "log_output"
    value        = "FILE"
    apply_method = "immediate"
  }
}

创建参数组本身并不难,只需指定一个族群即可。但是如果保持默认参数,除了错误日志外不会输出其他内容,因此需要修改某些参数。

パラメータ説明general_log一般クエリログの出力slow_query_logスロークエリログの出力long_query_timeスロークエリログを出力する秒数のしきい値  log_output出力の出力先

将general_log和slow_query_log设置为”1″以便输出日志。

通过将long_query_time设置为“0秒”,可以确保即使不执行重量级查询,日志也会被输出。通常,日志被输出用于确定耗时的查询,但在这里只是为了确认“日志是否被输出”的功能。

将log_output更改为”FILE”。默认情况下,日志会写入”TABLE”。
即使保持为”TABLE”,您仍可以从控制台中查看常规查询日志、慢查询日志和错误日志。但为了在创建RDS时能够将日志导出到CloudWatch Logs中,我们将其更改为”FILE”(保持为”TABLE”时,即使启用导出功能,日志也不会传输到CloudWatch Logs中)。

整理一下的话,

    • すべてのパラメータがデフォルトのままでもエラーログだけはコンソール画面から確認できる

general_log slow_query_logを「1」にするとそれぞれのログもコンソール画面から確認できる

log_outputをFILEにするとテーブルではなくファイルにログが書き込みされる
RDSのログエクスポートを有効にするとファイルとして出力されたログがCloudWatch Logsに転送される

ということになります。
このあたりTerraformあまり関係ありませんが、少しわかりにくいと感じたので補足させて頂きました。
それぞれのパラメータのapply_methodはデフォルトがimmediate「すぐに適用」なので省略しても構いません。

オプショングループの作成

次は、オプショングループを作成します。
rds.tfに以下のコードを追加します。

# Option group
resource "aws_db_option_group" "mysql" {
  name                 = "${var.prefix}-option-group"
  engine_name          = "mysql"
  major_engine_version = "8.0"

  option {
    option_name                    = "MEMCACHED"
    port                           = "11211"
    vpc_security_group_memberships = [aws_security_group.rds_sg.id]

    option_settings {
      name  = "BACKLOG_QUEUE_LIMIT"
      value = "1024"
    }

    option_settings {
      name  = "BINDING_PROTOCOL"
      value = "auto"
    }
  }
}

在创建选项组本身方面,并不难,只需指定DB引擎和版本。但是,作为添加选项的示例,我们添加了”memcached”。这并没有实际意义,也不进行连接确认。

option_settings{}の中は省略してもデフォルト値が採用されるので省略できますが、2つだけサンプルで記載しています。コンソール画面で追加する場合の以下の画面のオプション設定に該当します。

7E51F911-F3FC-4151-9107-DD53F69F7C24.png

创建监控日志

次に、モニタリングロールを作成します。
モニタリングロールはRDSの「拡張モニタリング」を有効にする場合に必要なIAMロールで、RDS内部のCPU使用率などのメトリクスをCloudWatch Logsに転送するために利用されます。

image.png

在这里,我们将新建一个名为”rds-enhanced-monitoring-role”的角色。
将以下代码添加到iam.tf中。

data "aws_iam_policy" "rds_monitoring_role" {
  arn = "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole"
}

data "aws_iam_policy_document" "rds_monitoring_role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["monitoring.rds.amazonaws.com"]
    }
  }
}

resource "aws_iam_role" "rds_monitoring_role" {
  name               = "rds-enhanced-monitoring-role"
  assume_role_policy = data.aws_iam_policy_document.rds_monitoring_role.json
}

resource "aws_iam_role_policy_attachment" "rds_monitoring_role" {
  role       = aws_iam_role.rds_monitoring_role.name
  policy_arn = data.aws_iam_policy.rds_monitoring_role.arn
}

在EC2环境下所做的工作与创建IAM角色并没有区别。我们正使用数据源来引用和附加名为“AmazonRDSEnhancedMonitoringRole”的管理策略。

创建DB实例

最后,我们创建DB实例。
在rds.tf中添加以下代码。

# DB Instance
resource "aws_db_instance" "mysql" {
  engine                                = "mysql"
  engine_version                        = "8.0.20"
  license_model                         = "general-public-license"
  identifier                            = "${var.prefix}-db-instance"
  username                              = "admin"
  password                              = "password"
  instance_class                        = "db.t3.medium"
  storage_type                          = "gp2"
  allocated_storage                     = 20
  max_allocated_storage                 = 100
  multi_az                              = true
  db_subnet_group_name                  = aws_db_subnet_group.subnet.name
  publicly_accessible                   = false
  vpc_security_group_ids                = [aws_security_group.rds_sg.id]
  port                                  = 3306
  iam_database_authentication_enabled   = false
  name                                  = "cloud"
  parameter_group_name                  = aws_db_parameter_group.mysql.name
  option_group_name                     = aws_db_option_group.mysql.name
  backup_retention_period               = 7
  backup_window                         = "19:00-20:00"
  copy_tags_to_snapshot                 = true
  storage_encrypted                     = true
  performance_insights_enabled          = true
  performance_insights_retention_period = 7
  monitoring_interval                   = 60
  monitoring_role_arn                   = aws_iam_role.rds_monitoring_role.arn
  enabled_cloudwatch_logs_exports       = ["error", "general", "slowquery"]
  auto_minor_version_upgrade            = false
  maintenance_window                    = "Sat:20:00-Sat:21:00"
  deletion_protection                   = false
  skip_final_snapshot                   = true
  apply_immediately                     = false

  tags = {
    Name = "${var.prefix}-db-instance"
  }

  lifecycle {
    ignore_changes = [password]
  }
}

output "rds_endpoint" {
  description = "The connection endpoint in address:port format."
  value       = aws_db_instance.mysql.endpoint
}

尽管DB实例的参数很多,但我已经按照在控制台页面上创建时的顺序进行描述,所以我认为只要读者在阅读时与屏幕进行对照,就不会觉得特别困难。

用户名和密码被直接写入代码中,但最好将其变量化并引用terraform.tfvars文件。但即使从代码中隐藏,密码仍会以明文形式写入terraform.tfstate文件中,因此最好先设置一个临时密码,以后再修改。在lifecycle块的ignore_changes中,可以排除Terraform的管理范围内的密码,并且即使密码发生更改,也不会被检测到差异。

我将实例类型设置为t3.medium。
为了启用性能洞察,需要选择一定大小以上的实例类型,因此我选择了t3.medium。

我正在使用 `multi_az = true` 这个选项来指定多可用区(Multi-AZ)配置。
如果要使用单个可用区(Single)配置,请将其设置为 `false`,并可通过 `availability_zone` 参数来指定可用区。

multi_az          = false
availability_zone = "ap-northeast-1a"

在enabled_cloudwatch_logs_exports中,将“错误日志”、“常规查询日志”和“慢查询日志”导出到CloudWatch Logs中。请记住,在上述参数组中启用日志输出并将log_output设置为“FILE”。

skip_final_snapshotはDBインスタンスを削除する時にスナップショットを取得するかどうかの設定です。もしtrueにして取得する場合はfinal_snapshot_identifierのパラメータも合わせて指定する必要があります。

outputブロックではDBインスタンスのエンドポイントを出力させています。

今回の構成では本番環境を意識して、極力、RDSで利用できる機能を網羅できるような形にしています。(本来は削除保護も有効にすべきですが)マルチAZでかつ、db.t3.mediumにしているのでやや高額になりますので注意しましょう。

如果使用db.t3.micro足够的话,您可以禁用性能洞察,下面是修改的方法。

# サイズはt3.micro
instance_class    = "db.t3.micro"

# シングルAZ構成
multi_az          = false
availability_zone = "ap-northeast-1a"

# パフォーマンスインサイトは無効(コメントアウト or 削除)
# performance_insights_enabled          = true
# performance_insights_retention_period = 7

那么,我们执行terraform apply,然后确认一下各项已经创建好了。接下来,我们将确认能够通过EC2连接并使用mysql命令。

mysql -h cloud02-db-instance.cnio2sb0qm8v.ap-northeast-1.rds.amazonaws.com -u admin -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 8.0.20 Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| cloud              |
| information_schema |
| innodb_memcache    |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

mysql> exit

また、CloudWatchのロググループを開いて、ログが保存されていることを確認しましょう。
/aws/rds/instance//が各種ログのエクスポートで、RDSOSMetricsがCPU使用率などの拡張モニタリングのログになります。

E67887BA-BBC4-4713-805B-B243454EB28A.png

今回は以上です。
これまで作成したリソースは不要になった時点でdestoryしておきましょう。くれぐれも高額なRDSを起動しっぱなしにしないようにだけご注意ください。CloudWatchのロググループは自動的に削除されないので手動で削除してください。

terraform destroy -auto-approve

总结

作りながら覚えるTerraform入門シリーズはひとまず終了ですが、また少し追記するかもしれません。
Terraformには Modules や Workspaces など、まだまだ便利な機能が他にもありますが、今回使用した機能だけでも十分にInfrastructure as Code(IaC)を体験できると思います。

我仍在学习阶段,但如果这对困惑的初学者有所帮助,我将感到幸运。

提供的参考链接

    • RDSのMySQL/MariaDBでログをCloudWatch Logsへ出力可能になりました

 

    • 拡張モニタリングの使用

 

    ignore_changes
广告
将在 10 秒后关闭
bannerAds