開発室ブログ

Web API

ConoHa DNS API を Bash で試す

Nintendo Labo の破損が想定を上回る状況につき、修復が喫緊の課題となっている開発室員です。
バイクのスロットルとかネジ切れてんだけど、どう直すのコレ…。んー、どうにか補強入れてみるか…とか考えてるのも楽しいんですけれどもね。

で。前回はこんなの書いてましたが Postman * ConoHa APIでファイアウォール設定 またConoHa API方面で。
DNS APIはどんな感じなんだろ? と調べたときのメモです。

環境というか、ツールというか

調べるだけなら Postman でいいんですが

  1. ちょっとでもスクリプトにしといたら、あとで使うかも
  2. あんま curl 使ってないな、という妙な恐怖感(wgetマン)
  3. Visual Studio Code と Windows Subsystem for Linux の組み合わせでやってみるか

ということで、今回は Bash で適当に書いて試してみます。
特に3については、Windows 上の VSCode 画面一枚でできたら楽だなーと。環境依存がほとんどないちょっとしたスクリプトや検証なら、仮想マシンとか気にしないでやりたかった。
(セットアップ手順はまとめてなかったので割愛します…)

vscode

画面下ですぐ実行・チェックできるのはやっぱ便利(vi が苦手なだけ)

下準備

接続情報

ConoHaのコントロールパネルより、APIユーザー情報・テナントID・エンドポイントなどの情報を集めます。
APIユーザーを作成していない場合は、新しく作ってみてください。

あとはマニュアルとか
ConoHa APIドキュメント

jq インストール

bash で JSONを扱う場合 jq が鉄板でしょうか? CentOS 7 だったら yum install jq.x86_64 とか。
Windows Subsystem for Linux / Ubuntu だったら

sudo su -
[PASSWORD]

apt-get update
apt-get jq

Ubuntu、正直使ったことはないんですが…これで入りました。

設定ファイルつくる

共通の接続情報はファイルにまとめます。ここでは env.conf とでもしておきます。

# 認証情報
API_USERNAME='*********'
API_PASSWORD='*********'
API_TENANT_ID='********************'

# エンドポイント
ENDPOINT_INDEX='https://dns-service.tyo1.conoha.io/'
ENDPOINT_TOKEN='https://identity.tyo1.conoha.io/v2.0/tokens'
ENDPOINT_DOMAINS='https://dns-service.tyo1.conoha.io/v1/domains'

# 一応ヘッダログ残す
HEADER_LOG='./filename'

トークン取得

接続にはトークンが必要なので、取得するスクリプトを作ります。

トークン取得スクリプト

getToken.sh とでもしましょう。

#!/bin/bash

# 設定ファイル読み込み
. ./env.conf

# 取得
jsonData=`curl -s --dump-header $HEADER_LOG \
  $ENDPOINT_TOKEN \
  -H "accept: application/json" \
  -d '{
      "auth" : {
            "passwordCredentials" : {
                "username" : "'${API_USERNAME}'",
                "password" : "'${API_PASSWORD}'"
            }, 
        "tenantId" : "'${API_TENANT_ID}'"
      }
  }' `

TOKEN=`echo $jsonData | jq -r '.access.token.id'`

まず、さっきの設定を .コマンド . ./env.conf にて読み込みまして(bash は source でも良いのかな)。そんで変数jsonData に curl の結果を入れます。
コマンドが長いですが…バッククォート、シングルクォート、ダブルクォートに気を付けて。あとはバックスラッシュの有無にも注意です。レスポンスヘッダは邪魔だけど見たいかもしれないので --dump-header $HEADER_LOG としてファイルに置いときます。(他にいいやり方ありそうだけど)

最後は 変数 TOKEN にトークンを入れるところ。jq で欲しい個所を切り出します。
APIの応答はこんな感じなので

{
  "access": {
    "token": {
      "issued_at": "2015-05-19T07:08:21.927295",
      "expires": "2015-05-20T07:08:21Z",
      "id": "sample00d88246078f2bexample788f7",   ← トークン
      ....
      ...
      ..

'.access.token.id' ってな具合に指定します。-r とすることで、ダブルクォートも取ってくれます。(オプションつけないと “sample00d88246078f2bexample788f7” っていう値になっちゃう)

あとは chmod a+x getToken.sh みたく実行権限つけます。変数取得で使うだけなので不要なんですが、単体実行でテストしたりするかも…ということで。

ドメイン追加

準備できたので、APIを叩いてドメインを追加します。
さっき作ったトークン取得スクリプトを . とか source で読み込むようにしてやる。

#!/bin/bash

# トークン取得($TOKEN に入ります)
. ./getToken.sh

# ドメイン登録
curl -s --dump-header $HEADER_LOG \
  $ENDPOINT_DOMAINS  \
  -X POST \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'x-auth-token: '${TOKEN} \
  -d '{
      "name"  : "domain.tld.",
      "ttl"   : 3600,
      "email" : "mail@address",
      "gslb"  : 0
  }'

getToken.sh によって変数 TOKEN には値が入ってるはず。
curlの方は -X POST でリクエストメソッドをPOSTにしつつ -H 'x-auth-token: '${TOKEN} でリクエストヘッダからトークンを渡す。 -d でJSONをドーンと投げますが、ドメイン名は 末尾ドット付きのFQDN表記 なので注意です。

実行して成功すると、JSONが返ってきます。

$ ./postDomain.sh| jq .
{
  "created_at": "2018-06-27T04:25:22.000000",
  "description": null,
  "email": "mail@address",
  "gslb": 0,
  "id": "*******************",   ← ドメインID
  "name": "domain.tld.",
  "serial": 1530073522,
  "ttl": 3600,
  "updated_at": null
}

jq . とすると、単に整形して表示してくれます。
また レコードを登録する時にIDが必要 になります。控えておくか jq にオプションを付けて取得しておきます。

で、コントロールパネルから見ると…

やったー!

やったー!

nslookup とかで ConoHa DNS サーバーに聞く。

user@****:/mnt/****$ $ nslookup - ns-a1.conoha.io
> set type=SOA
> domain.tld
Server:         ns-a1.conoha.io
Address:        157.7.225.68#53

****.com
        origin = ns-a1.conoha.io
        mail addr = mail@address
        serial = 1530073522
        refresh = 3600
        retry = 600
        expire = 86400
        minimum = 3600

引けますね。

レコードの追加

ドメイン登録時にIDが発行されたので、env.conf に以下を追加しておきます。手動。
APIマニュアルによると、レコード追加は POST /v1/domains/(uuid: domain_id)/records となっていますので…

ENDPOINT_RECORDS='https://dns-service.tyo1.conoha.io/v1/domains/**登録成功時のID**/records'

追加したら、スクリプトを書きます。ドメインと同じ感じに postRecord.sh として…

#!/bin/bash

# トークン取得( $TOKEN に入ります)
. ./getToken.sh

# レコード登録テスト
curl -s --dump-header $HEADER_LOG \
  $ENDPOINT_RECORDS  \
  -X POST \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'x-auth-token: '${TOKEN} \
  -d '{
    "name": "www.domain.tld.",
    "type": "A",
    "data": "192.168.2.3"
  }'

単に最低限の情報で登録するだけなら、ドメインとほぼ同じですね。
成功すると 応答JSON 中にレコードIDが返ってきます。これはドメインIDと同様、削除・更新時に必要になります。

はい。

はい。

まードメインやレコードの登録はできるねー、という確認でした。ひとまず終わりです。
テストのゴミは、コントロールパネルなりAPIなりで削除しておきます。

APIでゾーンごとインポート・エクスポートもできそうなので、ちょいちょいやってみたいところです。

最後にお願い

WSLのCent OS、ホントおねがいします………!

RecentPost