概要
業務にて、AWSのマルチリージョンフェイルオーバーを検証中
フェイルオーバー時に使用するDNSレコードの重みを変換するスクリプト内にてboto3のlist_resource_record_sets()
を利用していたのですが、不要なレコードまで引っ張ってきてしまっていたので仕様を紐解きます。
list_resource_record_sets()の仕様
list_resource_record_sets()
は、検索条件が指定できるものの、あくまでOR条件での検索になります。
検索条件は以下です(公式Docより引用: https://boto3.amazonaws.com/v1/documentation/api/1.26.88/reference/services/route53/client/list_resource_record_sets.html)
response = client.list_resource_record_sets(
HostedZoneId='string',
StartRecordName='string',
StartRecordType='SOA'|'A'|'TXT'|'NS'|'CNAME'|'MX'|'NAPTR'|'PTR'|'SRV'|'SPF'|'AAAA'|'CAA'|'DS',
StartRecordIdentifier='string',
MaxItems='string'
)
OR条件で検索後、条件に最も合致しているレコードが上位にソートされる仕様になっています。(最大300アイテム)
一見するとAND条件での検索に見えるため注意が必要です。
対応
シンプルですが、ターゲットのレコード名以外を弾く処理にしました。
Route53から引っ張ってきたNameは後半に"."が追加されている点も注意が必要です。
# 対象のレコード以外は処理終了
if record_set["Name"] != f"{record_name}.":
continue
まとめ
当初検証用に新設したアカウントで実行しており、他レコードがなく上記仕様に気づいておりませんでした。本番アカウントで実行中に気付き、幸いことなきを得ましたが冷や汗をかきました。。。
みなさまもお気をつけください。