terraformを使ってVPC+EC2+RDS(aurora-mysql)の設定を実施してみます。
かなり一般的な構成だと思うのですがaurora-mysqlでまとまっているものが調べるのが大変でしたので記載してみます。
VPC+EC2+RDSのベーシックな構成をシンプルにまとめてみます。
terraformでVPCの設定
まず、VPCの部分から記載しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
######################### ## VPC ######################### resource "aws_vpc" "default" { cidr_block = "10.0.0.0/16" } resource "aws_subnet" "subnet_1a" { vpc_id = "${aws_vpc.default.id}" availability_zone = "ap-northeast-1a" cidr_block = "10.0.1.0/24" } resource "aws_subnet" "subnet_1c" { vpc_id = "${aws_vpc.default.id}" availability_zone = "ap-northeast-1c" cidr_block = "10.0.2.0/24" } resource "aws_internet_gateway" "default" { vpc_id = "${aws_vpc.default.id}" } resource "aws_route_table" "default" { vpc_id = "${aws_vpc.default.id}" route { cidr_block = "0.0.0.0/0" gateway_id = "${aws_internet_gateway.default.id}" } } resource "aws_route_table_association" "subnet_1a" { subnet_id = "${aws_subnet.subnet_1a.id}" route_table_id = "${aws_route_table.default.id}" } resource "aws_route_table_association" "subnet_1c" { subnet_id = "${aws_subnet.subnet_1c.id}" route_table_id = "${aws_route_table.default.id}" } |
ここでは特に難しい部分はないですが、RDSではサブネットを複数に所属する必要があるのでサブネットを2つ作っています。
terraformでEC2の設定
今回、EC2への接続についてはローカルでssh keyの作成をしてからの構築を行なっています。
指定する値は公開鍵をterraformで指定して、秘密鍵を使ってsshで接続する方式です。
まず、鍵の作成は以下で行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
% ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/test/.ssh/id_rsa): ./test-key Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ./test-key. Your public key has been saved in ./test-key.pub. The key fingerprint is: SHA256:G8VvqCQKOFskRT4Y+HsrlfJIEy6jDVJ4bR3NRQvNdro test@test.local The key's randomart image is: +---[RSA 3072]----+ |o.o o.=o | |.= . oo+.. | |oo+. . . .+o | |.+=.o . ..o | |o+o+ .. S ..o | |=+*.+. o +E. | |+* B.. o | |. + o | | . | +----[SHA256]-----+ |
こちらでできた「test-key.pub」の中身を「public_key」に設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
######################### ## EC2 ######################### resource "aws_security_group" "ssh" { name = "ssh" vpc_id = "${aws_vpc.default.id}" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["XXX.XXX.XXX.XXX/32", "XXX.XXX.XXX.XXX/32"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_key_pair" "default" { key_name = "test_key" public_key = "ssh-rsa XXXXXX= test@test.local" } resource "aws_instance" "default" { # Amazon Linux 2 AMI (HVM), SSD Volume Type ami = "ami-e99f4896" instance_type = "t2.micro" associate_public_ip_address = "true" key_name = "${aws_key_pair.default.key_name}" subnet_id = "${aws_subnet.subnet_1a.id}" vpc_security_group_ids = ["${aws_security_group.ssh.id}"] root_block_device { volume_type = "standard" volume_size = "50" delete_on_termination = "false" } } resource "aws_eip" "default" { instance = "${aws_instance.default.id}" vpc = true } |
AMIでは「Amazon Linux 2 AMI (HVM), SSD Volume Type」を設定してEC2インスタンスを構築しています。
「vpc_security_group_ids」では自身で接続する環境のIPを指定してください。
terraformでRDS(aurora-mysql)の設定
aurora-mysqlのRDSの構築となります。
ユーザーIDとパスワードを記載していますが通常ではこちらはtfvarsなどのファイルに隠してgitなどにもアップしないでください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
######################### ## RDS ######################### resource "aws_db_subnet_group" "default" { name = "test" subnet_ids = ["${aws_subnet.subnet_1a.id}", "${aws_subnet.subnet_1c.id}"] } resource "aws_security_group" "mysql" { name = "mysql" vpc_id = "${aws_vpc.default.id}" ingress { from_port = 3306 to_port = 3306 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"] } } resource "aws_db_parameter_group" "default" { name = "test" family = "aurora-mysql5.7" } resource "aws_rds_cluster" "default" { cluster_identifier = "test" engine = "aurora-mysql" engine_version = "5.7.mysql_aurora.2.08.1" copy_tags_to_snapshot = true skip_final_snapshot = true database_name = "test" db_subnet_group_name = "${aws_db_subnet_group.default.name}" master_username = "root" master_password = "Samp1ePassw0rd" port = 3306 vpc_security_group_ids = ["${aws_security_group.mysql.id}"] } resource "aws_rds_cluster_instance" "default" { count = "1" cluster_identifier = "${aws_rds_cluster.default.id}" instance_class = "db.t3.small" engine = "aurora-mysql" db_parameter_group_name = "${aws_db_parameter_group.default.name}" } |
「aws_db_parameter_group」ではmysqlに関する様々なパラメーターを指定できます。
文字コードなどもこちらで設定できます。
こちらをapplyするとRDSなど管理コンソールで作成されているのが確認できます。
EC2にSSHログインし、mysql-clientをインストールするとRDSにログインできます。(エンドポイントやIPは管理コンソールで確認してください)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# mysql -u root -p -h charge-db-cluster.cluster-xxxxxxxx.ap-northeast-1.rds.amazonaws.com Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.7.12 MySQL Community Server (GPL) 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 | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.01 sec) |
慣れるとRDSでの接続環境が非常に早く構築できます。
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。