😸

【CloudFormation】Route53のパブリックホストゾーンをデプロイしてみる

2022/07/31に公開

1. はじめに

 こんにちわ、Mitsuoです。
今回はCloudFormationを用いてRoute53のホストゾーンをデプロイしてみました。
Route53とは、フルマネージドなDNSサーバサービスです。利用者がBINDなどを構築せずともAWSのサービスとして名前解決の仕組みを導入する事が出来ます。
事前にドメインを取得する事が前提にはなりますが、Route53を利用するにあたり、最初にホストゾーンと言うレコード情報を登録するリソースを作成します。ホストゾーンの作成後、そのホストゾーン上に自動でSOAレコードとNSレコードが生成され、他のレコードを登録することが出来ます。

ですので、レコードセットを登録しないと実用が出来ないのですが、レコードセットはCLIで行うケースも多いと思っており、ホストゾーン単体のテンプレートがあっても良いかなと思い記事にします。
決して面倒になって後回しにした訳では無いですよ?
また、今回はパブリック用ホストゾーンの作成になります。

なお、テンプレートに関連して一部の機能の説明はありますが、Route53の概要に関しては解説していないため、公式ドキュメントや他の技術ブログを参照してください。

参考:What is Amazon Route 53?
参考:AWS再入門ブログリレー Amazon Route 53編

クラスメソッドさんの再入門ブログリレーにも書かれていますが、Route53に関しては、AWSサービスの理解よりDNS自体の理解が求められると思っています。どのように名前解決されるのか、レコードの種別に関する知識は、最低限理解する事をお勧めします。
個人的には以下のブログが非常に分かりやすいと思いました。

参考:【初心者向け】無料ドメインを使ってAmazon Route 53で実装しながら理解するDNS

また、EC2にBINDをインストールして動かしてみるのも、Route53がどれだけマネージドに名前解決の仕組みを提供しているかが分かるので、時間がある方は調べてみてください。

3. 作成したリソース

 テンプレートで作成するリソースは以下の通りです。

  • Route53 パブリックホストゾーン

4 テンプレート情報

 作成したテンプレートになります。


AWSTemplateFormatVersion: '2010-09-09'
Description: Deploy a Route53 HostedZone.
# ------------------------------------------------------------#
#  Caution:
#  This template is for deploying Route53 HostedZone.
#  If your domain is registered with a registrar other than Route 53, 
#  you must update the name servers with your registrar to make Route 53 the DNS service for the domain.
#  For more information, see https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/MigratingDNS.html 
# ------------------------------------------------------------#
#  Metadata:
#  This can privide details about the template.
#  For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html.
#  As Metadata Keys, AWS::CloudFormation::Interface can Defines the grouping and ordering of input parameters
#  when they are displayed in the AWS CloudFormation console.
#  For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-interface.html.
# ------------------------------------------------------------# 

Metadata: 
  "AWS::CloudFormation::Interface": 
    ParameterGroups:
      -  
        Parameters:
          - SystemName
          - EnvType 
          - Tagprefix
          - Owner 
          - DomainName

    ParameterLabels: 
      SystemName:
        default: "Type the Systemname"
      EnvType:
        default: "Select the environment in which you deploy resources"
      Tagprefix:
        default: "Type the Tagprefix which is logical unit name about this stack(e.g. Webserver,Monitoring,Logging)"
      Owner:
        default: "Type who owns these resources (e.g. project name or worker, whether this purpose is just verification or not)"    
      DomainName:
        default: "Type the name of domain, which Specify a fully qualified domain name, for example, www.example.com. The trailing dot is optional"

# ------------------------------------------------------------#
# Parameters
# This Can enable templates to input custom values each time you create or update a stack.
# For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html.
# ------------------------------------------------------------# 

Parameters:
  SystemName:
    Type: String
  EnvType:
    Type: String
    Default: "dev"
    AllowedValues:
      - dev
      - prod   
  Tagprefix:
    Type: String      
  Owner:
    Type: String  
  DomainName:
    Type: String  
    Default: "www.example.com"  
    AllowedPattern: "(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)"
    ConstraintDescription: "Must be a valid the name of domain."   

# ------------------------------------------------------------#
# Resources
# This can declare the AWS resources that you want to include in the stack.
# For more information, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html.
# ------------------------------------------------------------# 

Resources:

# ------------------------------------------------------------#
# Create Route53 Hosted Zone
# This Matadata and Parameters are not used by Hosted zone but HostedZoneTags, 
# ------------------------------------------------------------#

  HostedZone1: 
    Type: "AWS::Route53::HostedZone"
    Properties: 
      HostedZoneConfig: 
        Comment: "Enter any comments you would like to make"
      Name: !Sub "${DomainName}"
      HostedZoneTags: 
        - Key: "Name"
          Value: !Sub "${SystemName}-${EnvType}-${Tagprefix}-HostedZone"
        - Key: 'Owner'
          Value: !Sub "Owner"

5 補足情報

テンプレートに関して、以下の通り補足します。

5.1 Metadata/Parameters

 メタデータおよびパラメターセクションで、以下の値を定義します。

項目 備考
SystemName プロジェクト名や利用目的等を入力する
EnvType デプロイする環境を選択する
検証、ステージング、本番の3点
Tagprefix 任意で入力するPrefix値
Owner 作業者、所有者、コスト管理用に入力する

5.2 想定ユースケース

 今回のテンプレートは、次の様なユースケースを想定して作成しました。

  • ドメイン名を取得済みの人がホストゾーン作成を自動化したい
  • リソースレコードは手動またはCLIなどで対応する予定の方
  • DNSクエリログ設定は行わない
  • パブリック用ホストゾーン
    • プライマリ用ホストゾーンはAWS::Route53::HostedZoneで作成する事が出来る
    • プロパティVPCの有無によって、パブリックかプライベートホストゾーンかをテンプレートは判断する

テンプレートに関しては、公式ドキュメントを参照ください。

AWS::Route53::HostedZone
AWS::Route53::HostedZone VPC
AWS::Route53::HostedZone QueryLoggingConfig

書いてて思ってますが、こんなピンポイントでいるのか?とは思っています。
とりあえず、今後リソースレコード用のテンプレートは書くので静観いただけると。

5.3 動作確認

 実際に動作を確認してみます。
上記のテンプレートを用いてホストゾーンを作成します。

スタック名:Route53HostedZone

項目 備考
SystemName mitsuopj
EnvType dev
Tagprefix image
Owner routetraffic
DomainName 取得したドメイン名

Route53、またはドメインレジストラで取得したドメイン名を入力してください。
ドメイン名はFQDNで入力が必要です。
ルートドメイン(ドメイン名の末尾にあるドット)の入力はAWS側が補完してくれるので、どちらでも大丈夫です。
つまりwww.example.comwww.example.com.は同一としてみなされます。

ではスタックを作成します。

image

パラメータ値の情報でもドメイン名が確認が出来ます。
ドメイン名を黒塗りにしていますが、www.example.comに読み替えて見て頂ければ思います。

image

ホストゾーンが作成されたことを確認します。

ホストゾーンの中にデフォルトでSOAレコードとNSレコードが作成されていますね。
政治家の報告文書の様になっています。

image

5.4 留意事項

 留意事項は以下の通りです。

  • ドメインレジストラ、例えばお名前.comなどでドメイン登録を行った場合、ホストゾーン内のNSレコードの値をレジストラ側に設定する必要がある
  • お名前.comで登録したドメインの管理方法についてクラスメソッドさんの記事がありました、ご参考まで

お名前.comで取得したドメインをRoute53のネームサーバで管理設定してみた

公式ドキュメントもよければ参考ください。
Making Amazon Route 53 the DNS service for an existing domain

  • 余談になりますが、ドメイン名の参照に!Ref関数を使う事が出来なかったので、!Sub関数を使うようにしている

5.5 まとめ

 今回はホストゾーンを作成してみました。次回以降の記事でレコードセットを含めた内容に出来ればと思います。
テンプレートは自己責任でご自由にお使いください。

このブログが誰かの役に立てばと思います。Mituoでした!!

5.6 参考資料

What is Amazon Route 53?
AWS再入門ブログリレー Amazon Route 53編
【初心者向け】無料ドメインを使ってAmazon Route 53で実装しながら理解するDNS
AWS::Route53::HostedZone
AWS::Route53::HostedZone VPC
AWS::Route53::HostedZone QueryLoggingConfig
お名前.comで取得したドメインをRoute53のネームサーバで管理設定してみた
Making Amazon Route 53 the DNS service for an existing domain

Discussion