terraform cloudで初めるAWS その6: プライベートドメイン編

Share on:

これはシリーズ化する予定なので続きは←リンクからどうぞ。

ちなみに最低限AWSでEC2を起動してSSHした事程度は事ある人向けの記事です

前のDBの接続、とかに限った事じゃないですが、接続エンドポイントを持つものはコンソールにログインしてみないとわからないとかだと面倒なのでプライベートホストゾーンで管理したくなる所です。

まずこれに関しては料金がかかります。作った時点で0.5USDかかるらしいです。まあ50円くらいですが。

プライベートドメインは使われていないドメインなら何でもいいわけです。架空のTLDにしておく方がぶつかららないで良いかもしれません。それか既存の自分の所持しているドメインの下にブラ下げてその名前はプライベートとして外に出さなければ干渉しないという事ですネ。たとえば、ここだとprivate.gozapon.netとかなら自分の管轄なので引いて自分のプライベートIPが却ってくる分にはいいわけです。www.google.comとかにしてもいいけど、こうやってぶつかる事をすると、そのドメインの正規のアドレスにはアクセスできなくなるぞって事ですネ。

まあ、イマイチ文章だとわかり辛いんでやってみましょう。一応TLD**.test**はテスト用として使っていいという事になっているのでgozapon.testを作ってみます。

route53のページ https://console.aws.amazon.com/route53/home?region=ap-northeast-1#

から作ってもいいんだけどもVPCと連動していたりするので、network.tfからやってみましょう。

1resource "aws_route53_zone" "priv" {
2  name = "gozapon.test"
3
4  vpc {
5    vpc_id = aws_vpc.vpc.id
6  }
7}

applyするとちょっと時間かかるんだけど、これでプライベートドメインが出来ました。なお、作っただけで12時間くらいで消す場合は課金されないらしいです。まあ50円くらいの話なんだが…

プライベートドメインは消滅してもまた作ればいいという感もあるのでdataで定義してないです。そもそもdataにするとひっつけるvpc_idをどうするんだって問題がある。

プライベートドメインを引けるようにする準備

 1resource "aws_vpc" "vpc" {
 2  cidr_block           = "192.168.0.0/16"
 3  enable_dns_hostnames = true
 4
 5  tags = {
 6    Name = local.workspace
 7  }
 8}
 9
10resource "aws_route53_zone" "priv" {
11  name = "private.gozapon.example"
12
13  vpc {
14    vpc_id = aws_vpc.vpc.id
15  }
16}
17
18resource "aws_vpc_dhcp_options" "privdomain" {
19  domain_name         = "private.gozapon.example"
20  domain_name_servers = [cidrhost(aws_vpc.vpc.cidr_block, 2)]
21}
22
23resource "aws_vpc_dhcp_options_association" "dhcpopt" {
24  vpc_id          = aws_vpc.vpc.id
25  dhcp_options_id = aws_vpc_dhcp_options.privdomain.id
26}

詳細は大分割愛しますが、こうやっておくとDHCPでドメイン名を配ってくれます。

web.tfを少し修正してみます。

1resource "aws_route53_record" "web" {
2  zone_id = aws_route53_zone.priv.zone_id
3  name    = "vm2"
4  type    = "A"
5  ttl     = "300"
6  records = [aws_instance.web.private_ip]
7}

これvm2って名前だったのでそうしましたけど、適当なhost名を当ててあげてください。

あと、hostコマンドって入ってないから必要であればcloud-init.ymlを加工して入れるようにします。でなければいちいち手で入れます。

ここまでの確認

(一度destoy推奨)

これでapplyしてwebホストにsshしてみます。

1$ cat /etc/resolv.conf
2domain private.gozapon.example
3search private.gozapon.example
4nameserver 192.168.0.2

/etc/resolv.confにサートドメインが当てられています。

引いてみると

1$ host vm2
2vm2.private.gozapon.example has address 192.168.1.156

しっかり返ってくるようになりました

mysqlのエンドポイントを登録してみる

1resource "aws_route53_record" "mysql" {
2  zone_id = aws_route53_zone.priv.zone_id
3  name    = "db"
4  type    = "CNAME"
5  ttl     = "300"
6  records = ["${aws_db_instance.db.address}."]
7}

db.tfでいいんじゃないでしょうか?

web内のhost名とかfqdnとかはcloud-init.ymlで設定する場合は設定してあげてください。

確認してみる

1$ host db
2db.private.gozapon.example is an alias for vm2-replace.czxd3vjyribx.ap-northeast-1.rds.amazonaws.com.
3vm2-replace.czxd3vjyribx.ap-northeast-1.rds.amazonaws.com has address 192.168.0.222

よさそうです。

まとめ

プライベートホストゾーンを使うとmysqlのDNSとかいちいち探さなくてよくなり大変作業が楽になります(設定とかも)。0.5USDなので是非検討してください。

あと、ドメインはsettings.tfとかで変数にしておいた方がよいでしょうからやってみてください。