ハンズオン(簡易版): ACM入門

2.1. Route53 リソースレコードセットの登録 (CNAME: ACM)

手順の目的 [why]

Route53ホストゾーン"<事前に用意した独自ドメイン>"に、ACM証明書"<タグ名>"の認証用CNAMEレコードを登録します。

設定値の指定

設定値の指定

手順に必要な設定値を変数に格納をします。

0. ACM証明書が存在するリージョン

ACM証明書が存在するリージョンを指定します。

コマンド:

export AWS_DEFAULT_REGION='us-east-1'

1. ドメイン名

ドメイン名を指定します。

変数の設定:

DIR_TMP="${HOME}/environment/tmp-handson-cli-acm"

変数の設定:

FILE_TMP="${DIR_TMP}/handson-cli-acm-domain.tmp" \
  && echo ${FILE_TMP}

結果(例):

${HOME}/environment/tmp-handson-cli-acm/handson-cli-acm-domain.tmp

コマンド:

source ${FILE_TMP} \
  && echo ${DOMAIN_NAME}

結果(例):

<事前に用意した独自ドメイン>

変数の設定:

DOMAIN_NAME_FQDN="${DOMAIN_NAME}." \
  && echo ${DOMAIN_NAME_FQDN}

結果(例):

<事前に用意した独自ドメイン>.

2. ACM証明書タグ名

ACM証明書タグ名を指定します。

変数の設定:

HOST_NAME='handson-cli-acm'

変数の設定:

ACM_DOMAIN_NAME="${HOST_NAME}.${DOMAIN_NAME}" \
  && echo ${ACM_DOMAIN_NAME}

結果(例):

handson-cli-acm.<事前に用意した独自ドメイン>

変数の設定:

ACM_CERTIFICATE_TAG_NAME="${ACM_DOMAIN_NAME}-certificate" \
  && echo ${ACM_CERTIFICATE_TAG_NAME}

結果(例):

handson-cli-acm.<事前に用意した独自ドメイン>-certificate

3. Route53アクション

Route53アクションを指定します。

変数の設定:

ROUTE53_RESOURCE_RECORD_SET_ACTION='CREATE'

4. リソースレコードタイプ

リソースレコードタイプを指定します。

変数の設定:

ROUTE53_RESOURCE_RECORD_SET_TYPE='CNAME'

5. リソースレコードTTL

リソースレコードのTTLを指定します。

変数の設定:

ROUTE53_RESOURCE_RECORD_SET_TTL='300'

6. リソースレコードセットドキュメント用ディレクトリ名

リソースレコードセットドキュメント用ディレクトリ名を指定します。

変数の設定:

DIR_ROUTE53_RESOURCE_RECORD_SET_DOC="${HOME}/environment/conf-handson-cli-acm"

ディレクトリが存在することを確認します。

コマンド:

ls -d ${DIR_ROUTE53_RESOURCE_RECORD_SET_DOC}

結果(例:存在する場合):

${HOME}/environment/conf-handson-cli-acm

存在しない場合は作成します。

コマンド:

mkdir -p ${DIR_ROUTE53_RESOURCE_RECORD_SET_DOC}

7. リソースレコードセットファイル名

リソースレコードセットファイル名を指定します。

変数の設定:

FILE_ROUTE53_RESOURCE_RECORD_SET_DOC="${DIR_ROUTE53_RESOURCE_RECORD_SET_DOC}/$(date +%Y-%m-%d)-acm-${ACM_CERTIFICATE_TAG_NAME}-${ROUTE53_RESOURCE_RECORD_SET_TYPE}-${ROUTE53_RESOURCE_RECORD_SET_ACTION}.json" \
  && echo ${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC}

結果(例):

${HOME}/environment/conf-handson-cli-acm/2021-12-13-acm-handson-cli-acm.<事前に用意した独自ドメイン>-certificate-CNAME-CREATE.json

設定値の確認

各変数に正しい設定値が格納されていることを確認しながら保存します。

変数の確認:

cat << END

  # 0. AWS_DEFAULT_REGION:"us-east-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. DOMAIN_NAME_FQDN:"<事前に用意した独自ドメイン>."
       DOMAIN_NAME_FQDN="${DOMAIN_NAME_FQDN}"
  # 2. ACM_CERTIFICATE_TAG_NAME:"handson-cli-acm.<事前に用意した独自ドメイン>-certificate"
       ACM_CERTIFICATE_TAG_NAME="${ACM_CERTIFICATE_TAG_NAME}"
  # 3. ROUTE53_RESOURCE_RECORD_SET_ACTION:"CREATE"
       ROUTE53_RESOURCE_RECORD_SET_ACTION="${ROUTE53_RESOURCE_RECORD_SET_ACTION}"
  # 4. ROUTE53_RESOURCE_RECORD_SET_TYPE:"CNAME"
       ROUTE53_RESOURCE_RECORD_SET_TYPE="${ROUTE53_RESOURCE_RECORD_SET_TYPE}"
  # 5. ROUTE53_RESOURCE_RECORD_SET_TTL:"300"
       ROUTE53_RESOURCE_RECORD_SET_TTL="${ROUTE53_RESOURCE_RECORD_SET_TTL}"
  # 6. DIR_ROUTE53_RESOURCE_RECORD_SET_DOC:"${HOME}/environment/conf-handson-cli-acm"
       DIR_ROUTE53_RESOURCE_RECORD_SET_DOC="${DIR_ROUTE53_RESOURCE_RECORD_SET_DOC}"
  # 7. FILE_ROUTE53_RESOURCE_RECORD_SET_DOC:"${HOME}/environment/conf-handson-cli-acm/2021-12-13-acm-handson-cli-acm.<事前に用意した独自ドメイン>-certificate-CNAME-CREATE.json"
       FILE_ROUTE53_RESOURCE_RECORD_SET_DOC="${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC}"

END

下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。

処理の実行

リソースレコードセットに必要な情報の取得

ホストゾーンIDを取得します。

コマンド:

ROUTE53_HOSTED_ZONE_ID=$( \
  aws route53 list-hosted-zones-by-name \
    --dns-name ${DOMAIN_NAME_FQDN} \
    --query "HostedZones[?Name == \`${DOMAIN_NAME_FQDN}\`].Id" \
    --output text \
  | sed 's/\/hostedzone\///' \
) \
  && echo ${ROUTE53_HOSTED_ZONE_ID}

結果(例):

Zxxxxxxxxxxxxxxxxxxxx

ACM証明書のARNを取得します。

コマンド:

for i in $( 
  aws acm list-certificates \
    --query "CertificateSummaryList[].CertificateArn" \
    --output text \
); do
  j=$( \
    aws acm list-tags-for-certificate \
      --certificate-arn ${i} \
      --query "Tags[?Key == \`Name\` && Value == \`${ACM_CERTIFICATE_TAG_NAME}\`].Value" \
      --output text \
  )
  if [ "${j}" == "${ACM_CERTIFICATE_TAG_NAME}" ]; then \
    ACM_CERTIFICATE_ARN=$( \
      aws acm list-certificates \
        --query "CertificateSummaryList[?CertificateArn == \`${i}\`].CertificateArn" \
        --output text \
    ) \
      && echo "${ACM_CERTIFICATE_ARN}"
  fi
done

結果(例):

arn:aws:acm:us-east-1:XXXXXXXXXXXX:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

課題

list-certificatesコマンドがタグ表示できないため、同名の証明書が複数ある場合、全ての証明書をlist-tags-for-certificateコマンドでタグの有無をチェックするしか方法がない。

CNAME名を取得します。

コマンド:

ROUTE53_RESOURCE_RECORD_SET_NAME=$( \
  aws acm describe-certificate \
    --certificate-arn ${ACM_CERTIFICATE_ARN} \
    --query 'Certificate.DomainValidationOptions[?ValidationMethod == `DNS`].ResourceRecord.Name' \
    --output text \
) \
  && echo ${ROUTE53_RESOURCE_RECORD_SET_NAME}

結果(例):

_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.handson-cli-acm.<事前に用意した独自ドメイン>.

CNAMEの値を取得します。

コマンド:

ROUTE53_RESOURCE_RECORD_SET_VALUE=$( \
  aws acm describe-certificate \
    --certificate-arn ${ACM_CERTIFICATE_ARN} \
    --query 'Certificate.DomainValidationOptions[?ValidationMethod == `DNS`].ResourceRecord.Value' \
    --output text \
) \
  && echo ${ROUTE53_RESOURCE_RECORD_SET_VALUE}

結果(例):

_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxx.acm-validations.aws.

リソースレコードセット設定ファイルの作成

リソースレコードセット設定ファイルを作成します。

変数の確認:

cat << END

  # FILE_ROUTE53_RESOURCE_RECORD_SET_DOC:"${HOME}/environment/conf-handson-cli-acm/2021-12-13-acm-handson-cli-acm.<事前に用意した独自ドメイン>-certificate-CNAME-CREATE.json"
    FILE_ROUTE53_RESOURCE_RECORD_SET_DOC="${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC}"
  # ROUTE53_RESOURCE_RECORD_SET_ACTION:"CREATE"
    ROUTE53_RESOURCE_RECORD_SET_ACTION="${ROUTE53_RESOURCE_RECORD_SET_ACTION}"
  # ROUTE53_RESOURCE_RECORD_SET_TYPE:"CNAME"
    ROUTE53_RESOURCE_RECORD_SET_TYPE="${ROUTE53_RESOURCE_RECORD_SET_TYPE}"
  # ROUTE53_RESOURCE_RECORD_SET_TTL:"300"
    ROUTE53_RESOURCE_RECORD_SET_TTL="${ROUTE53_RESOURCE_RECORD_SET_TTL}"
  # ROUTE53_RESOURCE_RECORD_SET_NAME:"_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.handson-cli-acm.<事前に用意した独自ドメイン>."
    ROUTE53_RESOURCE_RECORD_SET_NAME="${ROUTE53_RESOURCE_RECORD_SET_NAME}"
  # ROUTE53_RESOURCE_RECORD_SET_VALUE:"_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxx.acm-validations.aws."
    ROUTE53_RESOURCE_RECORD_SET_VALUE="${ROUTE53_RESOURCE_RECORD_SET_VALUE}"

END

コマンド:

cat << EOF > ${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC}
{
  "Changes": [
    {
      "Action": "${ROUTE53_RESOURCE_RECORD_SET_ACTION}",
      "ResourceRecordSet": {
        "Name": "${ROUTE53_RESOURCE_RECORD_SET_NAME}",
        "Type": "${ROUTE53_RESOURCE_RECORD_SET_TYPE}",
        "TTL":  ${ROUTE53_RESOURCE_RECORD_SET_TTL},
        "ResourceRecords": [
          {
            "Value": "${ROUTE53_RESOURCE_RECORD_SET_VALUE}"
          }
        ]
      }
    }
  ]
}
EOF

cat ${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC}

結果(例):

{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.handson-cli-acm.<事前に用意した独自ドメイン>.",
        "Type": "CNAME",
        "TTL":  300,
        "ResourceRecords": [
          {
            "Value": "_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxx.acm-validations.aws."
          }
        ]
      }
    }
  ]
}

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

コマンド:

cat ${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC} \
  |  python3 -m json.tool \
  > /dev/null

結果(例):

(出力なし)

出力ファイル名を指定します。

変数の設定:

FILE_ROUTE53_RESOURCE_RECORD_SET_OUTPUT="${DIR_ROUTE53_RESOURCE_RECORD_SET_DOC}/$(date +%Y-%m-%d)-acm-${ACM_CERTIFICATE_TAG_NAME}-${ROUTE53_RESOURCE_RECORD_SET_TYPE}-${ROUTE53_RESOURCE_RECORD_SET_ACTION}-output.json" \
  && echo ${FILE_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}

結果(例):

${HOME}/environment/tmp-handson-cli-acm/2021-12-13-acm-handson-cli-acm.<事前に用意した独自ドメイン>-certificate-CNAME-CREATE-output.json

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

変数の確認:

cat << END

  # ROUTE53_HOSTED_ZONE_ID:"Zxxxxxxxxxxxxxxxxxxxx"
    ROUTE53_HOSTED_ZONE_ID="${ROUTE53_HOSTED_ZONE_ID}"
  # FILE_ROUTE53_RESOURCE_RECORD_SET_DOC:"${HOME}/environment/conf-handson-cli-acm/2021-12-13-acm-handson-cli-acm.<事前に用意した独自ドメイン>-certificate-CNAME-CREATE.json"
    FILE_ROUTE53_RESOURCE_RECORD_SET_DOC="${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC}"
  # FILE_ROUTE53_RESOURCE_RECORD_SET_OUTPUT:"${HOME}/environment/tmp-handson-cli-acm/2021-12-13-acm-handson-cli-acm.<事前に用意した独自ドメイン>-certificate-CNAME-CREATE-output.json"
    FILE_ROUTE53_RESOURCE_RECORD_SET_OUTPUT="${FILE_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}"

END

コマンド:

aws route53 change-resource-record-sets \
  --hosted-zone-id ${ROUTE53_HOSTED_ZONE_ID} \
  --change-batch file://${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC} \
  > ${FILE_ROUTE53_RESOURCE_RECORD_SET_OUTPUT} \
    && cat ${FILE_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}

結果(例):

{
  "ChangeInfo": {
    "Status": "PENDING",
    "SubmittedAt": "2021-12-13T01:23:45.678Z",
    "Id": "/change/C1LBXXXXXXXXXX"
  }
}

Change IDを取得します。

コマンド:

ROUTE53_CHANGE_ID=$( \
  cat ${FILE_ROUTE53_RESOURCE_RECORD_SET_OUTPUT} \
    | jp.py 'ChangeInfo.Id' \
    | sed 's/\"//g' \
) \
  && echo ${ROUTE53_CHANGE_ID}

結果(例):

/change/C1LBXXXXXXXXXX

ステータスを確認します。

コマンド:

ROUTE53_CHANGE_STATUS=$( \
  aws route53 get-change \
    --id ${ROUTE53_CHANGE_ID} \
    --query 'ChangeInfo.Status' \
    --output text \
) \
  && echo ${ROUTE53_CHANGE_STATUS}

結果(例):

INSYNC

ステータスがINSYNCになれば設定変更が完了しています。 (1分程度かかります。)

完了確認

「Route53ホストゾーン"<事前に用意した独自ドメイン>"に、ACM証明書"handson-cli-acm.<事前に用意した独自ドメイン>-certificate"の承認用CNAMEレコードが存在する。」ことを確認します。

コマンド:

aws route53 list-resource-record-sets \
  --hosted-zone-id /hostedzone/${ROUTE53_HOSTED_ZONE_ID} \
  --query "ResourceRecordSets[?Type == \`${ROUTE53_RESOURCE_RECORD_SET_TYPE}\` \
    && Name == \`${ROUTE53_RESOURCE_RECORD_SET_NAME}\` \
    && contains(ResourceRecords[].Value, \`${ROUTE53_RESOURCE_RECORD_SET_VALUE}\`)].Name" \
  --output text

結果(例):

_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.handson-cli-acm.<事前に用意した独自ドメイン>.

「リソースタイプ"CNAME"のリソースレコード"_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.handson-cli-acm.<事前に用意した独自ドメイン>."が名前解決できる。」ことを確認します。

コマンド:

dig ${ROUTE53_RESOURCE_RECORD_SET_TYPE} ${ROUTE53_RESOURCE_RECORD_SET_NAME} \
  | grep ${ROUTE53_RESOURCE_RECORD_SET_TYPE} \
  | grep ${ROUTE53_RESOURCE_RECORD_SET_NAME} \
  | grep -v '^;'

結果(例):

_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.handson-cli-acm.<事前に用意した独自ドメイン>. 300 IN CNAME _xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxx.acm-validations.aws.

手順の完了

(参考) マネジメントコンソールの確認

ホストゾーン一覧(画面)

  • 検索欄にホストゾーン名"<独自ドメイン>"を入力して、エンターキーを押します。

  • ホストゾーン名"<独自ドメイン>"をクリックします。

ホストゾーン(画面)

  • "レコード"(タブ)をクリックします。

ホストゾーン/レコード(タブ)

  • "タイプ"プルダウンで"CNAME"を選択します。

  • 検索欄にレコード名"handson-cli-acm.<独自ドメイン>"を入力して、エンターキーを押します。

  • レコード名"_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.handson-cli-acm.<独自ドメイン>"が表示されていることを確認します。