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

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 レコードの追加を行うスクリプトを作成しました。 この記事がどなたかの参考になれば幸いです。

参考