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

2. Route53リソースレコードの作成 (A: alfa.<事前に用意した独自ドメイン>.)

手順の目的

ドメイン名"<事前に用意した独自ドメイン>"のRoute53ホストゾーンに、リソースタイプ"A"、リソース名"alfa.<事前に用意した独自ドメイン>."、リソース値"192.0.2.1"のリソースレコードを作成します。

設定値の指定

設定値の指定

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

1. ドメイン名

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

変数の設定:

DIR_TMP_DOMAIN="${HOME}/environment/tmp-handson-cli-route53-novice"

変数の設定:

FILE_TMP_DOMAIN="${DIR_TMP_DOMAIN}/handson-cli-route53-novice" \
  && echo ${FILE_TMP_DOMAIN}

結果(例):

${HOME}/environment/tmp-handson-cli-route53-novice/handson-cli-route53-novice

コマンド:

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

結果(例):

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

2. Route53アクション

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

変数の設定:

ROUTE53_RESOURCE_RECORD_SET_ACTION='CREATE'

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

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

変数の設定:

ROUTE53_RESOURCE_RECORD_SET_TYPE='A'

4. リソースレコードTTL

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

変数の設定:

ROUTE53_RESOURCE_RECORD_SET_TTL='300'

5. リソースレコード名

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

変数の設定:

HOST_NAME='alfa'

変数の設定:

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

結果(例):

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

変数の設定:

ROUTE53_RESOURCE_RECORD_SET_NAME="${HOST_NAME}.${domain_name_fqdn}" \
  && echo ${ROUTE53_RESOURCE_RECORD_SET_NAME}

結果(例):

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

6. リソースレコード値

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

変数の設定:

ROUTE53_RESOURCE_RECORD_SET_VALUE='192.0.2.1'

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

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

変数の設定:

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

ディレクトリが存在することを確認し、存在しない場合は作成します。

コマンド:

ls -d ${DIR_ROUTE53_RESOURCE_RECORD_SET_DOC} > /dev/null 2>&1 \
  || mkdir -p ${DIR_ROUTE53_RESOURCE_RECORD_SET_DOC}

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

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

変数の設定:

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

結果(例):

${HOME}/environment/conf-handson-cli-route53-novice/2023-02-27-alfa.<事前に用意した独自ドメイン>.-A-CREATE.json

9. リソースレコードセットアウトプット一時ファイル用ディレクトリ

リソースレコードセットアウトプット一時ファイル用ディレクトリを指定します。

変数の設定:

DIR_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT="${HOME}/environment/tmp-handson-cli-route53-novice"

ディレクトリが存在することを確認し、存在しない場合は作成します。

コマンド:

ls -d ${DIR_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT} > /dev/null 2>&1 \
  || mkdir -p ${DIR_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}

10. リソースレコードセットアウトプット一時ファイル

リソースレコードセットアウトプット一時ファイルを指定します。

変数の設定:

FILE_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT="${DIR_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}/$(date +%Y-%m-%d)-${ROUTE53_RESOURCE_RECORD_SET_NAME}-${ROUTE53_RESOURCE_RECORD_SET_TYPE}-${ROUTE53_RESOURCE_RECORD_SET_ACTION}-output.json" \
  && echo ${FILE_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}

結果(例):

${HOME}/environment/tmp-handson-cli-route53-novice/2023-02-27-alfa.<事前に用意した独自ドメイン>.-A-CREATE-output.json

設定値の確認

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

変数の確認:

cat << END

  # 1. DOMAIN_NAME:"<事前に用意した独自ドメイン>"
       DOMAIN_NAME="${DOMAIN_NAME}"
  # 2. ROUTE53_RESOURCE_RECORD_SET_ACTION:"CREATE"
       ROUTE53_RESOURCE_RECORD_SET_ACTION="${ROUTE53_RESOURCE_RECORD_SET_ACTION}"
  # 3. ROUTE53_RESOURCE_RECORD_SET_TYPE:"A"
       ROUTE53_RESOURCE_RECORD_SET_TYPE="${ROUTE53_RESOURCE_RECORD_SET_TYPE}"
  # 4. ROUTE53_RESOURCE_RECORD_SET_TTL:"300"
       ROUTE53_RESOURCE_RECORD_SET_TTL="${ROUTE53_RESOURCE_RECORD_SET_TTL}"
  # 5. ROUTE53_RESOURCE_RECORD_SET_NAME:"alfa.<事前に用意した独自ドメイン>."
       ROUTE53_RESOURCE_RECORD_SET_NAME="${ROUTE53_RESOURCE_RECORD_SET_NAME}"
  # 6. ROUTE53_RESOURCE_RECORD_SET_VALUE:"192.0.2.1"
       ROUTE53_RESOURCE_RECORD_SET_VALUE="${ROUTE53_RESOURCE_RECORD_SET_VALUE}"
  # 7. DIR_ROUTE53_RESOURCE_RECORD_SET_DOC:"${HOME}/environment/conf-handson-cli-route53-novice"
       DIR_ROUTE53_RESOURCE_RECORD_SET_DOC="${DIR_ROUTE53_RESOURCE_RECORD_SET_DOC}"
  # 8. FILE_ROUTE53_RESOURCE_RECORD_SET_DOC:"${HOME}/environment/conf-handson-cli-route53-novice/2023-02-27-alfa.<事前に用意した独自ドメイン>.-A-CREATE.json"
       FILE_ROUTE53_RESOURCE_RECORD_SET_DOC="${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC}"
  # 9. DIR_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT:"${HOME}/environment/tmp-handson-cli-route53-novice"
       DIR_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT="${DIR_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}"
  # 10. FILE_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT:"${HOME}/environment/tmp-handson-cli-route53-novice/2023-02-27-alfa.<事前に用意した独自ドメイン>.-A-CREATE-output.json"
        FILE_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT="${FILE_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}"

END

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

処理の実行

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

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

変数の確認:

cat << END

  # FILE_ROUTE53_RESOURCE_RECORD_SET_DOC:"${HOME}/environment/conf-handson-cli-route53-novice/2023-02-27-alfa.<事前に用意した独自ドメイン>.-A-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:"A"
    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:"alfa.<事前に用意した独自ドメイン>."
    ROUTE53_RESOURCE_RECORD_SET_NAME="${ROUTE53_RESOURCE_RECORD_SET_NAME}"
  # ROUTE53_RESOURCE_RECORD_SET_VALUE:"192.0.2.1"
    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": "alfa.<事前に用意した独自ドメイン>.",
        "Type": "A",
        "TTL":  300,
        "ResourceRecords": [
          {
            "Value": "192.0.2.1"
          }
        ]
      }
    }
  ]
}

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

コマンド:

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

結果(例):

(出力なし)

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

コマンド:

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

結果(例):

Z0xxxxxxxxxxxxxxxxxxx

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

変数の確認:

cat << END

  # route53_hosted_zone_id:"Z0xxxxxxxxxxxxxxxxxxx"
    route53_hosted_zone_id="${route53_hosted_zone_id}"
  # FILE_ROUTE53_RESOURCE_RECORD_SET_DOC:"${HOME}/environment/conf-handson-cli-route53-novice/2023-02-27-alfa.<事前に用意した独自ドメイン>.-A-CREATE.json"
    FILE_ROUTE53_RESOURCE_RECORD_SET_DOC="${FILE_ROUTE53_RESOURCE_RECORD_SET_DOC}"
  # FILE_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT:"${HOME}/environment/tmp-handson-cli-route53-novice/2023-02-27-alfa.<事前に用意した独自ドメイン>.-A-CREATE-output.json"
    FILE_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT="${FILE_TMP_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_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT} \
    && cat ${FILE_TMP_ROUTE53_RESOURCE_RECORD_SET_OUTPUT}

結果(例):

{
  "ChangeInfo": {
    "Status": "PENDING",
    "SubmittedAt": "2023-02-27T01:23:45.678Z",
    "Id": "/change/C1LBXXXXXXXXXX"
  }
}

Change IDを取得します。

コマンド:

route53_change_id=$( \
  cat ${FILE_TMP_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ホストゾーンに、リソースタイプ"A"、リソース値"192.0.2.1"のリソースレコード"alfa.<事前に用意した独自ドメイン>."が存在する。」ことを確認します。

コマンド:

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

結果(例):

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

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

コマンド:

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 '^;'

結果(例):

alfa.<事前に用意した独自ドメイン>. 300 IN A 192.0.2.1

手順の完了

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

  • 左ペインの"ホストゾーン"をクリックします。

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

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

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

ホストゾーン(画面)

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

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

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

  • 検索欄にレコード名"alfa"を入力して、エンターキーを押します。

  • レコード名"alfa.<事前に用意した独自ドメイン>."が表示されていることを確認します。