🐙

AWS VPC EndpointServiceのPrivateDNS機能の有効化をTerraformで行う方法

2021/10/10に公開

この記事のスコープ

この記事ではAWS PrivateLinkでPrivateDNS機能を利用する際に、Terraformでどのようなコードを書けばいいのかまとめました。
なお、コードについてはVPC Endpoint Service/VPC Endpoint/Route53のもののみ記載します。
※前提となるVPCなどのリソースやNLBについてはこの記事では割愛します。

解説

VPC Endpoint Serivce

VPC Endpoint ServiceでPrivateDNS機能を有効とするためには、private_dns_nameに利用したいドメイン名を記載します。

resource "aws_vpc_endpoint_service" "example" {
  acceptance_required        = false
  network_load_balancer_arns = [aws_lb.example.arn]
  private_dns_name = "利用したいドメイン名"
  depens_on = [aws_lb.example]
}

Route53

VPC Endpoint Serviceにドメイン名を設定するとTXTレコードの登録に必要な各種情報が出力できるようになります。
これをRoute53に登録します。

resource "aws_route53_record" "example" {
  zone_id = aws_route53_zone.primary.id
  type = lookup(element(aws_vpc_endpoint_service.example.private_dns_name_configuration, 0), "type")
  name = "${lookup(element(aws_vpc_endpoint_service.example.private_dns_name_configuration, 0), "name")}.利用したいドメイン名"
  records = [lookup(element(aws_vpc_endpoint_service.example.private_dns_name_configuration, 0), "value")]
  ttl = 1800
}

VPC Endpoint

接続するVPC EndpointでVPC EndpointServiceで指定したドメインを利用したい場合には、private_dns_enabledtrueにします。

resource "aws_vpc_endpoint" "example" {
  vpc_id            = aws_vpc.main.id
  service_name      = aws_vpc_endpoint_service.example.service_name
  vpc_endpoint_type = "Interface"

  security_group_ids = [
    aws_security_group.example_sg.id,
  ]

  private_dns_enabled = true
}

おわりに

VPC間を接続する際に「ドメイン名を固定して通信したい」という要望があり調べました。
調べていく中で、まとまっている記事がなくて困ったので、備忘もかねて書きました。
この記事が何かの参考になれば幸いです。

Discussion