CloudFront で独自のドメイン名を使用する際に必要な ACM の作成や DNS レコードの追加を行うスクリプトを作成する

CloudFront で独自のドメイン名を使用する際に必要な ACM の作成や DNS レコードの追加を行うスクリプトを作成する

はじめに

CloudFront で独自のドメイン名を使用するためには、必要な ACM の作成や DNS レコードの追加を行う必要があります。 これを AWS CLI で実行するスクリプトを作成します。 独自ドメインでアクセスするためには作成した証明書を CloudFront ディストリビューションに設定する必要があります。 こちらは、本スクリプトでは実施されないため、別途マネジメントコンソール等から実施する必要がある点にはご注意ください。

結論

以下スクリプトで ACM の作成や DNS レコードの作成を行うことができます。

TARGET_DOMAIN="hoge.com"
HOSTED_DOMAIN="fuga.hoge.com"
DISTRIBUTION_DOMAIN="abcdefghijklm.cloudfront.net"
export AWS_DEFAULT_REGION=us-east-1

aws acm request-certificate \
 --domain-name ${TARGET_DOMAIN} \
 --validation-method DNS

CERTIFICATE_ARN=$( \
 aws acm list-certificates \
 --query "CertificateSummaryList[?DomainName=='${TARGET_DOMAIN}'].CertificateArn" \
 --output text ) \
&& echo ${CERTIFICATE_ARN}

VALIDATION_RECORD_NAME=$( \
 aws acm describe-certificate \
 --certificate-arn ${CERTIFICATE_ARN} \
 --query "Certificate.DomainValidationOptions[0].ResourceRecord.Name" \
 --output text) \
&& VALIDATION_RECORD_VALUE=$( \
 aws acm describe-certificate \
 --certificate-arn ${CERTIFICATE_ARN} \
 --query "Certificate.DomainValidationOptions[0].ResourceRecord.Value" \
 --output text) \
&& echo "
VALIDATION_RECORD_NAME = ${VALIDATION_RECORD_NAME}
VALIDATION_RECORD_VALUE = ${VALIDATION_RECORD_VALUE}"

HOSTED_ZONE_ID=$( \
 aws route53 list-hosted-zones \
 --query "HostedZones[?Name=='${HOSTED_DOMAIN}.'].Id" \
 --output text) \
&& echo ${HOSTED_ZONE_ID}

aws route53 change-resource-record-sets \
--hosted-zone-id ${HOSTED_ZONE_ID} \
--change-batch \
"{
 \"Changes\": [
 {
 \"Action\": \"CREATE\",
 \"ResourceRecordSet\": {
 \"Name\": \"${VALIDATION_RECORD_NAME}\",
 \"Type\": \"CNAME\",
 \"TTL\": 300,
 \"ResourceRecords\": [{\"Value\": \"${VALIDATION_RECORD_VALUE}\"}]
 }
 }
 ]
}"

aws route53 change-resource-record-sets \
--hosted-zone-id ${HOSTED_ZONE_ID} \
--change-batch \
"{
 \"Changes\": [
 {
 \"Action\": \"CREATE\",
 \"ResourceRecordSet\": {
 \"Name\": \"${HOSTED_DOMAIN}\",
 \"Type\": \"A\",
 \"AliasTarget\": {
 \"HostedZoneId\": \"Z2FDTNDATAQYW2\",
 \"DNSName\": \"${DISTRIBUTION_DOMAIN}\",
 \"EvaluateTargetHealth\": false
 }
 }
 }
 ]
}"

各コマンドの詳細

TARGET_DOMAINにはホストゾーンのドメイン名を指定します。 HOSTED_DOMAINには証明書をリクエストするドメインを指定します。*.ドメイン名としてサブドメインを指定することもできます。 CloudFront のため環境変数でAWS_DEFAULT_REGIO=us-east-1を設定します。

TARGET_DOMAIN="hoge.com"
HOSTED_DOMAIN="fuga.hoge.com"
DISTRIBUTION_DOMAIN="abcdefghijklm.cloudfront.net"
export AWS_DEFAULT_REGION=us-east-1

ACM で証明書を作成する。 証明書のARNは後のコマンドで使用するため変数に入れておきます。

aws acm request-certificate \
 --domain-name ${TARGET_DOMAIN} \
 --validation-method DNS

CERTIFICATE_ARN=$( \
 aws acm list-certificates \
 --query "CertificateSummaryList[?DomainName=='${TARGET_DOMAIN}'].CertificateArn" \
 --output text ) \
&& echo ${CERTIFICATE_ARN}

作成した ACM の証明書からレコード情報を取得し、Route 53 に登録します。

VALIDATION_RECORD_NAME=$( \
 aws acm describe-certificate \
 --certificate-arn ${CERTIFICATE_ARN} \
 --query "Certificate.DomainValidationOptions[0].ResourceRecord.Name" \
 --output text) \
&& VALIDATION_RECORD_VALUE=$( \
 aws acm describe-certificate \
 --certificate-arn ${CERTIFICATE_ARN} \
 --query "Certificate.DomainValidationOptions[0].ResourceRecord.Value" \
 --output text) \
&& echo "
VALIDATION_RECORD_NAME = ${VALIDATION_RECORD_NAME}
VALIDATION_RECORD_VALUE = ${VALIDATION_RECORD_VALUE}"

HOSTED_ZONE_ID=$( \
 aws route53 list-hosted-zones \
 --query "HostedZones[?Name=='${HOSTED_DOMAIN}.'].Id" \
 --output text) \
&& echo ${HOSTED_ZONE_ID}

aws route53 change-resource-record-sets \
--hosted-zone-id ${HOSTED_ZONE_ID} \
--change-batch \
"{
 \"Changes\": [
 {
 \"Action\": \"CREATE\",
 \"ResourceRecordSet\": {
 \"Name\": \"${VALIDATION_RECORD_NAME}\",
 \"Type\": \"CNAME\",
 \"TTL\": 300,
 \"ResourceRecords\": [{\"Value\": \"${VALIDATION_RECORD_VALUE}\"}]
 }
 }
 ]
}"

エイリアスリソースレコードセットを作成します。

aws route53 change-resource-record-sets \
--hosted-zone-id ${HOSTED_ZONE_ID} \
--change-batch \
"{
 \"Changes\": [
 {
 \"Action\": \"CREATE\",
 \"ResourceRecordSet\": {
 \"Name\": \"${HOSTED_DOMAIN}\",
 \"Type\": \"A\",
 \"AliasTarget\": {
 \"HostedZoneId\": \"Z2FDTNDATAQYW2\",
 \"DNSName\": \"${DISTRIBUTION_DOMAIN}\",
 \"EvaluateTargetHealth\": false
 }
 }
 }
 ]
}"

おわりに

本記事では CloudFront で独自のドメイン名を使用する際に必要な ACM の作成や DNS レコードの追加を行うスクリプトを作成しました。 この記事がどなたかの参考になれば幸いです。

参考