今回はAWSのRoute53で取得したドメインを使ってCloudFrontに適用する方法(CLI)について紹介します。
今回はAWS
のRoute53
で取得したドメインをCloudFront
に適用する方法を紹介したいと思います。
前提としてドメインは前回のこの記事のような手法で取得済みで、以下のような定数に格納されているものとします。
export domain=<有効なドメイン>
また、このタイミングでホストゾーンについても特定しておきましょう。 下記コマンドからホストゾーン一覧を確認できます。
aws route53 list-hosted-zones
対象のホストゾーンのIDが確認できたらドメインと同様に定数に格納しておきます。
export hostedZoneId=<ホストゾーンID>
ドメインを適用する前にACM
から証明書を発行します。
証明書についてのわかりやすい解説は下記リンクを参照してください。
今回は*
付きのワイルドカード証明書を取得するものとします。
下記コマンドで取得できます。
aws acm request-certificate \
--domain-name *.$domain \
--validation-method DNS \
--region us-east-1
以下のようなレスポンスが返って来れば証明書の作成は完了です。
{
"CertificateArn": "<証明書のARN>"
}
この証明書の情報をDNS
(Route53
)側に設定することでドメインの(利用権の)認証を行うことができます。
先ほど取得できた証明書のARN
を指定して下記コマンドを実行しましょう。
aws acm describe-certificate \
--certificate-arn <証明書のARN>
レスポンスとして証明書の情報がJSON
形式で返ってきます。
その中からResourceRecord
のプロパティを探し、Name
とValue
の値を控えます。
その内容を元に以下のような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
側との接続を行います。
方法としてはCNAME
の時と同様にAlias
レコードをRoute53
に追加します。
Alias
レコードとはAlias
レコードはAWS
のRoute53
の独自拡張レコードです。
振る舞いとしてはA
レコードに近いです。
A
レコードが「DNS名に対するIP」の対応付けを表すのに対して、Alias
レコードは「DNS名に対するAWS
リソースのDNS名」の対応付けを表します。
「CNAME
となにが違うの?」と思われるかもしれませんが、パフォーマンスが変わってきます。
一般に同様のこと(DNS名→DNS名→IPの変換)を再現しようとした場合、「DNS名→DNS名」でCNAME
レコード、「DNS名→IP」でA
レコードといった具合に2回問い合わせが発生します。
それに対してAlias
レコードは「DNS名」をそのままAWS
上のリソース(DNS名)に変換してくれるのでパフォーマンスを比べた場合こちらに軍配が上がります。
実際に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
に紐づける方法について紹介しました。
コンソール上でやると簡単ですが最終的にCloudFormation
やCDK
に落とし込むことを考えるとCLI
ベースで進めた方が何かと楽になります。
今回の内容が役立ちましたら幸いです。