TerraformでRDSを構築するぞ
About
TerraformでRDSも作成できると、初期構築が早くなりそうなのでやってみます。
前提
- v0.6.14
- VPCなどの環境は事前に作成済み
RDS
RDSを構築するには4つのリソースが必要です。
aws_db_subnet_group
aws_security_group
aws_db_parameter_group
aws_db_instance
subnet
db用のsubnetを定義しましょう。
resource "aws_db_subnet_group" "db-subnet" { name = "test-db-subnet" description = "test db subnet" subnet_ids = ["${aws_subnet.private.0.id}", "${aws_subnet.private.1.id}"] }
security group
基本的にprivateなネットワークとの通信だけに限定し、ポートもDB用以外は閉じておきましょう。
resource "aws_security_group" "postgres" { name = "postgres" description = "for postgres" vpc_id = "${aws_vpc.test.id}" ingress { from_port = 5432 to_port =5432 protocol = "tcp" cidr_blocks = ["10.0.0.0/16"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } }
parameter group
パラメータグループはデフォルトで用意されているものもありますが、罠があるので専用に作った方がいい気がします。
resource "aws_db_parameter_group" "db-pg" { name = "test" family = "postgres9.5" description = "test" parameter { name = "log_min_duration_statement" value = "100" } }
AWS RDS デフォルトDBパラメータグループ運用止めませんか? - vague memory
db instance
passwordの情報をgitの管理下に置きたくない
tfファイルに設定を書いてしまってコミットしてしまうと、全世界にパスワードを公開することになります。private repositoryを使っているとしても、パスワードの情報をコミットしたくないところです。なので、環境変数を利用します。
# .envrc export TF_VAR_db_username=hogehoge export TF_VAR_db_password=hogehoge export AWS_ACCESS_KEY_ID=### export AWS_SECRET_ACCESS_KEY=### export AWS_DEFAULT_REGION=ap-northeast-1
このようにTF_VAR_
とすると環境変数から変数を読んでくれるので、パスワードなどを利用する際に便利です。
Configuring Variables - Terraform by HashiCorp
resource "aws_db_instance" "default" { identifier = "test" allocated_storage = 10 engine = "postgres" engine_version = "9.5.2" instance_class = "${var.rds_instance_class}" name = "${var.database_name}" username = "${var.db_username}" password = "${var.db_password}" db_subnet_group_name = "${aws_db_subnet_group.db-subnet.name}" vpc_security_group_ids = ["${aws_security_group.postgres.id}"] parameter_group_name = "${aws_db_parameter_group.db-pg.name}" multi_az = false backup_retention_period = "7" backup_window = "19:00-19:30" apply_immediately = "true" auto_minor_version_upgrade = false } output "rds_endpoint" { value = "${aws_db_instance.default.address}" }
output
の指定をするとエンドポイントが一目瞭然なので、便利です。
罠
この設定には罠があって、tfstate
ファイルには生のパスワードが記載されています。取り扱いには注意が必要そうです。
まとめ
Terraformをもっと使い倒していきたいものです…!