処理の実行
リソースレコードセットに必要な情報の取得
ホストゾーン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}
結果(例):
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}
結果(例):
ステータスを確認します。
コマンド:
ROUTE53_CHANGE_STATUS=$( \
aws route53 get-change \
--id ${ROUTE53_CHANGE_ID} \
--query 'ChangeInfo.Status' \
--output text \
) \
&& echo ${ROUTE53_CHANGE_STATUS}
結果(例):
ステータスが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.