IIJ DNSアウトサービスを使っていて、DO-APIを触る機会があったのですが、マニュアルのサンプルプログラムをそのまま流用するにはちょっと悩んだところがあったので、コピペで使えそうなものを残しておきます。
署名作成関数
signature.sh
### StringToSignを作成しKeyから署名を作成する
### http://manual.iij.jp/dns/doapi/754437.html
function signature
{
IIJAPI_EXPIRE=$1
METHOD=$2
REQUEST_PATH=$3
CONTENTMD5=$4
CONTENTTYPE=$5
### URLエンコードは呼び手側で実施済みとする
URL_ENC_PATH=${REQUEST_PATH}
{
echo $METHOD
echo $CONTENTMD5
echo $CONTENTTYPE
echo "x-iijapi-expire:${IIJAPI_EXPIRE}"
echo "x-iijapi-signaturemethod:HmacSHA256"
echo "x-iijapi-signatureversion:2"
echo -n "${URL_ENC_PATH}"
} | openssl dgst -sha256 -binary -hmac $IIJAPI_SECRET_KEY $STRING_TO_SIGN | base64
return 0
}
ECHO
echo.sh
### API:GET echo
### http://manual.iij.jp/dns/doapi/754637.html
function check_echo
{
REQUEST_PATH="/r/${APIVERSION}/echo/qwerty12345.json"
SIGNATURE=`signature ${IIJAPI_EXPIRE} "GET" ${REQUEST_PATH} "" ""`
curl -s -H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
-H "x-iijapi-SignatureMethod:HmacSHA256" \
-H "x-iijapi-SignatureVersion:2" \
-H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
https://${HOST}${REQUEST_PATH}
return 0
}
GET zones
get_zones.sh
### API:GET zones
### http://manual.iij.jp/dns/doapi/754466.html
function get_zones
{
REQUEST_PATH="/r/${APIVERSION}/${DOSERVICECODE}/zones.json"
SIGNATURE=`signature ${IIJAPI_EXPIRE} "GET" ${REQUEST_PATH} "" ""`
curl -s -H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
-H "x-iijapi-SignatureMethod:HmacSHA256" \
-H "x-iijapi-SignatureVersion:2" \
-H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
https://${HOST}${REQUEST_PATH}
return 0
}
GET records
get_records.sh
### API:GET records
### http://manual.iij.jp/dns/doapi/754619.html
function get_records
{
REQUEST_PATH="/r/${APIVERSION}/${DOSERVICECODE}/${ZONE}/records/DETAIL.json"
SIGNATURE=`signature ${IIJAPI_EXPIRE} "GET" ${REQUEST_PATH} "" ""`
curl -s -H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
-H "x-iijapi-SignatureMethod:HmacSHA256" \
-H "x-iijapi-SignatureVersion:2" \
-H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
https://${HOST}${REQUEST_PATH}
return 0
}
使い方
上記に記載したシェルの関数を使って、あとはサービスコードとアクセスキー、シークレットキーを与えて実行すればきっと動くと思います。
下記のサンプルは、ECHOで認証情報をチェックしたあと、ZONE情報を取得して、その先頭のZONEのレコード一覧を整形したjsonでダンプする例です。
エラー処理とか全く考慮していないので、適宜工夫してくださいね~。
sample.sh
### main ###
HOST="do.api.iij.jp"
APIVERSION="20140601"
IIJAPI_EXPIRE=`date -d '15 mins' +'%Y-%m-%dT%H:%M:%SZ'`
DOSERVICECODE=""
IIJAPI_ACCESS_KEY=""
IIJAPI_SECRET_KEY=""
check_echo > /dev/null
ZONE=`get_zones | jq -r '.ZoneList[0]'`
get_records | jq '.'
PUTの例
ここまでの例だとGETしか呼んでなかったのでPUTの例としてCOMMIT/RESETのコードも貼っておきます。
個人的にはリクエストボディが空の時に署名で使うCONTENTMD5文字列ってどうするのか試行錯誤したのですが、結局、空文字でいけました。
リクエストボディが必要なAPIを使う場合はリクエストボディの文字列をmd5sum関数に食わせて作成したハッシュ文字列を入れてくださいね。もちろんcurl呼ぶ時は -H "Content-MD5:{ハッシュ文字列}"
を加えるのを忘れずに。
commit_reset.sh
### API:PUT commit
### http://manual.iij.jp/dns/doapi/754632.html
function commit
{
REQUEST_PATH="/r/${APIVERSION}/${DOSERVICECODE}/commit.json"
METHOD="PUT"
CONTENTMD5=""
CONTENTTYPE="application/json"
SIGNATURE=`signature ${IIJAPI_EXPIRE} ${METHOD} ${REQUEST_PATH} "${CONTENTMD5}" "${CONTENTTYPE}"`
curl -s -H "Content-Type:application/json" \
-H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
-H "x-iijapi-SignatureMethod:HmacSHA256" \
-H "x-iijapi-SignatureVersion:2" \
-H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
-X ${METHOD} \
https://${HOST}${REQUEST_PATH}
return 0
}
### API:PUT reset
### http://manual.iij.jp/dns/doapi/754610.html
function reset
{
REQUEST_PATH="/r/${APIVERSION}/${DOSERVICECODE}/${ZONE}/reset.json"
METHOD="PUT"
CONTENTMD5=""
CONTENTTYPE="application/json"
SIGNATURE=`signature ${IIJAPI_EXPIRE} ${METHOD} ${REQUEST_PATH} "${CONTENTMD5}" "${CONTENTTYPE}"`
curl -s -H "Content-Type:application/json" \
-H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
-H "x-iijapi-SignatureMethod:HmacSHA256" \
-H "x-iijapi-SignatureVersion:2" \
-H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
-X ${METHOD} \
https://${HOST}${REQUEST_PATH}
return 0
}