Erlang/OTP の DynamoDB クライアントを作った時に、初めて DynamoDB の HTTP API を触ったらかなり面白い仕様になっており、それ以外のサービスでも採用されているようなので、簡単に紹介します。
- 認証の話は一切しません
- API の使い方の話は一切しません
- かなり雑学的な話です
認証は Version 4 です。
まずはサンプルを読んでみてください
http://docs.aws.amazon.com/amazondynamodb/latest/APIReference//API_PutItem.html
JSON は省略するがヘッダー例をそのまま載せておきます。これは PutItem 、つまり指定したテーブルに指定した Key と Value を追加する API をたたく HTTP リクエストのヘッダーです。
POST / HTTP/1.1
Host: dynamodb.<region>.<domain>;
X-Amz-Date: <Date>
Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=content-length;content-type;host;user-agent;x-amz-content-sha256;x-amz-date;x-amz-target, Signature=<Signature>
User-Agent: <UserAgentString>
x-amz-content-sha256: <PayloadHash>
Content-Type: application/x-amz-json-1.0
Content-Length: <PayloadSizeBytes>
Connection: Keep-Alive
X-Amz-Target: DynamoDB_20120810.PutItem
特徴を紹介していきます。
Amazon DynamoDB に対する HTTP リクエストの実行 http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/MakingHTTPRequests.html
特徴を上げてみます
- 全てのリクエストのメソッドは POST
- 全てのリクエストの URL は /
POST / HTTP/1.1
- 処理の判定は URL ではなく x-amz-target ヘッダー
X-Amz-Target: DynamoDB_20120810.PutItem
- content-type は application/x-amz-json-1.0
Content-Type: application/x-amz-json-1.0
- x-amz-date ヘッダーが必須 ISO8601 形式 (YYYYMMDDThhmmssZ)
- 全ての処理は JSON を送って JSON を返して貰う
- 2014-11-01: x-amz-json-1.1 になっていました。
かなり攻めている感じです。とにかく URL という概念がありません。
全てのアクションは x-amz-target ヘッダーで判定されます。
<<serviceName>>_<<API version>>.<<operationName>>
- ServiceName は DynamoDB
- API version は日付で最新版は 20120810
- operationName は PutItem のようなアクション
この文字列だけでアクションをハンドリングしています。
X-Amz-Target: DynamoDB_20120810.PutItem
エンドポイントはリージョン毎に設定されます。ここは他の AWS のサービスと一緒です。
日本だと以下の通りです。
dynamodb.ap-northeast-1.amazonaws.com
あまり見たことが無い珍しい HTTP API の仕様だったのでまとめておきました。
個人的にはこの API はあまり URL を考えなくていいの良いと感じています。 バージョンを付けず日付というのもこの API を知っていい手だと思いました。
バイナリプロトコルを無理矢理 HTTP に持ってきた感じが凄くするのは自分だけでしょうか … 。というか、これ普通に RPC ですよね。
皆さんはこの API をどう感じたでしょうか、個人的にはかなり アリ です。