背景
サーバーを作成する際、DNSの反映を自動化したいと思ったことはありませんでしょうか。
サーバーの構築はインストールスクリプトで実行していたりしても、DNSの更新は管理画面で実施したりしている方も多いと思います。
このDNSの自動更新について、ConoHaに用意されているAPIを使用する手順を誰かのために残しておきます。
公式のマニュアルは以下です。
手順
APIユーザーの作成
まず、管理画面にログインして、適当にAPIユーザーを作成します。
作成後
ユーザー名が自動生成されるため、メモしておきます。
テナント情報にて、アクセストークン発行に必要なため、テナントIDもメモしておきます。(塗りつぶしでよくわかりませんが)
エンドポイントにて、DNS Service のエンドポイントと、Identity Service のエンドポイントもメモしておきます。
ユーザーによってエンドポイントが異なるためです。ここにリクエストを送ることになります。
テスト用のドメインを作成
DNSのメニューに移動して、テスト用のサブドメインを作成しておきます。
デフォルトのIPは適当に10.10.10.10などとしておきましょう。
Access Tokenの発行
次に適当なシェルにログインして以下のコマンドを実行します。
username、password、tenantId、エンドポイントの4つは自分のものに書き換えてください。
リクエスト例:
curl -X POST \
-H "Accept: application/json" \
-d '{"auth":{"passwordCredentials":{"username":"ConoHa","password":"paSSword123456","tenantId":"487727e3921d44e3bfe7ebb337bf085e"}}}' \
https://identity.tyo2.conoha.io/v2.0/tokens | jq ".access.token"
jqが無い場合はインストールしておきます。無くても問題ありませんが読みにくいので。
yum -y install jq
レスポンス例:
{
"issued_at": "2022-08-20T22:24:41.751818",
"expires": "2022-08-21T22:24:41Z",
"id": "korega_access_token_dazooooooooooooooo",
"tenant": {
"domain_id": "gnc",
"description": "v2",
"enabled": true,
"id": "aaaaaaaaaaaaaaaaaaaaaaa",
"name": "conoha"
},
"audit_ids": [
"aaaaaaaaaaaaaaaaaaaaa"
]
}
レスポンスのうち、id をメモしておきます。これがアクセストークンになります。
domain id の取得
次にドメインIDを取得します。
どのドメインのレコードを変更するか指定するためです。
X-Auth-Token には先ほど取得したアクセストークンを指定します。
リクエスト例:
curl https://dns-service.tyo2.conoha.io/v1/domains \
> -X GET \
> -H "Accept: application/json" \
> -H "Content-Type: application/json" \
> -H "X-Auth-Token: korega_access_token_dazooooooooooooooo" | jq
レスポンス例:
{
"domains": [
{
"created_at": "2022-08-20T19:56:02.000000",
"description": null,
"email": "postmaster@example.org",
"gslb": 0,
"id": "domain_id_desuuuuuuuuuuuuuuu",
"name": "example.org.",
"serial": 11111111111,
"ttl": 3600,
"updated_at": "2022-08-20T22:21:57.000000"
}
]
}
idをメモしておきます。
これがドメインidになります。
record idを取得
同様に、レコードIDも取得します。
先ほど取得したドメインIDをここで使用します。
リクエスト例:
curl https://dns-service.tyo2.conoha.io/v1/domains/domain-id-desuuuuuuuuuuuuuu/records \
-X GET \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Auth-Token: korega_access_token_dazooooooooooooooo" | jq
レスポンス例:
{
"created_at": "2022-08-20T22:21:56.000000",
"data": "10.10.10.10",
"description": null,
"domain_id": "domain_id_desuuuuuuuuuuuuuuu",
"gslb_check": null,
"gslb_region": null,
"gslb_weight": null,
"id": "record_id_desu",
"name": "test.example.org.",
"priority": null,
"ttl": null,
"type": "A",
"updated_at": null
},
idをメモしておきます。
これがレコードIDになります。
DNSレコードの更新
最後です。ここまでに集めたデータを元にDNSレコードを更新します。
リクエスト例:
curl https://dns-service.tyo2.conoha.io/v1/domains/domain_id_desuuuuuuuuuuuuuuu/records/record_id_desu \
-X PUT \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Auth-Token: korega_access_token_dazooooooooooooooo" \
-d '{
"name": "test.example.org.",
"type": "A",
"data": "20.20.20.20"
}' | jq
レスポンス例:
{
"created_at": "2022-08-20T22:21:56.000000",
"data": "20.20.20.20",
"description": null,
"domain_id": "domain_id_desuuuuuuuuuuuuuuu",
"gslb_check": null,
"gslb_region": null,
"gslb_weight": null,
"id": "record_id_desu",
"name": "test.example.org.",
"priority": null,
"ttl": null,
"type": "A",
"updated_at": "2022-08-20T23:06:44.000000"
}
成功すれば完了です。
シェルスクリプトにする
最後に、このままでは手作業が増えただけですので、シェルスクリプトにしておきます。
変更するDNSレコードは多くの場合で固定だと思いますので、ここでは固定にしています。
※ test.example.org の Aレコードを変更する
また、グローバルIDはcurlで取得しています。
#!/bin/bash
# グローバルIPアドレスを取得
ipaddr=`curl inet-ip.info`
# アクセストークンを取得
access_token=`curl -X POST \
-H "Accept: application/json" \
-d '{"auth":{"passwordCredentials":{"username":"ConoHa","password":"paSSword123456","tenantId":"7727e3921d44e3bfe7ebb337bf085e"}}}' \
https://identity.tyo2.conoha.io/v2.0/tokens | jq -r ".access.token.id"`
# DNSレコードを更新
result=`curl https://dns-service.tyo2.conoha.io/v1/domains/domain_id_desuuuuuuuuuuuuuuu/records/record_id_desu \
-X PUT \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Auth-Token: $access_token" \
-d "{
\"name\": \"test.example.org.\",
\"type\": \"A\",
\"data\": \"$ipaddr\"
}" | jq -r ".data"`
# 結果を表示
if [[ "$ipaddr" == "$result" ]]; then
echo "success!"
else
echo "fail..."
echo "access_token: $access_token"
echo "result: $result"
fi
これでDNSレコードの自動更新ができました。
参考になれば幸いです。
コメント