AWS-CloudFormation

CloudFormationでRoute53のホストゾーンを作成してEIPとELBのDNS名をレコードに追加する

CloudFormation で Route53 のホストゾーンを作成して EIP と ELB の DNS 名をレコードに追加する

こんにちは、SRE課の栩野です。

CloudFormation で Route53 を作成する機会があったので
ホストゾーンを作成しつつ、EIP と ELB の DNS 名をレコードに登録する方法についてネタにします。

事前準備

今回は Route53 のテンプレート作成がメインなので、他のテンプレート作成については触れません。

とりあえずの事前準備として、EC2 と ELB のスタックを作成する際に
EIP と DNS 名をアウトプットしておく必要があるので以下の通りに Outputs の設定が必要です。

Outputs:
  # EIPをアウトプット
  ElasticIP:
    # Type: "AWS::EC2::EIP" のリソースをアウトプット
    Value: !Ref ElasticIP
    # Route53 側で呼び出すために名前をつけてExport
    Export:
      Name: elasticip
  # ELBのDNSNameをアウトプット
  ALBDNSName:
    # Type: AWS::ElasticLoadBalancingV2::LoadBalancer のリソースから
    # DNSNameをアウトプット
    Value: !GetAtt ALB.DNSName
    Export:
      Name: alb-dnsname
  # ELBのCanonicalHostedZoneIDをアウトプット
  ALBHostedZoneID:
    # Type: AWS::ElasticLoadBalancingV2::LoadBalancer のリソースから
    # CanonicalHostedZoneIDをアウトプット
    Value: !GetAtt ALB.CanonicalHostedZoneID
    Export:
      Name: alb-hostzoneid

Route53 のテンプレート作成

EIP と ELB の DNS 名がアウトプット出来ていれば
以下のテンプレートを使って、Route53 のホストゾーンとレコードを作成することが出来ます。

テンプレートでは、apex(サブドメインなし)の A レコードに直接 EIP を設定して
www の A レコードに ELB の DNS 名を設定する形で作成してます。

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  # とりあえずはスタック作成時にパラメータでドメイン名入力する
  HostedZoneName:
    Description: domain name.
    Type: String

Resources:
  # ホストゾーンの作成
  Route53HostedZone:
    Type: AWS::Route53::HostedZone
    Properties:
      # ここにはパラメータで入力したドメイン名が入る
      Name: !Sub "${HostedZoneName}"
  # レコードの作成
  route53RSGroup:
    Type: AWS::Route53::RecordSetGroup
    Properties:
      # 上記で作成したホストゾーンを指定
      HostedZoneId: !Ref Route53HostedZone
      # ここからレコードの作成部分 (Aレコードを二つ作成する)
      RecordSets:
        # apex(サブドメインなし)の設定
        - Name: !Sub "${HostedZoneName}."
          # 事前準備でアウトプットしたEIPをImportValueで呼び出して設定
          ResourceRecords:
            - !ImportValue elasticip
          # TypeはAレコード
          Type: A
          # とりあえずTTL300にする
          TTL: 300
        # wwwの設定
        - Name: !Sub "www.${HostedZoneName}."
          # ELBのドメイン名を設定するときはAliasTargetを使う
          AliasTarget:
            # 事前準備でアウトプットしたCanonicalHostedZoneIDを設定
            HostedZoneId: !ImportValue alb-hostzoneid
            # 事前準備でアウトプットしたDNSNameを設定
            DNSName: !ImportValue alb-dnsname
          Type: A

このテンプレートからスタックを作成すると...

こんな感じで Route53 にホストゾーンが作成され
apex に EIP、www に ELB の DNS 名が設定されました!

次回はこの延長で、CloudFormation で ACM の証明書を取得して
ELB に適用する方法をネタにしてみようと思います。

以上、最後までありがとうございました。

参考

aws::route53::hostedzone (AWS ドキュメント)
aws::route53::recordsetgroup (AWS ドキュメント)

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA