ConoHa DNS API を Bash で試す
Nintendo Labo の破損が想定を上回る状況につき、修復が喫緊の課題となっている開発室員です。
バイクのスロットルとかネジ切れてんだけど、どう直すのコレ…。んー、どうにか補強入れてみるか…とか考えてるのも楽しいんですけれどもね。
で。前回はこんなの書いてましたが Postman * ConoHa APIでファイアウォール設定 またConoHa API方面で。
DNS APIはどんな感じなんだろ? と調べたときのメモです。
環境というか、ツールというか
調べるだけなら Postman でいいんですが
- ちょっとでもスクリプトにしといたら、あとで使うかも
- あんま curl 使ってないな、という妙な恐怖感(wgetマン)
- Visual Studio Code と Windows Subsystem for Linux の組み合わせでやってみるか
ということで、今回は Bash で適当に書いて試してみます。
特に3については、Windows 上の VSCode 画面一枚でできたら楽だなーと。環境依存がほとんどないちょっとしたスクリプトや検証なら、仮想マシンとか気にしないでやりたかった。
(セットアップ手順はまとめてなかったので割愛します…)
下準備
接続情報
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、ホントおねがいします………!