mcpField
T
tencentcloud-dns

tencentcloud-dns

github.com/acedatacloudクラウド・DevOps17209 回インストール今日更新
リポジトリ

tencentcloud-dns について

tencentcloud-dns は、Tencent Cloud DNS v3 API で DNSPod のレコードを管理するスキルです。コマンドラインスクリプトまたは Python SDK を使い、削除前のドライラン確認などを行えます。

主な機能

  1. 01ドメインと DNS レコードの一覧表示
  2. 02種類によるレコードの絞り込み
  3. 03レコードの作成と変更
  4. 04確認後のレコード削除
  5. 05一般的な DNS レコード形式への対応

活用シーン

  1. 01サブドメインや検証レコードの追加
  2. 02IP アドレスや CNAME 先の変更
  3. 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)

レコードの種類

種類用途値の例
AIPv4 アドレス1.2.3.4
AAAAIPv6 アドレス2001:db8::1
CNAME別のホスト名へのエイリアスtarget.example.com.
MXメールサーバーmail.example.com.(優先度を MX= で設定)
TXTSPF / 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 エラーが表示された場合は、コンソールで確認してください。

コンソールへのリンク

コメント