【AWS】Route53でドメインを取得して、CloudFrontに適用する

今回はAWSのRoute53で取得したドメインを使ってCloudFrontに適用する方法(CLI)について紹介します。

概要

今回はAWSRoute53で取得したドメインをCloudFrontに適用する方法を紹介したいと思います。

前提としてドメインは前回のこの記事のような手法で取得済みで、以下のような定数に格納されているものとします。

export domain=<有効なドメイン>

また、このタイミングでホストゾーンについても特定しておきましょう。 下記コマンドからホストゾーン一覧を確認できます。

aws route53 list-hosted-zones

対象のホストゾーンのIDが確認できたらドメインと同様に定数に格納しておきます。

export hostedZoneId=<ホストゾーンID>

証明書の取得

ドメインを適用する前にACMから証明書を発行します。 証明書についてのわかりやすい解説は下記リンクを参照してください。

参考:GMOグローバルサイン | SSLサーバ証明書とは

今回は*付きのワイルドカード証明書を取得するものとします。 下記コマンドで取得できます。

aws acm request-certificate \
  --domain-name *.$domain \
  --validation-method DNS \
  --region us-east-1

以下のようなレスポンスが返って来れば証明書の作成は完了です。

{
    "CertificateArn": "<証明書のARN>"
}

CNAMEに追加

この証明書の情報をDNS(Route53)側に設定することでドメインの(利用権の)認証を行うことができます。 先ほど取得できた証明書のARNを指定して下記コマンドを実行しましょう。

aws acm describe-certificate \
  --certificate-arn <証明書のARN>

レスポンスとして証明書の情報がJSON形式で返ってきます。 その中からResourceRecordのプロパティを探し、NameValueの値を控えます。

その内容を元に以下のようなJSONを作成しましょう。 名前はrecord-cname-certificate.jsonとします。

{
    "Comment": "Add CNAME Certificate",
    "Changes": [
       {
          "Action": "UPSERT",
          "ResourceRecordSet": {
             "Name": "<ResourceRecordのName>",
             "Type": "CNAME",
             "TTL": 1800,
             "ResourceRecords": [
                {
                   "Value": "<ResourceRecordのValue>"
                }
             ]
          }
       }
    ]
 }

このJSONを使ってCNAMEレコードをRoute53に追加します。 CNAMEレコードは所謂「あだ名」のようなもので、正式名称に対する別名称の定義に用います。 詳しくは以下リンクが参考になります。

参考:!JP | CNAMEリソースレコード(シーネームリソースレコード)

aws route53 change-resource-record-sets \
  --hosted-zone-id $hostedZoneId \
  --change-batch file://record-cname-certificate.json

以下のようなレスポンスが返ってきた後、しばらく待てば反映が成功します。

{
    "ChangeInfo": {
        "Id": "<ID>",
        "Status": "PENDING",
        "SubmittedAt": "<実行日時>",
        "Comment": "Add CNAME Certificate"
    }
}

CloudFrontとの紐付け(Aliasレコードの追加)

いよいよCloudFront側との接続を行います。 方法としてはCNAMEの時と同様にAliasレコードをRoute53に追加します。

Aliasレコードとは

AliasレコードはAWSRoute53の独自拡張レコードです。 振る舞いとしてはAレコードに近いです。

参考:!JP | Aリソースレコード(Aレコード)

Aレコードが「DNS名に対するIP」の対応付けを表すのに対して、Aliasレコードは「DNS名に対するAWSリソースのDNS名」の対応付けを表します。

CNAMEとなにが違うの?」と思われるかもしれませんが、パフォーマンスが変わってきます。 一般に同様のこと(DNS名→DNS名→IPの変換)を再現しようとした場合、「DNS名→DNS名」でCNAMEレコード、「DNS名→IP」でAレコードといった具合に2回問い合わせが発生します。

それに対してAliasレコードは「DNS名」をそのままAWS上のリソース(DNS名)に変換してくれるのでパフォーマンスを比べた場合こちらに軍配が上がります。

Aliasレコードの追加

実際にAliasレコードを追加します。 扱いとしてはAレコードなのでType=Aと指定した以下のようなJSONを用意します。 名前はrecord-a.jsonとします。

{
   "Comment": "Add Alias Record to use front domain.",
   "Changes": [
      {
         "Action": "UPSERT",
         "ResourceRecordSet": {
            "Name": "<DNS名>",
            "Type": "A",
            "AliasTarget": {
               "HostedZoneId": "Z2FDTNDATAQYW2",
               "DNSName": "<CloudFrontのDNS名>",
               "EvaluateTargetHealth": false
            }
         }
      }
   ]
}

CNAMEの時と同様にRoute53に追加します。

aws route53 change-resource-record-sets \
  --hosted-zone-id $hostedZoneId \
  --change-batch file://record-a.json

しばらく待った後に指定したドメイン(上記JSON中の<DNS名>)を参照して、CloudFrontの配信内容が参照できれば成功です。

まとめ

今回はRoute53で取得したドメインを、CloudFrontに紐づける方法について紹介しました。 コンソール上でやると簡単ですが最終的にCloudFormationCDKに落とし込むことを考えるとCLIベースで進めた方が何かと楽になります。

今回の内容が役立ちましたら幸いです。

SNSでシェアする