tencentcloud-dns について
tencentcloud-dns は、Tencent Cloud DNS v3 API で DNSPod のレコードを管理するスキルです。コマンドラインスクリプトまたは Python SDK を使い、削除前のドライラン確認などを行えます。
主な機能
- 01ドメインと DNS レコードの一覧表示
- 02種類によるレコードの絞り込み
- 03レコードの作成と変更
- 04確認後のレコード削除
- 05一般的な DNS レコード形式への対応
活用シーン
- 01サブドメインや検証レコードの追加
- 02IP アドレスや CNAME 先の変更
- 03不要な DNS レコードの確認や削除
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ acedatacloud/ skills --skill tencentcloud-dnsインストール後、Claude Code で/tencentcloud-dnsを入力して読み込まれたか確認します。
同梱ファイルscripts/dns.py
詳細
DNSPod(Tencent Cloud DNS)
DNSPod API を使用して DNS レコードを管理します。
セットアップ: Tencent Cloud 認証を参照してください。DNSPod はプラットフォームの他の部分と同じ Tencent Cloud SecretId / SecretKey を使用します。v3 API 用の個別の
DP_Id/DP_Keyはありません。以下の SDK クライアントは環境変数からTENCENTCLOUD_SECRET_ID/TENCENTCLOUD_SECRET_KEYを自動的に読み込みます。従来の v2 DNSPod API では異なる形式のキーを使用していました。このスキルは v3 SDK のみを対象としています。
CLI(推奨)
このスキルには、一般的な DNSPod v3 操作をすべて実行できる scripts/dns.py が含まれています。
# $SKILL_DIR can point at another skill loaded this turn — anchor on our own
# script (re-run this at the top of every fresh-shell Bash block).
DNS="$SKILL_DIR/scripts/dns.py"; [ -f "$DNS" ] || DNS=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/dns.py' 2>/dev/null | head -1)
[ -f "$DNS" ] || { echo "tencentcloud-dns script not found (SKILL_DIR=$SKILL_DIR)" >&2; exit 1; }
python3 $DNS domains # list domains
python3 $DNS list example.com # records on one domain
python3 $DNS list example.com --type CNAME # filter by type
python3 $DNS search example.com --keyword api # client-side keyword search
python3 $DNS create example.com --sub www --type A --value 1.2.3.4
python3 $DNS create example.com --sub @ --type MX --value 'mail.example.com.' --mx 10
python3 $DNS create example.com --sub _acme-challenge --type TXT --value '"<token>"'
python3 $DNS update example.com <record-id> --sub www --type A --value 5.6.7.8
python3 $DNS delete example.com <record-id> --yes # destructive, requires --yes
delete サブコマンドには --yes が必要です。指定しない場合は、先に正しい record-id を確認できるよう、ドライランの内容が表示されます。
使用する場面
- 新しいサブドメインを追加する(A / AAAA / CNAME)
- 既存のレコードを更新する(IP や CNAME の宛先を変更する)
- メール関連のレコードを追加する(MX、SPF / DKIM / DMARC の TXT)
- ドメイン検証用の TXT レコードを追加する(Google / Search Console / SSL ACME チャレンジ)
- ドメイン上のレコードを一覧表示または検索する
- 不要になったレコードを削除する
依存関係
pip install tencentcloud-sdk-python
クイックスタート
import os
from tencentcloud.common import credential
from tencentcloud.dnspod.v20210323 import dnspod_client, models
cred = credential.EnvironmentVariableCredential().get_credential()
# DNSPod is global — region is ignored, but the SDK still requires one.
client = dnspod_client.DnspodClient(cred, "")
ワークフロー
アカウント内のドメインを一覧表示する
req = models.DescribeDomainListRequest()
req.Limit = 100
resp = client.DescribeDomainList(req)
for d in resp.DomainList:
print(d.DomainId, d.Name, d.Status, d.RecordCount)
ドメインのレコードを一覧表示する
req = models.DescribeRecordListRequest()
req.Domain = "example.com"
req.Limit = 100 # max 3000
# Optional: req.RecordType = "A"
# Optional: req.Subdomain = "api"
resp = client.DescribeRecordList(req)
for r in resp.RecordList:
print(r.RecordId, r.Name, r.Type, r.Value, "TTL=", r.TTL, "Line=", r.Line)
キーワードで検索する(クライアント側でフィルタリング)
req = models.DescribeRecordListRequest()
req.Domain = "example.com"
req.Limit = 3000
resp = client.DescribeRecordList(req)
matches = [r for r in resp.RecordList if "api" in r.Name or "api" in r.Value]
for r in matches:
print(r.RecordId, r.Name, r.Type, r.Value)
レコードを作成する
def create_record(domain, sub_domain, record_type, value, ttl=600, mx=None):
req = models.CreateRecordRequest()
req.Domain = domain
req.SubDomain = sub_domain # use "@" for the apex
req.RecordType = record_type
req.RecordLine = "默认" # "Default" line — works in all environments
req.Value = value
req.TTL = ttl
if mx is not None:
req.MX = mx
resp = client.CreateRecord(req)
return resp.RecordId
# A record
rid = create_record("example.com", "www", "A", "1.2.3.4")
# CNAME (note: Value MUST end with a dot for absolute target)
rid = create_record("example.com", "api2", "CNAME", "api.example.com.")
# MX (priority via mx=)
rid = create_record("example.com", "@", "MX", "mail.example.com.", mx=10)
# TXT (SPF)
rid = create_record("example.com", "@", "TXT", '"v=spf1 include:_spf.google.com ~all"')
# ACME challenge for cert issuance
rid = create_record("example.com", "_acme-challenge", "TXT", '"<validation-token>"')
既存のレコードを更新する
req = models.ModifyRecordRequest()
req.Domain = "example.com"
req.RecordId = 123456789
req.SubDomain = "www"
req.RecordType = "A"
req.RecordLine = "默认"
req.Value = "5.6.7.8"
req.TTL = 600
client.ModifyRecord(req)
レコードを削除する
# Confirm with the user before running.
req = models.DeleteRecordRequest()
req.Domain = "example.com"
req.RecordId = 123456789
client.DeleteRecord(req)
レコードの種類
| 種類 | 用途 | 値の例 |
|---|---|---|
A | IPv4 アドレス | 1.2.3.4 |
AAAA | IPv6 アドレス | 2001:db8::1 |
CNAME | 別のホスト名へのエイリアス | target.example.com. |
MX | メールサーバー | mail.example.com.(優先度を MX= で設定) |
TXT | SPF / DKIM / DMARC / ドメイン検証 / ACME | "v=spf1 ..."(引用符で囲む) |
NS | サブゾーンへの委任 | ns1.example.com. |
SRV | サービス検出 | 0 5 443 api.example.com. |
CAA | 認証局の認可 | 0 issue "letsencrypt.org" |
CNAME のネイキッドドメイン制限
DNSPod は(他のすべての DNS サービスと同様に)、他のレコードタイプが存在する場合、ネイキッドドメイン @(ドメインそのもの)に CNAME を設定できません。ネイキッドドメインには A を、サブドメインには CNAME を使用してください。上流がホスト名(EdgeOne / CDN のエンドポイントなど)の場合は、EdgeOne コンソールから Alias レコードタイプを使用してください。DNSPod 自体には ALIAS タイプはありません。
RecordLine(「线路」)
DNSPod では、RecordLine を使って ISP や地域ごとに異なる値を返すことができます。99% の場合は "默认"(Default)を選択してください。すべてのリゾルバーに値が返されます。その他によく使われる线路は "电信"、"联通"、"移动"、"境外"、"国内" です。スプリットホライズン DNS の設定にはコンソールを使用してください。API ではレコードを書き込むことだけができます。
変更の確認
dig @119.29.29.29 www.example.com +short # 119.29.29.29 = DNSPod's recursor
dig www.example.com +trace # follow the delegation chain
DNSPod の伝播は、独自のリゾルバーでは通常 1 分以内で、それ以外では TTL の範囲内です。変更を試している間は TTL=60 を使用し、安定したら 600 に引き上げてください。
重要な注意事項
- CNAME の値は、絶対名にするため末尾にドットが必要です(
api.example.com.)。付け忘れても DNSPod は拒否しませんが、リゾルバーに問題が生じます。 - 削除する前にユーザーに確認してください。 元に戻すことはできません。
RecordIdが必要なので、先に検索して正しいレコードであることを確認してください。 NSレコードを安易に変更しないでください。 ネームサーバーの委任が失われると、修正するまでドメイン全体がオフラインになります。- SPF / DMARC の TXT 値は、各チャンクを 255 文字未満にする必要があります。 長いポリシーは、1 つの TXT 値内で複数の引用符付き文字列に分割してください。
- DNSPod の
RecordCountとRecordsPerMinuteの上限は、無料プランと有料プランで異なります。LimitExceededエラーが表示された場合は、コンソールで確認してください。
コンソールへのリンク
- DNSPod コンソール:https://console.cloud.tencent.com/cns
- API リファレンス:https://www.tencentcloud.com/document/product/1097/40694