Post on 13-Jul-2015
AWS SimpleDB
いろんなサービスがある中でちょっとマイナーか
オンラインストレージ
スプレッドシートのようなデータベース• スキーマ定義不要• インデックス付けなどを自動化• SELECT文でのクエリー
完全従量制• 申し込み時にクレジットカードを記録する• 転送量やストレージ量で課金される• さんざん試してみたけど、請求は0円だった
411年7月9日土曜日
SimpleDBの概念
1つのテーブルは「ドメイン」• 複数のドメインを作ることができるが、ドメイン間での連携はクラ
ウド側からはできない
書き込み時に指定した「属性」が作られ「値」を持つ• レコードに相当するのは「アイテム」というもの• ItemNameというキーフィールドが作られる。そこに値を明示的に
一意に入れていく必要がある• 属性と値の設定を書き込むことで、アイテムにその属性の値が記録
される• 検索時には属性は「フィールド(カラム)」としての役割を持つ
611年7月9日土曜日
情報源?書籍があるが…
もちろん、AWSにはマニュアルもあるが…
書籍も翻訳されている• しかしながら、APIの生のたたき
方は書いていない• 概念とフレームワークの使い方が
中心の書籍
711年7月9日土曜日
API
いわゆるREST方式• 作る/更新する、削除する、読み出す~が主な仕組み
独特な認証方法• 秘密鍵でハッシュを作り、それをリクエストに含める• 従って、ハンドシェークはない
APIの詳細は今ひとつ• マニュアルの情報は十分ではない• 既存のフレームワークを解析する方が早いかも
言語ごとにフレークワークを用意• iOS対応のものもあり、これを使うのがもちろん単純
811年7月9日土曜日
リクエスト
URLのアドレスは指定されたものを使う• 処理は、?より後にパラメータとして指定する
認証のためのハッシュを除いたパラメータを作成• キーがアルファベット順になっていないといけない• field1、field10、field11、field2みたいになっていないといけない
base64にしたりなんたらとややこしい
レスポンスはエラーも正しい場合もどちらもXML• 普通にパースすればいいでしょう
911年7月9日土曜日
リクエスト例
https://sdb.ap-northeast-1.amazonaws.com/?AWSAccessKeyId=AKIAJZ6KBTPPRMGJA6VA&Action=Select&SelectExpression=select%20familyname%2Cgivenname%2Cfamilyname_yomi%2Cgivenname_yomi%2Ctelephone%2Ccellphone%2Cemail%2Cbirthday%2Czip%2Cpref%2Ccity%2Caddress%2Cblood%20from%20CloudAddressBook&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-07-08T16%3A59%3A51Z&Version=2009-04-15&Signature=L%2FTow6%2FUt%2BiUBAdBboHt6RGYiOlzLUkDksyuqDzJH8A%3D
1011年7月9日土曜日
リクエストの認証データの付加
GET[return]sdb.ap-northeast-1.amazonaws.com[return]AWSAccessKeyId=AKIAJZ6KBTPPRMGJA6VA&Action=Select&SelectExpression=select%20familyname%2Cgivenname%2Cfamilyname_yomi%2Cgivenname_yomi%2Ctelephone%2Ccellphone%2Cemail%2Cbirthday%2Czip%2Cpref%2Ccity%2Caddress%2Cblood%20from%20CloudAddressBook&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-07-08T16%3A59%3A51Z&Version=2009-04-15[return]
上記のデータに対して、秘密キーを指定したハッシュを作成して、最後に追加する
1111年7月9日土曜日
属性書き込みのリクエストhttps://sdb.ap-northeast-1.amazonaws.com/?AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Action=PutAttributes&Attribute.1.Name=familyname&Attribute.1.Value=%E6%9D%BE%E5%B1%85%E4%B9%85&Attribute.10.Name=pref&Attribute.10.Value=%E9%95%B7%E9%87%8E%E7%9C%8C&Attribute.11.Name=city&Attribute.11.Value=%E9%95%B7%E9%87%8E%E5%B8%82&Attribute.12.Name=address&Attribute.12.Value=%E4%BF%A1%E5%B7%9E%E6%96%B0%E7%94%BA%E5%B7%A6%E5%8F%B399-99-13&Attribute.13.Name=blood&Attribute.13.Value=B&Attribute.2.Name=givenname&Attribute.2.Value=%E6%97%A9%E7%B4%80&Attribute.3.Name=familyname_yomi&Attribute.3.Value=%E3%81%BE%E3%81%A4%E3%81%84%E3%81%8F&Attribute.4.Name=givenname_yomi&Attribute.4.Value=%E3%81%95%E3%81%8D&Attribute.5.Name=telephone&Attribute.5.Value=031-9876-5432&Attribute.6.Name=cellphone&Attribute.6.Value=090-0000-0000&Attribute.7.Name=email&Attribute.7.Value=dummy_addr%40example.com&Attribute.8.Name=birthday&Attribute.8.Value=31316&Attribute.9.Name=zip&Attribute.9.Value=381-2424&DomainName=CloudAddressBook&ItemName=1004&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-07-08T17%3A25%3A21Z&Version=2009-04-15&Signature=0qrWuMKoIVzWBIWaG%2Bpuhz%2B97kIAf0UXmZHCuq9Vqow%3D
1311年7月9日土曜日
[作成物] Simple DBを使った住所録
初期データを入れるためのシェルスクリプト• 強引だが、どうやらできた模様
iOSネイティブアプリケーション• あえて、AWSが提供するフレームワークを使わないで作成• 通信部分はNSURLConnectionを使う手法• リクエストのパラメータの作り込みが難関• とは言え、意外に簡単
1411年7月9日土曜日
シェルスクリプト
timestamp=`date -u +%Y-%m-%dT%H%%3A%M%%3A%SZ`params="AWSAccessKeyId=${accessKeyId}&Action=CreateDomain&DomainName=${domain}&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${timestamp}&Version=2009-04-15"sign=`echo -n -e "GET\n${endpoint}\n/\n${params}" | openssl dgst -sha256 -binary -hmac ${secretAccessKey} | openssl base64 | sed -e 's/+/%2B/g' | sed -e 's/=/%3D/g' `curl "https://${endpoint}/?${params}&Signature=${sign}"
ポイントは、opensslコマンドの使い方• ハッシュの求め方• base64の求め方
1511年7月9日土曜日