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 a3c69a4..0864c9a 100755 --- a/mail/dns/setup-route53.py +++ b/mail/dns/setup-route53.py @@ -6,12 +6,10 @@ Route 53 DNS 設定スクリプト: SPF / DKIM / DMARC pip3 install boto3 export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=... - export HOSTED_ZONE_ID=Z... # Route 53 ホストゾーン ID (yyamashita.com) - export SERVER_IP=<HetznerサーバーIP> # 自動検出不可の場合のみ python3 /app/infra/mail/dns/setup-route53.py -domains.txt に記載されたサービスドメインと hetzner.yyamashita.com に対して -SPF / DKIM / DMARC TXT レコードを UPSERT する。 +HOSTED_ZONE_ID は yyamashita.com のゾーンを自動検出する。 +SERVER_IP は自動取得(必要に応じて環境変数で上書き可能)。 """ import os @@ -27,10 +25,9 @@ except ImportError: SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) DOMAINS_FILE = os.environ.get("DOMAINS_FILE", os.path.join(SCRIPT_DIR, "..", "domains.txt")) -HOSTED_ZONE_ID = os.environ.get("HOSTED_ZONE_ID", "") -AWS_REGION = os.environ.get("AWS_REGION", "us-east-1") SELECTOR = "mail" PRIMARY = "hetzner.yyamashita.com" +ZONE_DOMAIN = "yyamashita.com" def get_server_ip(): @@ -45,6 +42,17 @@ def get_server_ip(): return "" +def get_hosted_zone_id(client): + if zone_id := os.environ.get("HOSTED_ZONE_ID", ""): + return zone_id + paginator = client.get_paginator("list_hosted_zones") + for page in paginator.paginate(): + for zone in page["HostedZones"]: + if zone["Name"].rstrip(".") == ZONE_DOMAIN: + return zone["Id"].split("/")[-1] + return "" + + def read_domains(path): domains = [] with open(path) as f: @@ -78,9 +86,12 @@ def txt_record(fqdn, raw_value): def main(): - if not HOSTED_ZONE_ID: - print("ERROR: HOSTED_ZONE_ID が未設定です", file=sys.stderr) - print(" export HOSTED_ZONE_ID=Z...", file=sys.stderr) + client = boto3.client("route53") + + zone_id = get_hosted_zone_id(client) + if not zone_id: + print(f"ERROR: {ZONE_DOMAIN} のホストゾーンが見つかりません", file=sys.stderr) + print(" export HOSTED_ZONE_ID=Z... で手動指定してください", file=sys.stderr) sys.exit(1) server_ip = get_server_ip() @@ -100,7 +111,7 @@ def main(): service_domains = read_domains(DOMAINS_FILE) print(f"サーバー IP : {server_ip}") - print(f"ホストゾーン: {HOSTED_ZONE_ID}") + print(f"ホストゾーン: {zone_id} ({ZONE_DOMAIN})") print(f"ドメイン : {[PRIMARY] + service_domains}") print() @@ -122,9 +133,8 @@ def main(): rrs = c["ResourceRecordSet"] print(f" {rrs['Type']} {rrs['Name']}") - client = boto3.client("route53", region_name=AWS_REGION) resp = client.change_resource_record_sets( - HostedZoneId=HOSTED_ZONE_ID, + HostedZoneId=zone_id, ChangeBatch={ "Comment": "Mail auth records (SPF/DKIM/DMARC) via hetzner-infra", "Changes": changes, |
