diff options
Diffstat (limited to 'mail/dns/setup-route53.py')
| -rwxr-xr-x | mail/dns/setup-route53.py | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/mail/dns/setup-route53.py b/mail/dns/setup-route53.py index 0864c9a..a54fc91 100755 --- a/mail/dns/setup-route53.py +++ b/mail/dns/setup-route53.py @@ -128,22 +128,32 @@ def main(): changes.append(txt_record(f"{SELECTOR}._domainkey.{domain}", dkim_value)) changes.append(txt_record(f"_dmarc.{domain}", "v=DMARC1; p=none")) - print(f"{len(changes)} 件の DNS レコードを UPSERT します...") + print(f"{len(changes)} 件の DNS レコードを個別に UPSERT します...") + ok, skipped = 0, 0 for c in changes: rrs = c["ResourceRecordSet"] - print(f" {rrs['Type']} {rrs['Name']}") + name = rrs["Name"] + rtype = rrs["Type"] + try: + client.change_resource_record_sets( + HostedZoneId=zone_id, + ChangeBatch={ + "Comment": "Mail auth records (SPF/DKIM/DMARC) via hetzner-infra", + "Changes": [c], + }, + ) + print(f" OK {rtype} {name}") + ok += 1 + except client.exceptions.InvalidChangeBatch as e: + msg = str(e) + if "CNAME" in msg or "conflicting" in msg: + print(f" SKIP {rtype} {name} (既存の CNAME と競合)") + skipped += 1 + else: + raise - resp = client.change_resource_record_sets( - HostedZoneId=zone_id, - ChangeBatch={ - "Comment": "Mail auth records (SPF/DKIM/DMARC) via hetzner-infra", - "Changes": changes, - }, - ) - info = resp["ChangeInfo"] print() - print(f"Change ID : {info['Id']}") - print(f"Status : {info['Status']}") + print(f"完了: {ok} 件成功 / {skipped} 件スキップ") print() print("確認コマンド (数分後):") for domain in [PRIMARY] + service_domains: |
