tjinjin's blog

インフラ要素多めの個人メモ

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をもっと使い倒していきたいものです…!