LoginSignup
12
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-12

この記事は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で管理する」です!

12
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3