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

Uncategorized

はじめに

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

参考

コメント