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

この記事は[NIFTY Advent Calendar 2016](http://qiita.com/advent-calendar/2016/nifty) 12日目の記事です。

昨日は@alice02さんの[新入社員の間でRuby勉強会をやっている話](http://qiita.com/alice02/items/b793e60949f27fbedc16)という記事でした。
私の名前も少し出ていて嬉しかったです。

ニフティ新卒1年目見習いエンジニアの@umiiiiinsです。
最近部署に配属され、ニフティクラウドAPIを叩く機会があったので、すごく基本的なニフティクラウドAPIをpythonで簡単に叩くお話をしようかと思います。

## ニフティクラウドAPI
ニフティクラウドは各種機能をAPIとして提供しています。
リクエストを送るために必要なシグネチャのバージョンは1~4まであり、サービスによって利用できるシグネチャが変わります。
今回は例としてニフティクラウドスクリプトのAPIとシグネチャバージョン４を使います。

## botocoreとは
AWS向けのローレベルインターフェースで、AWS CLIやboto3で現在使われています。
ニフティクラウドAPIのシグネチャはAWSと同じ方式で生成されているため、botocoreを使うことが出来ます。
気になる方は[botocore](https://github.com/boto/botocore)のリポジトリでソースコードをご確認ください。

##準備
Pythonのインストール(今回は3.5.2を使っています。)
ニフティクラウドスクリプトの[クイックスタート](http://cloud.nifty.com/guide/script/q!)を行う。
画像の赤枠部分から取得したアクセスキーとシークレットキーを環境変数にACCESS_KEY_IDとSECRET_ACCESS_KEYとして登録
[コンパネ]![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/70427/78d4d624-0510-addf-36d2-b382b96c0ef8.jpeg)


では、スクリプトを実行してみたいと思います。
## 実際にやってみる
まず、[スクリプトAPIリファレンス](http://cloud.nifty.com/api/script/start.htm)を参考に必要なリクエスト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
<?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>
```
成功し結果が返ってきました。
スクリプトは[こちら](https://github.com/UminoShohei/niftycloud_api_request/blob/master/script_api.py)にあるので参考にしてください。

### ちょっと解説
今回Signatureを生成しているのは、SigV4AuthクラスのaddAuthの中で呼ばれている様々なメソッドです。SigV4Authの他にも、シグネチャバージョン2を生成するAigV2Authなどがあるので、これらを利用することによりニフティクラウドAPIで利用シグネチャを簡単に生成できます。
試しにSigV4Authの実行前と後でheaderの中を比べると、実行後にはAuthorizationが追加されていることがわかります。

シグネチャ生成前


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

シグネチャ生成後

```python
{
 '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を実行してみると、実行後はパラメータに生成されたシグネチャが追加されています。

シグネチャ生成前

```python
{'AccessKeyId': 'OOICPHKDBZZE9ZNGEBV7',
 'Action': 'DescribeInstances', 'SignatureVersion': '2', 
 'Timestamp': '2016-12-11T18:28:03Z', 'SignatureMethod': 'HmacSHA256'
}
```

シグネチャ生成後

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

## まとめ
今回はbotocoreを使う例としてpythonから叩くことは少ないかもしれないスクリプトをあげましたが、もちろんスクリプト以外のサービスでも利用可能です。
シグネチャバージョン4になると自前で実装するのはなかなか大変なので、pythonからニフティクラウドAPIを使う際に困ったら参考にしてみてください。


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