Edited at
NIFTYDay 12

botocoreとpythonでニフティクラウドAPIを簡単に使う

More than 1 year has passed since last update.

この記事はNIFTY Advent Calendar 2016 12日目の記事です。

昨日は@alice02さんの新入社員の間でRuby勉強会をやっている話という記事でした。

私の名前も少し出ていて嬉しかったです。

ニフティ新卒1年目見習いエンジニアの@umiiiiinsです。

最近部署に配属され、ニフティクラウドAPIを叩く機会があったので、すごく基本的なニフティクラウドAPIをpythonで簡単に叩くお話をしようかと思います。


ニフティクラウドAPI

ニフティクラウドは各種機能をAPIとして提供しています。

リクエストを送るために必要なシグネチャのバージョンは1~4まであり、サービスによって利用できるシグネチャが変わります。

今回は例としてニフティクラウドスクリプトのAPIとシグネチャバージョン4を使います。


botocoreとは

AWS向けのローレベルインターフェースで、AWS CLIやboto3で現在使われています。

ニフティクラウドAPIのシグネチャはAWSと同じ方式で生成されているため、botocoreを使うことが出来ます。

気になる方はbotocoreのリポジトリでソースコードをご確認ください。


準備

Pythonのインストール(今回は3.5.2を使っています。)

ニフティクラウドスクリプトのクイックスタートを行う。

画像の赤枠部分から取得したアクセスキーとシークレットキーを環境変数にACCESS_KEY_IDとSECRET_ACCESS_KEYとして登録

[コンパネ]キャプチャ.JPG

では、スクリプトを実行してみたいと思います。


実際にやってみる

まず、スクリプトAPIリファレンスを参考に必要なリクエストURLとヘッダ、パラメータを設定します。


script_api.py

url = "https://script.api.cloud.nifty.com/2015-09-01" 

headers = {
'X-Amz-Target': '2015-09-01.ExecuteScript',
}
params = {
'ScriptIdentifier': 'test.js',
'Method': 'GET',
'Header': '{}',
'Body': '{}',
'Query': '{"name":"Umino"}',
}

続いて、シグネチャの生成とリクエストをbotocoreを使い行います。

この時AWSRequestの引数のmethodが間違えていないか注意してください。


script_api.py

credentials = Credentials(os.environ["ACCESS_KEY_ID"],os.environ["SECRET_ACCESS_KEY"])

request = AWSRequest(method="POST",url=url,data=params,headers=headers)
SigV4Auth(credentials, "ExecuteScript",'east-1').add_auth(request)
response = BotocoreHTTPSession().send(request.prepare())

必要なものをimportし、上のプログラムを叩いてみると・・・

<?xml version='1.0' encoding='utf-8'?>

<executescriptresponse>
<requestid>
9b195209-c025-4522-8e6a-9840324f3fb6
</requestid>
<executescriptresult>
<result>
<responsestatus>
200
</responsestatus>
<scriptidentifier>
test.js
</scriptidentifier>
<requestquery>
<![CDATA[{"name":"Umino"}]]>
</requestquery>
<requestbody>
<![CDATA[{}]]>
</requestbody>
<responseheader>
<![CDATA[{"Content-Type":"text/plain"}]]>
</responseheader>
<requestheader>
<![CDATA[{}]]>
</requestheader>
<responsedata>
<![CDATA[Umino]]>
</responsedata>
<status>
200
</status>
</result>
</executescriptresult>
</executescriptresponse>

成功し結果が返ってきました。

スクリプトはこちらにあるので参考にしてください。


ちょっと解説

今回Signatureを生成しているのは、SigV4AuthクラスのaddAuthの中で呼ばれている様々なメソッドです。SigV4Authの他にも、シグネチャバージョン2を生成するAigV2Authなどがあるので、これらを利用することによりニフティクラウドAPIで利用シグネチャを簡単に生成できます。

試しにSigV4Authの実行前と後でheaderの中を比べると、実行後にはAuthorizationが追加されていることがわかります。

シグネチャ生成前

{

'X-Amz-Target': '2015-09-01.ExecuteScript',
}

シグネチャ生成後

{

'X-Amz-Target': '2015-09-01.ExecuteScript',
'X-Amz-Date': '20161211T090451Z',
'Authorization': 'AWS4-HMAC-SHA256
Credential=OOICPHKDBZZE9ZNGEBV7/20161211/east-1/ExecuteScript/aws4_request,
SignedHeaders=content-type;host;x-amz-date;x-amz-target,
Signature=ffddxxxxxxxxxxxxxxxxxxxxxxxxxxxxd4',
}

また、試しにSigV2Authを使いサーバのDescribeInstancesを実行してみると、実行後はパラメータに生成されたシグネチャが追加されています。

シグネチャ生成前

{'AccessKeyId': 'OOICPHKDBZZE9ZNGEBV7',

'Action': 'DescribeInstances', 'SignatureVersion': '2',
'Timestamp': '2016-12-11T18:28:03Z', 'SignatureMethod': 'HmacSHA256'
}

シグネチャ生成後

{'AccessKeyId': 'OOICPHKDBZZE9ZNGEBV7',

'Action': 'DescribeInstances', 'SignatureVersion': '2',
'Timestamp': '2016-12-11T09:28:03Z', 'SignatureMethod': 'HmacSHA256',
'Signature': 'FydxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqRc='
}


まとめ

今回はbotocoreを使う例としてpythonから叩くことは少ないかもしれないスクリプトをあげましたが、もちろんスクリプト以外のサービスでも利用可能です。

シグネチャバージョン4になると自前で実装するのはなかなか大変なので、pythonからニフティクラウドAPIを使う際に困ったら参考にしてみてください。

明日は@ntoofuさんによる「Ansibleの構成情報をグラフDBで管理する」です!