Amazon DynamoDB
初心者が理解した事
間違ってたら教えて下さい
JAWS-UG会津 德納
自己紹介
● 德納 弘和 (とくのう ひろかず)
● 某社の工場のITシステム部門
● 39才にして IT部門へ移動して4年目
– 遅れを取り戻すべく日夜勉強中
● 少し覚えた言語
– VBA, SQL, JavaScript, Java, Perl, Shell...
● コードを極力書かないのがお気に入り
– Pentaho ETL, Oracle APEX, Mojolicious
2013年の学びと挑戦
● ユニケージ開発手法
● Perl, Mojolicious
● Jenkins
● 自動テスト jUnit, Mockito, shUnit2
● Twitter Bootstrap, Google Maps APIなど
● 勉強会の楽しさ!
– エフスタ!
– オープンデータカフェ会津
– JAWS-UG会津
● CODE for AIZU参加
2014年の学びと挑戦
● LODチャレンジ応募
● Hack for Town in Aizu参加
● Meteor(Node.js, MongoDB) on Nitrous.IO
● GitHubデビュ〜
● Amazon DynamoDB 今ここ
クラウド素人です
アカウントを作ったのは7日前
DynamoDBって何?
● Fully Managed NoSQL Database Service
DynamoDBって何?
● Fully Managed NoSQL Database Service
なんのこっちゃ?
DynamoDBって何?
● Fully Managed NoSQL Database Service
– NoSQL
– Fully Managed Database Service
分けて考えよう
NoSQLの理解
● Not only SQL
● 巨大なデータの読み込み速度を上げる
– データ整合性を諦める
● 柔軟なデータ構造 (DynamoDB他一部のみ)
– レコード毎に持つデータを変えられる
● 集計とか検索は得意ではない
Fully Managed DB Service
● サーバーの様にデータベースを借りられる
– 読み書き速度、保存容量、転送量に課金
● 管理は全てAmazonにお任せ
– インストール、アップグレード、パッチ
– 保存容量確保 : 上限無し!
– パフォーマンス調整
– 3カ所に分散保存
簡単に言うと
● 面倒な事はAmazonにお任せ!
● パフォーマンスはSSDでバカっぱや!
● それでも不満なら金で解決!
● 容量の増加を気にしなくて良い!
● 3カ所に分散保管で信頼性抜群!
● 普通のDBと得意分野が違うので気を付けろ!
取り敢えず使ってみよう
● Service - DynamoDB
テーブル作成
● Create Table
テーブル設定
● Primary Key(主キー)
– Hashだけ、又はHashとRangeの組み合わせ
Primary Key
● Hash Key : データ分散用の項目
– UserIDなどデータが集中しない項目を選ぶ
– Game IDや年月など集中する項目を避ける
● Range Key :
– 範囲検索用の項目
● この2項目で一意になるよう詰め込む
Primary Keyの例
● フォーラムを3つのテーブルで表す
Table Primary Key Attributes
Hash Range
Group JAWS-UG奥の
細道
{
LastPostBy="Kurihara"
LastPostDateTime= "2012-01-
03T00:40:57.165Z"
}
Thread JAWS-UG奥の
細道
内容について {
Message = "アンカンファレンスをしては?"
Tags = [ "JAWS-UG", "東北" ]
LastPostDateTime = "2012-01-
03T00:40:57.165Z"
}
Reply JAWS-UG奥の
細道#内容につ
いて
2011-12-
11T00:40:57.
165Z
{
Message = "エクストリーム!"
PostedBy = "Kurihara"
}
項目名 Attributes
● Hash, Range以外の中身
● データ毎にAttributesが変わっても良い
● 型
– String
– Number
– Binary
– String Set (配列)
– Number Set (配列)
– Binary Set (配列)
日付などは文字列に変換
Index作成
● オプションなので何も設定しなくても良い
Index
● テーブル当り検索用に各5項目を設定出来る
– 裏では同期するHash-Rangeテーブルを作成
– 書き込み、保存コストが発生
● 作成時のみ設定可能。 追加、変更出来ない。
● Local secondary index
– Hash Keyはテーブルと同じ項目、Range Key
は別項目でHash-Rangeテーブルを作成
● Global secondary index
– HashもRangeもテーブルとは別項目でHas-
Rangeテーブルを作成
Index
● こんな風に動いているらしい
Hash Range Attribute1 Attribute2
A 1 あ い
B 2 う え
Hash Attribute2 Attribute1 Range
A い あ 1
B え う 2
Primary Key
Primary Key
Index
性能設定
● Read Capacity Unit
– 4KBのアイテムを1個/秒で読み込める
● Write Capacity Unit
– 1KBのアイテムを1個/秒で書き込める
警告の設定
● 設定した性能の75~95%を超えた場合にメール
通知を出せる
最後に確認
● お約束
¥60/月
出来上がり!
● 3つ作ってみました。
欠点
● Indexの修正が出来ない
– 変えたくなると作り替え
– 大量にデータを移すにはコストが発生
● ERD的な書類との同期の仕組みが無い (多分)
● 向き、不向きがある
– Primary Key, Index以外を検索するには全件
検索するしかない
– 一貫性のあるTransactionはRDBを使うか
JavaのTransaction Libraryを使う必要がある
– RDBと併用が推奨されているが複雑化
コンソール以外からも!
● 公式SDK達
● 非公式もPerlなどたくさん
Android Browser iOS
Java .NET Node.js
Python PHP Ruby
SDKに用意されているAPI
● Table操作
– CreateTable
– DeleteTable
– DescribeTable
– ListTables
– UpdateTable
● バッチ処理
– BatchGetItem
– BatchWriteItem
● Item操作
– PutItem
– GetItem
– UpdateItem
– DeleteItem
● 検索
– Query : Primary
or Index
– Scan : 総なめ
あそんでみよう!
NoSQLと言えばビッグデータ
ビッグデータと言えば
Twitter解析
気になる疑問を
徹底検証!
調べる事は、、、
自主規制
仕方ないので
WebSockで掲示板
多くの例があって面白く無い
RESTfull APIを作ってみよう!
こんな感じ
DynamoDBNitrous.IOWeb Client
● 全部ただ
RESTfull API
● 簡単なものだけ実装しました
– BatchGetItemとBatchWriteItemは未実装
操作 Function Method URL例
Create putItem POST /Group/Hash?p=1&q=A
Read scan
getItem
GET /Groups
/Groups/Hash
Update updateItem PUT /Group/Hash?p=A&q=1
Delete deleteItem DELETE /Group/Hash
Create by POST
● curl -i -X POST -H "Content-Type:
application/json" -d '{"datetime":"2013-03-
13T23:27:32.256Z" , "by":"とくのう"}'
http://your_host:8080/Group/JAWS-UG
Read all by GET
● curl -H "Content-Type: application/json"
http://your_host:8080/Groups
Read by GET
● curl -H "Content-Type: application/json"
http://your_host:8080/Group/JAWS-UG奥の細
道
日本語はURIエンコードしましょう
Update by PUT
● curl -i -X PUT -H "Content-Type:
application/json" -d '{"datetime":"2021-03-
14T00:04:01.951Z" , "by":"連れて行って貰った
事ありません"}'
http://your_host:8080/Group/JAWS-UG
Delete by DELETE
● curl -i -X DELETE
http://your_host:8080/Group/JAWS-UG
もう一捻り欲しい
こんな感じ
DynamoDBNitrous.IOPentaho ETL
● これも全部無料
データ処理ならPentaho
● でもDynamoDBの速度制限で早く無い
● 早くしたいなら金を出す
Group LastPostDateTime LastPostBy
あ 2013-03-13T23:27:32.256Z とくのう
い 2013-03-13T23:27:32.256Z とくのう
う 2013-03-13T23:27:32.256Z とくのう
え 2013-03-13T23:27:32.256Z とくのう
お 2013-03-13T23:27:32.256Z とくのう
か 2013-03-13T23:27:32.256Z とくのう
き 2013-03-13T23:27:32.256Z とくのう
く 2013-03-13T23:27:32.256Z とくのう
け 2013-03-13T23:27:32.256Z とくのう
こ 2013-03-13T23:27:32.256Z とくのう
あ1 2013-03-13T23:27:32.256Z とくのう
い1 2013-03-13T23:27:32.256Z とくのう
う1 2013-03-13T23:27:32.256Z とくのう
え1 2013-03-13T23:27:32.256Z とくのう
お1 2013-03-13T23:27:32.256Z とくのう
か1 2013-03-13T23:27:32.256Z とくのう
き1 2013-03-13T23:27:32.256Z とくのう
まとめ
● 管理は全てAmazonにお任せで楽!
● 外部キーが無いがアプリ側で実装しているのが
実態らしい
– けっこう面倒
● Indexの追加、削除が出来ないのは痛い
● 柔軟に検索出来ない。 1MB毎に再検索とか
● 実体とドキュメントを同期させる方法が欲しい
● 使い捨てと巨大なデータを持つシステムだけが
美味しい使い方?
ご清聴ありがとうございました
実績
● 2014.03.08 アカウント作成
● 2014.03.11 Hack for Town 3年の
2014.03.11 クロスオーバー振り返り参加
● 2014.03.12 Game Lab成果発表会参加
● 2014.03.13 RESTfull 開発、Pentahoで遊ぶ
● 2014.03.14 発表
Appendix
Region
● ここで使っているRegionを見つけた。
– http://docs.aws.amazon.com/general/latest/gr/rande.html
Credentialsの確認方法
IAM
Create a New Group of Users
Group名
Permissions
● 全部出来るPower User Accessを選択
Policy確認
● だから何って感じだけど見さされる
Create User
Userの確認
Credentials
● やっと確認

Amazon DynamoDB 初心者が理解した事