之前我的域名是在百度云上注册的
服务器又在腾讯云上
导致我每做一个项目,要部署的时候,都得跑到百度云上加一条域名解析记录
感觉很麻烦
最近在研究https的时候,发现是可以通过开放接口操作dns
直接使用代码添加或删除解析记录
本文档以百度云为例,其他云平台操作方式类似
- 先找到安全认证,创建Access Key,把 Secret Key记录好

百度云 dns api
使用百度云通过的sdk操作dns
package main
import (
"fmt"
"github.com/baidubce/bce-sdk-go/services/dns"
"os"
)
var AccessKeyID = ""
var AccessKeySecret = ""
const Endpoint = "dns.baidubce.com"
const Domain = "fengfengzhidao.com"
var ldClient *dns.Client
func init() {
if AccessKeyID == "" {
AccessKeyID, _ = os.LookupEnv("AccessKeyID")
}
if AccessKeySecret == "" {
AccessKeySecret, _ = os.LookupEnv("AccessKeySecret")
}
_ldClient, err := dns.NewClient(AccessKeyID, AccessKeySecret, Endpoint)
if err != nil {
panic(fmt.Sprintf("初始化客户端失败: %v\n", err))
return
}
ldClient = _ldClient
}
func getRecordList() {
res, err := ldClient.ListRecord(Domain, &dns.ListRecordRequest{
//Rr: "www",
//MaxKeys: 10,
})
if err != nil {
fmt.Printf("查询记录失败: %v %T\n", err, err)
return
}
fmt.Printf("查询成功,总记录数: %d\n", len(res.Records))
for _, record := range res.Records {
fmt.Printf("记录ID %s: 类型=%s, 主机记录=%s, 记录值=%s\n",
record.Id, record.Type, record.Rr, record.Value)
}
}
func addRecord() {
err := ldClient.CreateRecord(Domain, &dns.CreateRecordRequest{
Rr: "yy", // 主机记录
Type: "A", // 类型
Value: "1.1.1.1", // 记录值
}, "")
if err != nil {
fmt.Println("创建记录失败", err)
return
}
fmt.Println("添加记录成功")
}
func main() {
getRecordList()
}
腾讯云 dns api
百度云大家用的应该比较少,写了一个腾讯云的例子
package main
import (
"encoding/json"
"fmt"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
"os"
)
var SecretId = ""
var SecretKey = ""
var Domain = "domain.com"
var cl *dnspod.Client
func init() {
if SecretId == "" {
SecretId, _ = os.LookupEnv("SecretId")
}
if SecretKey == "" {
SecretKey, _ = os.LookupEnv("SecretKey")
}
credential := common.NewCredential(SecretId, SecretKey)
cpf := profile.NewClientProfile()
_cl, err := dnspod.NewClient(credential, "", cpf)
if err != nil {
panic(fmt.Sprintf("初始化dns客户端错误 %s", err))
}
cl = _cl
}
func getRecordList() {
res, err := cl.DescribeRecordList(&dnspod.DescribeRecordListRequest{
Domain: &Domain,
})
if err != nil {
fmt.Println(err)
return
}
for i, item := range res.Response.RecordList {
byteData, _ := json.Marshal(item)
fmt.Println(i, string(byteData))
}
}
func addRecord() {
var recordType = "A"
var value = "2.2.2.2"
var subDomain = "x"
var recordLine = "默认"
res1, err := cl.CreateRecord(&dnspod.CreateRecordRequest{
Domain: &Domain,
RecordType: &recordType,
Value: &value,
SubDomain: &subDomain,
RecordLine: &recordLine,
})
fmt.Println(res1, err)
}
func main() {
getRecordList()
}
版本
module test_project
go 1.24.0
require (
github.com/baidubce/bce-sdk-go v0.9.254 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.8 // indirect
)