Skip to content

Instantly share code, notes, and snippets.

@voluntas
Last active March 8, 2024 03:28
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save voluntas/811240c5b6a169ae1c6ac401e0197417 to your computer and use it in GitHub Desktop.
Save voluntas/811240c5b6a169ae1c6ac401e0197417 to your computer and use it in GitHub Desktop.
DynamoDB や Route53 などの AWS API が独特な仕様なので紹介

DynamoDB や Route53 などの AWS API が独特な仕様なので紹介

概要

Erlang/OTP の DynamoDB クライアントを作った時に、初めて DynamoDB の HTTP API を触ったらかなり面白い仕様になっており、それ以外のサービスでも採用されているようなので、簡単に紹介します。

DynamoDB

他のサービスについて

https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html

注意

  • 認証の話は一切しません
  • 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 ヘッダーで判定されます。

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 をどう感じたでしょうか、個人的にはかなり アリ です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment