🧸

【CFn】公式SampleテンプレートからRoute53 A/CNAME/加重CNAME レコード登録を学ぶ。

2022/10/29に公開

今回はRoute53のレコード登録を勉強していきます。

元テンプレ

Route53とは

AmazonRoute53は、可用性と拡張性に優れたドメインネームシステム(DNS)ウェブサービスです。
Route53を使用すると、ドメイン登録、DNSルーティング、ヘルスチェックの3つの主要な機能を任意の組み合わせで実行できます。

Amazon Route 53 とは?

作成するレコードタイプ

A レコードタイプ
IPv4アドレスを使用して、ウェブサーバーなどのリソースにトラフィックをルーティングします。

CNAME レコードタイプ
CNAME レコードは現在のレコードの名前に対するDNSクエリを、別のドメインまたはサブドメインにマッピングします。

サポートされる DNS レコードタイプ

AWS::Route53::RecordSet内のTypeプロパティの説明欄には

基本的なリソース レコード セットの有効な値: A| AAAA| | CAA| | CNAME| | DS| | MX| | NAPTR| | NS| | PTR| | SOA| | SPF| | SRV| |TXT

加重、レイテンシ、地理位置情報、およびフェイルオーバー リソース レコード セットの値: A| AAAA| | CAA| | CNAME| | MX| | NAPTR| | PTR| | SPF| | SRV| | TXT. 加重、レイテンシ、位置情報、またはフェイルオーバー リソース レコード セットのグループを作成する場合は、グループ内のすべてのリソース レコード セットに同じ値を指定します。

とあります。

上記のように種類は様々ありますが、今回はAとCNAME・加重のCNAMEレコードの例です。

Aレコード

今回のAレコードのテンプレについての説明欄の記載です。

AmazonEC2インスタンスのパブリックIPアドレスにマップするRoute 53Aレコードを作成します。

加えてテンプレ内のDiscriptionにも「 It assumes that you already have a Hosted Zone registered with Amazon Route 53( すでにAmazon Route53にHosted Zoneが登録されていることを想定しています。)」とあります。

ドメインとホストゾーンの登録がない場合適宜ご用意お願いします。

a_record
a_record.yml
AWSTemplateFormatVersion: 2010-09-09
Description: >-
  AWS CloudFormation Sample Template Route53_A: Sample template showing how to
  create an Amazon Route 53 A record that maps to the public IP address of an
  EC2 instance. It assumes that you already have a Hosted Zone registered with
  Amazon Route 53. **WARNING** This template creates an Amazon EC2 instance. You
  will be billed for the AWS resources used if you create a stack from this
  template.

Parameters:
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.small
    AllowedValues:
      - t1.micro
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - m1.small
      - m1.medium
      - m1.large
      - m1.xlarge
      - m2.xlarge
      - m2.2xlarge
      - m2.4xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - c1.medium
      - c1.xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - g2.2xlarge
      - g2.8xlarge
      - r3.large
      - r3.xlarge
      - r3.2xlarge
      - r3.4xlarge
      - r3.8xlarge
      - i2.xlarge
      - i2.2xlarge
      - i2.4xlarge
      - i2.8xlarge
      - d2.xlarge
      - d2.2xlarge
      - d2.4xlarge
      - d2.8xlarge
      - hi1.4xlarge
      - hs1.8xlarge
      - cr1.8xlarge
      - cc2.8xlarge
      - cg1.4xlarge
    ConstraintDescription: must be a valid EC2 instance type.

  HostedZone:
    Type: String
    Description: The DNS name of an existing Amazon Route 53 hosted zone
    AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
    ConstraintDescription: must be a valid DNS zone name.

Mappings:
  AWSInstanceType2Arch:
    t1.micro:
      Arch: HVM64
    t2.nano:
      Arch: HVM64
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    t2.large:
      Arch: HVM64
    m1.small:
      Arch: HVM64
    m1.medium:
      Arch: HVM64
    m1.large:
      Arch: HVM64
    m1.xlarge:
      Arch: HVM64
    m2.xlarge:
      Arch: HVM64
    m2.2xlarge:
      Arch: HVM64
    m2.4xlarge:
      Arch: HVM64
    m3.medium:
      Arch: HVM64
    m3.large:
      Arch: HVM64
    m3.xlarge:
      Arch: HVM64
    m3.2xlarge:
      Arch: HVM64
    m4.large:
      Arch: HVM64
    m4.xlarge:
      Arch: HVM64
    m4.2xlarge:
      Arch: HVM64
    m4.4xlarge:
      Arch: HVM64
    m4.10xlarge:
      Arch: HVM64
    c1.medium:
      Arch: HVM64
    c1.xlarge:
      Arch: HVM64
    c3.large:
      Arch: HVM64
    c3.xlarge:
      Arch: HVM64
    c3.2xlarge:
      Arch: HVM64
    c3.4xlarge:
      Arch: HVM64
    c3.8xlarge:
      Arch: HVM64
    c4.large:
      Arch: HVM64
    c4.xlarge:
      Arch: HVM64
    c4.2xlarge:
      Arch: HVM64
    c4.4xlarge:
      Arch: HVM64
    c4.8xlarge:
      Arch: HVM64
    g2.2xlarge:
      Arch: HVMG2
    g2.8xlarge:
      Arch: HVMG2
    r3.large:
      Arch: HVM64
    r3.xlarge:
      Arch: HVM64
    r3.2xlarge:
      Arch: HVM64
    r3.4xlarge:
      Arch: HVM64
    r3.8xlarge:
      Arch: HVM64
    i2.xlarge:
      Arch: HVM64
    i2.2xlarge:
      Arch: HVM64
    i2.4xlarge:
      Arch: HVM64
    i2.8xlarge:
      Arch: HVM64
    d2.xlarge:
      Arch: HVM64
    d2.2xlarge:
      Arch: HVM64
    d2.4xlarge:
      Arch: HVM64
    d2.8xlarge:
      Arch: HVM64
    hi1.4xlarge:
      Arch: HVM64
    hs1.8xlarge:
      Arch: HVM64
    cr1.8xlarge:
      Arch: HVM64
    cc2.8xlarge:
      Arch: HVM64
  AWSInstanceType2NATArch:
    t1.micro:
      Arch: NATHVM64
    t2.nano:
      Arch: NATHVM64
    t2.micro:
      Arch: NATHVM64
    t2.small:
      Arch: NATHVM64
    t2.medium:
      Arch: NATHVM64
    t2.large:
      Arch: NATHVM64
    m1.small:
      Arch: NATHVM64
    m1.medium:
      Arch: NATHVM64
    m1.large:
      Arch: NATHVM64
    m1.xlarge:
      Arch: NATHVM64
    m2.xlarge:
      Arch: NATHVM64
    m2.2xlarge:
      Arch: NATHVM64
    m2.4xlarge:
      Arch: NATHVM64
    m3.medium:
      Arch: NATHVM64
    m3.large:
      Arch: NATHVM64
    m3.xlarge:
      Arch: NATHVM64
    m3.2xlarge:
      Arch: NATHVM64
    m4.large:
      Arch: NATHVM64
    m4.xlarge:
      Arch: NATHVM64
    m4.2xlarge:
      Arch: NATHVM64
    m4.4xlarge:
      Arch: NATHVM64
    m4.10xlarge:
      Arch: NATHVM64
    c1.medium:
      Arch: NATHVM64
    c1.xlarge:
      Arch: NATHVM64
    c3.large:
      Arch: NATHVM64
    c3.xlarge:
      Arch: NATHVM64
    c3.2xlarge:
      Arch: NATHVM64
    c3.4xlarge:
      Arch: NATHVM64
    c3.8xlarge:
      Arch: NATHVM64
    c4.large:
      Arch: NATHVM64
    c4.xlarge:
      Arch: NATHVM64
    c4.2xlarge:
      Arch: NATHVM64
    c4.4xlarge:
      Arch: NATHVM64
    c4.8xlarge:
      Arch: NATHVM64
    g2.2xlarge:
      Arch: NATHVMG2
    g2.8xlarge:
      Arch: NATHVMG2
    r3.large:
      Arch: NATHVM64
    r3.xlarge:
      Arch: NATHVM64
    r3.2xlarge:
      Arch: NATHVM64
    r3.4xlarge:
      Arch: NATHVM64
    r3.8xlarge:
      Arch: NATHVM64
    i2.xlarge:
      Arch: NATHVM64
    i2.2xlarge:
      Arch: NATHVM64
    i2.4xlarge:
      Arch: NATHVM64
    i2.8xlarge:
      Arch: NATHVM64
    d2.xlarge:
      Arch: NATHVM64
    d2.2xlarge:
      Arch: NATHVM64
    d2.4xlarge:
      Arch: NATHVM64
    d2.8xlarge:
      Arch: NATHVM64
    hi1.4xlarge:
      Arch: NATHVM64
    hs1.8xlarge:
      Arch: NATHVM64
    cr1.8xlarge:
      Arch: NATHVM64
    cc2.8xlarge:
      Arch: NATHVM64
  AWSRegionArch2AMI:
    af-south-1:
      HVM64: ami-064cc455f8a1ef504
      HVMG2: NOT_SUPPORTED
    ap-east-1:
      HVM64: ami-f85b1989
      HVMG2: NOT_SUPPORTED
    ap-northeast-1:
      HVM64: ami-0b2c2a754d5b4da22
      HVMG2: ami-09d0e0e099ecabba2
    ap-northeast-2:
      HVM64: ami-0493ab99920f410fc
      HVMG2: NOT_SUPPORTED
    ap-northeast-3:
      HVM64: ami-01344f6f63a4decc1
      HVMG2: NOT_SUPPORTED
    ap-south-1:
      HVM64: ami-03cfb5e1fb4fac428
      HVMG2: ami-0244c1d42815af84a
    ap-southeast-1:
      HVM64: ami-0ba35dc9caf73d1c7
      HVMG2: ami-0e46ce0d6a87dc979
    ap-southeast-2:
      HVM64: ami-0ae99b503e8694028
      HVMG2: ami-0c0ab057a101d8ff2
    ca-central-1:
      HVM64: ami-0803e21a2ec22f953
      HVMG2: NOT_SUPPORTED
    cn-north-1:
      HVM64: ami-07a3f215cc90c889c
      HVMG2: NOT_SUPPORTED
    cn-northwest-1:
      HVM64: ami-0a3b3b10f714a0ff4
      HVMG2: NOT_SUPPORTED
    eu-central-1:
      HVM64: ami-0474863011a7d1541
      HVMG2: ami-0aa1822e3eb913a11
    eu-north-1:
      HVM64: ami-0de4b8910494dba0f
      HVMG2: ami-32d55b4c
    eu-south-1:
      HVM64: ami-08427144fe9ebdef6
      HVMG2: NOT_SUPPORTED
    eu-west-1:
      HVM64: ami-015232c01a82b847b
      HVMG2: ami-0d5299b1c6112c3c7
    eu-west-2:
      HVM64: ami-0765d48d7e15beb93
      HVMG2: NOT_SUPPORTED
    eu-west-3:
      HVM64: ami-0caf07637eda19d9c
      HVMG2: NOT_SUPPORTED
    me-south-1:
      HVM64: ami-0744743d80915b497
      HVMG2: NOT_SUPPORTED
    sa-east-1:
      HVM64: ami-0a52e8a6018e92bb0
      HVMG2: NOT_SUPPORTED
    us-east-1:
      HVM64: ami-032930428bf1abbff
      HVMG2: ami-0aeb704d503081ea6
    us-east-2:
      HVM64: ami-027cab9a7bf0155df
      HVMG2: NOT_SUPPORTED
    us-west-1:
      HVM64: ami-088c153f74339f34c
      HVMG2: ami-0a7fc72dc0e51aa77
    us-west-2:
      HVM64: ami-01fee56b22f308154
      HVMG2: ami-0fe84a5b4563d8f27

Resources:

  EC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !FindInMap # ↑のパラメータで選択したインスタンスタイプとスタック作成リージョンから、↑のMappingsされたAMIを参照。
        - AWSRegionArch2AMI
        - !Ref 'AWS::Region'
        - !FindInMap 
          - AWSInstanceType2Arch
          - !Ref InstanceType
          - Arch
      InstanceType: !Ref InstanceType  # ↑のパラメータで選択したインスタンスタイプ

  MyDNSRecord:
    Type: 'AWS::Route53::RecordSet' # 「作成するレコードに関する情報。」との事。
    Properties:
      HostedZoneName: !Join # [必須: いいえ] HostedZoneNameまたはHostedZoneIdのいずれかをの指定は必須。レコードを作成するホストゾーンの名前。「一致するホストゾーンを見つけられない場合CFnはスタックを作成しません。」との事。
        - ''
        - - !Ref HostedZone # パラメータで指定したホストゾーンを参照。
          - .
      Comment: DNS name for my instance. #[必須: いいえ] 「オプション:変更バッチリクエストに関して含めたい任意のコメント。」との事。
      Name: !Join #[必須: はい] ChangeResourceRecordSetsリクエストの場合、作成、更新、または削除するレコードの名前。応答の場合ListResourceRecordSets、指定されたホストゾーン内のレコードの名前。
        - ''
        - - !Ref EC2Instance
          - .
          - !Ref 'AWS::Region'
          - .
          - !Ref HostedZone
          - .
      Type: A #[必須: はい] DNS レコードの種類。許容値:A | AAAA | CAA | CNAME | DS | MX | NAPTR | NS | PTR | SOA | SPF | SRV | TXT
      TTL: '900' #[必須: いいえ] リソース レコード キャッシュの存続時間 (TTL) (秒単位)。
      ResourceRecords: #[必須: いいえ] Typeプロパティに指定した値に対応する 1 つ以上の値。TypeにAを指定した場合IPv4 形式で1 つ以上のIP アドレスを指定します。
        - !GetAtt 
          - EC2Instance # ↑で作成したEC2に紐づいた
          - PublicIp # パブリックIPを参照 ※↑のEC2作成時にはNetworkInterfacesプロパティのAssociatePublicIpAddressを指定していないが当該項目のデフォルト値はtrueの為、参照可能。

Outputs:
  DomainName:
    Description: Fully qualified domain name # 直訳:完全修飾ドメイン名
    Value: !Ref MyDNSRecord # AWS::Route53::RecordSetの!Ref 戻り値「レコードセットのドメイン名の値(など)を返します」

スタック名とパラメータを入力して「スタック作成」ボタンを押下します。

CREATE_COMPLETEしました。

出力タブにドメイン名が値として表示されています。

このスタックでは他の設定を何もしていないのでアクセスしても接続拒否されますが、

コンソールでホストゾーンを確認するとレコードが追加されていました。

EC2のパブリックIPと一致しています。

スタックを削除するとAレコードも削除されました。

CNAMEレコード

テンプレ説明欄の記載。

Route 53 CNAME レコードを作成します。

こちらも先ほどと同じくホストゾーン設定済の前提になります。

前章のAレコードのコードブロック内でプロパティについては殆ど触れたのでコメントも一箇所だけです。

cname_record
details cname_record.yml
AWSTemplateFormatVersion: 2010-09-09
Description: >-
  AWS CloudFormation Sample Template Route53_CNAME: Sample template showing how
  to create an Amazon Route 53 CNAME record.  It assumes that you already have a
  Hosted Zone registered with Amazon Route 53. **WARNING** This template creates
  one or more AWS resources. You will be billed for the AWS resources used if
  you create a stack from this template.
Parameters:

  HostedZone:
    Type: String
    Description: The DNS name of an existing Amazon Route 53 hosted zone
    AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
    ConstraintDescription: must be a valid DNS zone name.

Resources:
  MyDNSRecord:
    Type: 'AWS::Route53::RecordSet'
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZone
          - .
      Comment: CNAME redirect to aws.amazon.com.
      Name: !Join 
        - ''
        - - !Ref 'AWS::StackName'
          - .
          - !Ref 'AWS::Region'
          - .
          - !Ref HostedZone
          - .
      Type: CNAME
      TTL: '900'
      ResourceRecords: # 先程のAレコードのテンプレでは作成したEC2のパブリックIPを指定していましたが、↑のCommentにもあるようにamazon.comにリダイレクトするように指定しています。
        - aws.amazon.com
Outputs:
  CNAME:
    Description: Fully qualified domain name
    Value: !Ref MyDNSRecord

入力してスタック作成ボタンをクリックします。

CREATE_COMPLETEしました。

ホストゾーン内にCNAMEレコードが出来ています。
値も指定通り"aws.amazon.com"になっています。

出力されているドメイン名にアクセスしても実際はamazon.comが管理しているサイトですから不正なアクセスとして拒否されますが

本筋とは違いますが、「Generated by cloudfront (CloudFront)」の表示についてもいずれ自分で調べてみたいと思います。

加重CNAMEレコード

weighted_cname_record
weighted_cname_record.yml
AWSTemplateFormatVersion: 2010-09-09
Description: >-
  AWS CloudFormation Sample Template Route53_RoundRobin: Sample template showing
  how to use weighted round robin (WRR) DNS entried via Amazon Route 53. This
  contrived sample uses weighted CNAME records to illustrate that the weighting
  influences the return records. It assumes that you already have a Hosted Zone
  registered with Amazon Route 53. **WARNING** This template creates one or more
  AWS resources. You will be billed for the AWS resources used if you create a
  stack from this template.
Parameters:

  HostedZone:
    Type: String
    Description: The DNS name of an existing Amazon Route 53 hosted zone
    AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
    ConstraintDescription: must be a valid DNS zone name.

Resources:

  MyDNSRecord:
    Type: 'AWS::Route53::RecordSetGroup' # 「オプションのコメント、変更するホストゾーンの名前とID、および作成するレコードの値を含む複合型。」との事。
    Properties:
      HostedZoneName: !Join #[必須: いいえ] HostedZoneNameまたはHostedZoneIdのいずれかの指定は必須。
        - ''
        - - !Ref HostedZone
          - .
      Comment: >- #[必須: いいえ] 「75%の確率でaws.amazon.comにリダイレクトされ、25%の確率でwww.amazon.comにリダイレクトされるように工夫された例
        Contrived example to redirect to aws.amazon.com 75% of the time and
        www.amazon.com 25% of the time. 
      RecordSets: #[必須: いいえ] 「RecordSet作成するレコードごとに1つの要素を含む複合型。」
        - SetIdentifier: !Join #[必須: いいえ] シンプル以外のルーティングポリシーを持つリソースレコードセット。
            - ' '
            - - !Ref 'AWS::StackName'
              - AWS
          Name: !Join 
            - ''
            - - !Ref 'AWS::StackName'
              - .
              - !Ref 'AWS::Region'
              - .
              - !Ref HostedZone
              - .
          Type: CNAME
          TTL: '900'
          ResourceRecords:
            - aws.amazon.com
          Weight: '3' #[必須: いいえ] 加重リソースレコードセットのみ指定する必要有。DNSクエリの割合を決定する値。全てに0を設定すると均等にルーティングされるが、それ以外で0を指定した場合応答しない。
        - SetIdentifier: !Join 
            - ' '
            - - !Ref 'AWS::StackName'
              - Amazon
          Name: !Join 
            - ''
            - - !Ref 'AWS::StackName'
              - .
              - !Ref 'AWS::Region'
              - .
              - !Ref HostedZone
              - .
          Type: CNAME
          TTL: '900'
          ResourceRecords:
            - www.amazon.com
          Weight: '1' # 同上

Outputs:
  DomainName:
    Description: Fully qualified domain name
    Value: !Ref MyDNSRecord

スタックの作成をクリック

CREATE_COMPLETE

今度は先程のCNAMEの時と違ってクリック出来るような値の参照ではないようです。

【参考:「AWS::Route53::RecordSet」の戻り値】

【参考:「AWS::Route53::RecordSetGroup」の戻り値】

ホストゾーンから作成されたCNAMEの"レコード名"をコピーしてアクセスすると、
こちらも先程同様、重みづけされたどちらのリダイレクト先も403を返すので判別出来ません。

それぞれアクセスした先の挙動も見たいので応用したものを作成。

a_record_2
a_record_2.yml
AWSTemplateFormatVersion: 2010-09-09
Description: This is a test template.

# ============== パラメータ ==============
# メタデータ
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: Parameters
        Parameters:
          - MyIP

# パラメータ
Parameters: 
  MyIP:
    Type: String
    Description: enter your global IP(xxx.xxx.xxx.xxx/32).This is used for SecurityGroupIngress of EC2.
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form.

  HostedZone:
    Type: String
    Description: The DNS name of an existing Amazon Route 53 hosted zone
    AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
    ConstraintDescription: must be a valid DNS zone name.
# ============== リソース ==============
Resources:
# -------------- IAM --------------
# ロール
  MySSMMICRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service:
                - 'ec2.amazonaws.com'
            Action:
              - 'sts:AssumeRole'
      Path: '/'
      RoleName: MySSMMICRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

# インスタンスプロファイル
  MyInstanceProfile:
    DependsOn: MySSMMICRole
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: '/'
      Roles:
        - !Ref MySSMMICRole
# -------------- Route53 --------------
  MyDNSRecord:
    Type: 'AWS::Route53::RecordSet'
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZone 
          - .
      Comment: DNS name for my instance. 
      Name: !Join 
        - ''
        - - !Ref MyEC2
          - .
          - !Ref 'AWS::Region'
          - .
          - !Ref HostedZone
          - .
      Type: A 
      TTL: '900' 
      ResourceRecords: 
        - !GetAtt 
          - MyEC2 
          - PublicIp
# -------------- VPC --------------
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      InstanceTenancy: default
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: MyVPC
#-------------- インターネットゲートウェイ --------------
#  IGW
  MyIGW:
    Type: AWS::EC2::InternetGateway
    Properties: 
      Tags:
        - Key: Name
          Value: MyIGW
#  アタッチメント
  MyIGWAttach:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties: 
      InternetGatewayId: !Ref MyIGW
      VpcId: !Ref MyVPC
# -------------- サブネット --------------
# パブリック
  MyPubSN1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref MyVPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: MyPubSN1
# -------------- ルートテーブル --------------
#  ルートテーブル
  MyPubRT:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: MyPubRT
#  ルート
  MyPubRoute:
    Type: AWS::EC2::Route
    DependsOn: MyIGW
    Properties:
      RouteTableId: !Ref MyPubRT
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref MyIGW

#  アソシエーション
  MyPubSN1Assoc:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref MyPubSN1
      RouteTableId: !Ref MyPubRT
# -------------- EC2インスタンス --------------
  MyEC2: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: ami-078296f82eb463377
      InstanceType: t2.micro
      IamInstanceProfile: !Ref MyInstanceProfile
      NetworkInterfaces: 
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          SubnetId: !Ref MyPubSN1
          GroupSet:
            - !Ref MyEC2SG
      UserData: !Base64 |
        #!/bin/bash
        sudo yum -y update
        sudo yum -y install httpd
        sudo systemctl start httpd
        sudo systemctl enable httpd
        sudo echo "a-record test was successful." > /var/www/html/index.html 
      Tags:
          - Key: Name
            Value: MyEC2

# -------------- セキュリティグループ --------------
  MyEC2SG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref MyVPC
      GroupDescription: Allow HTTP access only MYALBSG
      SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: !Ref MyIP
      Tags:
        - Key: Name
          Value: MyEC2SG

# ============== 出力 ==============
Outputs:
  DomainName:
    Description: Fully qualified domain name
    Value: !Ref MyDNSRecord 

無事表示されました。

cname_record_2
cname_record_2.yml
AWSTemplateFormatVersion: 2010-09-09
Description: This is a test template.

# ============== パラメータ ==============
# メタデータ
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: Parameters
        Parameters:
          - MyIP

# パラメータ
Parameters: 
  MyIP:
    Type: String
    Description: enter your global IP(xxx.xxx.xxx.xxx/32).This is used for SecurityGroupIngress of EC2.
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form.

  HostedZone:
    Type: String
    Description: The DNS name of an existing Amazon Route 53 hosted zone
    AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
    ConstraintDescription: must be a valid DNS zone name.

# ============== リソース ==============
Resources:
# -------------- IAM --------------
# ロール
  MySSMMICRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service:
                - 'ec2.amazonaws.com'
            Action:
              - 'sts:AssumeRole'
      Path: '/'
      RoleName: MySSMMICRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

# インスタンスプロファイル
  MyInstanceProfile:
    DependsOn: MySSMMICRole
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: '/'
      Roles:
        - !Ref MySSMMICRole
# -------------- Route53 --------------
  MyDNSRecordA:
    Type: 'AWS::Route53::RecordSet'
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZone 
          - .
      Comment: DNS name for my instance. 
      Name: !Join 
        - ''
        - - !Ref MyEC2
          - .
          - !Ref 'AWS::Region'
          - .
          - !Ref HostedZone
          - .
      Type: A 
      TTL: '900' 
      ResourceRecords: 
        - !GetAtt 
          - MyEC2 
          - PublicIp

  MyDNSRecordC:
    Type: 'AWS::Route53::RecordSet'
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZone
          - .
      Comment: CNAME redirect to MyEC2 A-Record Domain.
      Name: !Join 
        - ''
        - - !Ref 'AWS::StackName'
          - .
          - !Ref 'AWS::Region'
          - .
          - !Ref HostedZone
          - .
      Type: CNAME
      TTL: '900'
      ResourceRecords: 
        - !Ref MyDNSRecordA
# -------------- VPC --------------
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      InstanceTenancy: default
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: MyVPC
#-------------- インターネットゲートウェイ --------------
#  IGW
  MyIGW:
    Type: AWS::EC2::InternetGateway
    Properties: 
      Tags:
        - Key: Name
          Value: MyIGW
#  アタッチメント
  MyIGWAttach:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties: 
      InternetGatewayId: !Ref MyIGW
      VpcId: !Ref MyVPC
# -------------- サブネット --------------
# パブリック
  MyPubSN1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref MyVPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: MyPubSN1
# -------------- ルートテーブル --------------
#  ルートテーブル
  MyPubRT:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: MyPubRT
#  ルート
  MyPubRoute:
    Type: AWS::EC2::Route
    DependsOn: MyIGW
    Properties:
      RouteTableId: !Ref MyPubRT
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref MyIGW

#  アソシエーション
  MyPubSN1Assoc:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref MyPubSN1
      RouteTableId: !Ref MyPubRT
# -------------- EC2インスタンス --------------
  MyEC2: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: ami-078296f82eb463377
      InstanceType: t2.micro
      IamInstanceProfile: !Ref MyInstanceProfile
      NetworkInterfaces: 
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          SubnetId: !Ref MyPubSN1
          GroupSet:
            - !Ref MyEC2SG
      UserData: !Base64 |
        #!/bin/bash
        sudo yum -y update
        sudo yum -y install httpd
        sudo systemctl start httpd
        sudo systemctl enable httpd
        sudo echo "cname-record test was successful." > /var/www/html/index.html 
      Tags:
          - Key: Name
            Value: MyEC2

# -------------- セキュリティグループ --------------
  MyEC2SG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref MyVPC
      GroupDescription: Allow HTTP access only MYALBSG
      SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: !Ref MyIP
      Tags:
        - Key: Name
          Value: MyEC2SG

# ============== 出力 ==============
Outputs:
  CNAME:
    Description: Fully qualified domain name
    Value: !Ref MyDNSRecordC

こちらも無事表示されています。

注:Aレコードに紐づいたEC2内のindex.htmlが上記テキストを表示させ、それをCNAMEでリダイレクトしているのでAレコードのDomainNameからのアクセスでも表示は同じです。

weighted_cname_record_2
weighted_cname_record_2.yml
AWSTemplateFormatVersion: 2010-09-09
Description: This is a test template.

# ============== パラメータ ==============
# メタデータ
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: Parameters
        Parameters:
          - MyIP

# パラメータ
Parameters: 
  MyIP:
    Type: String
    Description: enter your global IP(xxx.xxx.xxx.xxx/32).This is used for SecurityGroupIngress of EC2.
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form.

  HostedZone:
    Type: String
    Description: The DNS name of an existing Amazon Route 53 hosted zone
    AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
    ConstraintDescription: must be a valid DNS zone name.

# ============== リソース ==============
Resources:
# -------------- IAM --------------
# ロール
  MySSMMICRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Service:
                - 'ec2.amazonaws.com'
            Action:
              - 'sts:AssumeRole'
      Path: '/'
      RoleName: MySSMMICRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

# インスタンスプロファイル
  MyInstanceProfile:
    DependsOn: MySSMMICRole
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: '/'
      Roles:
        - !Ref MySSMMICRole
# -------------- Route53 --------------
  MyDNSRecordA1:
    Type: 'AWS::Route53::RecordSet'
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZone 
          - .
      Comment: DNS name for my instance. 
      Name: !Join 
        - ''
        - - !Ref MyEC2no1
          - .
          - !Ref 'AWS::Region'
          - .
          - !Ref HostedZone
          - .
      Type: A 
      TTL: '900' 
      ResourceRecords: 
        - !GetAtt 
          - MyEC2no1
          - PublicIp

  MyDNSRecordA2:
    Type: 'AWS::Route53::RecordSet'
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZone 
          - .
      Comment: DNS name for my instance. 
      Name: !Join 
        - ''
        - - !Ref MyEC2no2
          - .
          - !Ref 'AWS::Region'
          - .
          - !Ref HostedZone
          - .
      Type: A 
      TTL: '900' 
      ResourceRecords: 
        - !GetAtt 
          - MyEC2no2 
          - PublicIp

  MyDNSRecordW:
    Type: 'AWS::Route53::RecordSetGroup' 
    Properties:
      HostedZoneName: !Join
        - ''
        - - !Ref HostedZone
          - .
      Comment: >- 
        Contrived example to redirect to MyEC2no1 A-Record Domain 75% of the time and
        MyEC2no2 A-Record Domain 25% of the time. 
      RecordSets: 
        - SetIdentifier: !Join 
            - ' '
            - - !Ref 'AWS::StackName'
              - AWS
          Name: !Join 
            - ''
            - - !Ref 'AWS::StackName'
              - .
              - !Ref 'AWS::Region'
              - .
              - !Ref HostedZone
              - .
          Type: CNAME
          TTL: '900'
          ResourceRecords:
            - !Ref MyDNSRecordA1
          Weight: '3' 
        - SetIdentifier: !Join 
            - ' '
            - - !Ref 'AWS::StackName'
              - Amazon
          Name: !Join 
            - ''
            - - !Ref 'AWS::StackName'
              - .
              - !Ref 'AWS::Region'
              - .
              - !Ref HostedZone
              - .
          Type: CNAME
          TTL: '900'
          ResourceRecords:
            - !Ref MyDNSRecordA2
          Weight: '1' 
# -------------- VPC --------------
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      InstanceTenancy: default
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: MyVPC
#-------------- インターネットゲートウェイ --------------
#  IGW
  MyIGW:
    Type: AWS::EC2::InternetGateway
    Properties: 
      Tags:
        - Key: Name
          Value: MyIGW
#  アタッチメント
  MyIGWAttach:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties: 
      InternetGatewayId: !Ref MyIGW
      VpcId: !Ref MyVPC
# -------------- サブネット --------------
# パブリック
  MyPubSN1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref MyVPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: MyPubSN1
# -------------- ルートテーブル --------------
#  ルートテーブル
  MyPubRT:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: MyPubRT
#  ルート
  MyPubRoute:
    Type: AWS::EC2::Route
    DependsOn: MyIGW
    Properties:
      RouteTableId: !Ref MyPubRT
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref MyIGW

#  アソシエーション
  MyPubSN1Assoc:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref MyPubSN1
      RouteTableId: !Ref MyPubRT
# -------------- EC2インスタンス --------------
  MyEC2no1: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: ami-078296f82eb463377
      InstanceType: t2.micro
      IamInstanceProfile: !Ref MyInstanceProfile
      NetworkInterfaces: 
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          SubnetId: !Ref MyPubSN1
          GroupSet:
            - !Ref MyEC2SG
      UserData: !Base64 |
        #!/bin/bash
        sudo yum -y update
        sudo yum -y install httpd
        sudo systemctl start httpd
        sudo systemctl enable httpd
        sudo echo "this is instance1." > /var/www/html/index.html 
      Tags:
          - Key: Name
            Value: MyEC2no1

  MyEC2no2: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: ami-078296f82eb463377
      InstanceType: t2.micro
      IamInstanceProfile: !Ref MyInstanceProfile
      NetworkInterfaces: 
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          SubnetId: !Ref MyPubSN1
          GroupSet:
            - !Ref MyEC2SG
      UserData: !Base64 |
        #!/bin/bash
        sudo yum -y update
        sudo yum -y install httpd
        sudo systemctl start httpd
        sudo systemctl enable httpd
        sudo echo "this is instance2." > /var/www/html/index.html 
      Tags:
          - Key: Name
            Value: MyEC2no2

# -------------- セキュリティグループ --------------
  MyEC2SG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref MyVPC
      GroupDescription: Allow HTTP access only MYALBSG
      SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: !Ref MyIP
      Tags:
        - Key: Name
          Value: MyEC2SG

# ============== 出力 ==============
Outputs:

  DomainNameA1:
    Description: Fully qualified domain name
    Value: !Ref MyDNSRecordA1 

  DomainNameA2:
    Description: Fully qualified domain name
    Value: !Ref MyDNSRecordA2

  DomainNameW:
    Description: Fully qualified domain name
    Value: !Ref MyDNSRecordW

出力タブに
Aレコード1(論理ID:MyDNSRecordA1)と
Aレコード2(論理ID:MyDNSRecordA2)

そして値はクリック出来ないですが、それらを重みづけする設定の「AWS::Route53::RecordSetGroup」である
論理ID:MyDNSRecordA2のDomainも出力されています。

それぞれアクセスすると
DomainNameA1

DomainNameA2

そしてRoute53コンソールのホストゾーン内のルーティングポリシー列が”加重”と表示のあるレコード名をコピーしてブラウザでアクセス→根気強く再読み込みしていると、上記2つの表示が一定の割合で交互しているのがわかるかと思います。

以上でした。

どなたかのお役に立てる情報があれば幸いです。

Discussion