この記事は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として登録
[コンパネ]
では、スクリプトを実行してみたいと思います。
実際にやってみる
まず、スクリプトAPIリファレンスを参考に必要なリクエストURLとヘッダ、パラメータを設定します。
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が間違えていないか注意してください。
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で管理する」です!