高頻度で作り直すELBのDNS名をaws-cliでRoute53の既存エイリアスレコードへ楽に反映させる

はじめに

作成したELBのDNS名を既存のRoute53レコードセットに登録する、という作業はそこまで発生頻度も多くないことでしょう。開発環境や検証環境にて状況次第かもしれません。

実際に発生する作業は大体こんな感じです。

  • 管理コンソールからロードバランサ一覧を開く
  • 該当のDNS名をコピーする
  • Route53でレコードセットを更新する

管理コンソール上ですぐ完了する内容ですが、

  • この設定が漏れていることに気が付かないケース
  • 実は他にもトラブルが発生して複雑になっているケース

等もあり、可能であれば自動化してストレスの要因にはしたくないというのが正直なところです。

割とあっさりとできつつも、若干注意しておいた方がいい箇所等もあったため、まとめてみました。

予め固めておく項目

以下の2点となります。作成時にパスすることができない項目の筈です。

  • ロードバランサ名
  • Route53 レコードセットの名前

設定手順

batch用ファイル route53_batch.json 内書き換えを行った後、aws route53 change-resource-record-setsを行います。最後に書き換え用テンプレート誤コミット防止でgit restoreを実行しています。

WORKDIR=$(cd $(dirname $0); pwd)
r53_hostedid=$(aws route53 list-hosted-zones | jq -r '.HostedZones[] | if .Name == "example.domain." then . else empty end | .Id' | sed -e 's|/hostedzone/||')
dnsname=$(aws elbv2 describe-load-balancers | jq -r '.LoadBalancers[] | if .LoadBalancerName == "load-balancer" then. else empty end | .DNSName')
elb_hostedid=$(aws elbv2 describe-load-balancers | jq -r '.LoadBalancers[] | if .LoadBalancerName == "load-balancer" then. else empty end | .CanonicalHostedZoneId')
sed -i"" -e "s/%record%/$dnsname/" $WORKDIR/route53_batch.json
sed -i"" -e "s/%hostedid%/$elb_hostedid/" $WORKDIR/route53_batch.json
aws route53 change-resource-record-sets --hosted-zone-id $r53_hostedid --change-batch file://$WORKDIR/route53_batch.json
{
    "ChangeInfo": {
        "Status": "PENDING",
        "Comment": "Update record set",
        "SubmittedAt": "2020-02-13T07:29:35.166Z",
        "Id": "/change/XXXXXXXXXXXX"
    }
}
git restore $WORKDIR/route53_batch.json

route53_batch.json

{
  "Comment": "Update record set",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "sub.example.domain.",
        "Type": "A",
        "AliasTarget": {
            "HostedZoneId": "%hostedid%",
            "DNSName": "dualstack.%record%",
            "EvaluateTargetHealth": false
        }
      }
    }
  ]
}

注意するポイント

HostedZoneId

batch-json内に記述するHostedZoneIdはELBのもので、ドメイン名のものではありません。

警告: 設定では、ドメイン名ではなく、必ず AWS リソースのホストゾーン ID を使用してください。JSON ファイルで、この値はキーと値のペアである HostedZoneId に指定されています。先に進む前に、各リージョンの Elastic Load Balancing、AWS Elastic Beanstalk、Amazon Simple Storage Service (Amazon S3)、および Amazon CloudFront の各エンドポイントの HostedZoneId を確認します。

AWS CLI を使用して Route 53 でエイリアスリソースレコードセットを作成する

dualstack

IPv6対応用です。describe-load-balancersで取得した値には含まれていないため、jsonファイル内に直接記載しています。

dualstack というプレフィックスの付いた DNS 名を使用することによって IPv6 がサポートされるようにすることをお勧めします。

インターネット向け Classic Load Balancers - Elastic Load Balancing

あとがき

パラメータの取得等でやや面倒そうな感じがあったのですが、実際には割とあっさり実現できました。

必要になるケースは限定的ですが、実例を探しても中々見つからなかったこともあり、参考になると幸いです。