ConoHaのAPIを使用して自動的にDNSを更新する

背景

サーバーを作成する際、DNSの反映を自動化したいと思ったことはありませんでしょうか。

サーバーの構築はインストールスクリプトで実行していたりしても、DNSの更新は管理画面で実施したりしている方も多いと思います。

このDNSの自動更新について、ConoHaに用意されているAPIを使用する手順を誰かのために残しておきます。

公式のマニュアルは以下です。

ConoHa API Index|ConoHa API
ConoHaではレンタルサーバー、VPS(仮想専用サーバー)、Windows Serverなどのホスティングサービスを提供しております。充実のラインナップからご利用用途に合わせてお好きなサービスをお選びいただけます。

手順

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レコードの自動更新ができました。

参考になれば幸いです。

コメント

タイトルとURLをコピーしました