この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS APIをコールするとき
こんばんは、よくジョナサンにピットインしているあかりです。今回は、AWSのAPIを呼び出すときに利用するISO 8601形式の日付文字列の作成方法についてご紹介します。
ISO 8601形式
ISO 8601はコンピュータにおける情報交換のための日付と時刻の表現方法について定めた国際規格です。協定世界時 (UTC)の場合、サフィックス 'Z' を付加します。地方時の場合は、+09:00のように付加します。
JavaScriptで作成する
JavaScriptを使ってISO 8601形式の文字列を作成するとき、何気に汎用的な作り方が見つかりません。そこで、以下の様な関数を書いて作成します。
function ISODateString(d){
function pad(n){return n<10 ? '0'+n : n}
return d.getUTCFullYear()+'-'
+ pad(d.getUTCMonth()+1)+'-'
+ pad(d.getUTCDate())+'T'
+ pad(d.getUTCHours())+':'
+ pad(d.getUTCMinutes())+':'
+ pad(d.getUTCSeconds())+'Z'
}
function getTimeStamp(){
var d = new Date();
var now = ISODateString(d);
console.log(now);
}
getTimeStamp()
2014-08-28T23:25:47Z
また、公開されているライブラリを使うのもありですね。
bashで作成する
bashコマンドでISO 8601形式の文字列を作成するsnippetです。
$ (date -u +%Y-%m-%dT%H:%M:%SZ)
2014-08-28T23:25:47Z
Pythonで作成する
Pythonを使ってAPI接続の検証コードを書く時にISO 8601形式をサクッと作成したいですよね。
import datetime
datetime.datetime.utcnow().isoformat()+'Z'
'2014-08-28T14:33:47.002135Z'
API認証するステップ
ISO 8601形式の文字列を使ってAPI認証するステップをご紹介します。
import hmac
import base64
import hashlib
url = "/api"
host = "http://hoge.com"
from datetime import datetime
timestamp = datetime.datetime.utcnow().isoformat()+'Z'
api_secret = "WWWWWWWWWWWWWWWWWWWWWWWWWWW"
canonical = "{}:{}:{}".format(url, host, timestamp)
print canonical
sig_hmac = hmac.new(api_secret, canonical, digestmod=hashlib.sha256)
b64_hmac = base64.encodestring(sig_hmac.digest()).strip()
print timestamp
print b64_hmac
ここで得た文字列を使って得たSignatureをAPIリクエスト時に用いています。
$ curl -v -d "api_key=XXXXXXXXXXXXXXXXXXXX" \
> -d "api_signature=YYYYYYYYYYYYYYYYYYYYYYY" \
> -d "api_timestamp=2014-08-27T22:19:20Z" \
> http://hoge.com/api
まとめ
AWS APIに限らず、公開されているAPIを呼び出す際、多くの場合ISO 8601形式の日付文字列を使って、Signatureを取得します。1回やり方をおぼえてしまえば、他のAPIにアクセスする際も同じようにできますね!