センサーデータを集めてきたら次はどんどんしまわなきゃ
さっき、スマホから大量に送られてくる加速度センサーデータをAmazon DynamoDBに格納するとおっしゃってましたが、そもそもDynamoDBってどういうデータベースなんですか?
Amazon DynamoDBはNoSQLデータベースのフルマネージドサービスです。
NoSQLデータベースなら、MongoDBを使ったことがあります。DynamoDBは、MongoDBとはどう違うんでしょうか?
Amazon DynamoDBもMongoDB同様にNoSQLと呼ばれるタイプのデータベースです。特徴としては管理不要で信頼性が高く、高速です。またストレージ容量の制限もありません。とてもクラウドっぽいデータベースと言えます。
言語マスターテーブルを作成する
Amazon DynamoDBには、スマホから送信されてくる加速度センサーデータだけでなく、応援対象となるプログラミング言語のリストも格納します。スマホでアクセスするWebページで表示する言語名のリストは、Amazon DynamoDB上の言語マスターテーブルの情報から作成することにします。また、Amazon Kinesisで取得したセンサーデータの集計値もAmazon DynamoDBに保存します。
ところで、通常データベースを利用する場合、データベースを作成するところから始めるのが一般的ですがAmazon DynamoDBではそれがないんですよ。テーブル単位でデータを管理します。テーブルには項目が格納されています。項目というのはRDBで言うところのレコードに相当するものです。また、属性という概念があり、これがRDBで言うところのカラムに近いものです。
データベースなのにデータベースを作らないって、何だか不思議です。
まったくです。それだけシンプルなデータベースだと言えるかもしれませんね。
では、マネージメントコンソールで「Database」の「Amazon DynamoDB」を選択し、[Create Table]をクリックしてください。
はい、クリックしました。
最初に、言語マスターテーブルを作成します。
[Table Name]に「lang」と入力します。続いて、[Primary Key Type]を「Hash」にし、[Hash Attribute Name]に「Lang」と入力します。これで、プライマリキーとしてLangという属性を指定したことになります。
Amazon DynamoDBのプライマリキーとグローバルセカンダリインデックス
Amazon DynamoDBでは、プライマリキーの種類として「Hash」または「Hash and Range」を選択します。「Hash」の場合には[Hash Attribute Name]で指定した属性、「Hash and Range」の場合には[Hash Attribute Name]で指定する属性と[Range Attribute Name]で指定する属性の値の組み合わせでデータの取得や検索をすることができます。
今回は、ハッシュキーとしてLangを指定しているので、「Ruby」や「JavaScript」といった言語名で項目のデータ取得ができます。プライマリキー以外の属性で検索を行うには、検索条件として使用したい属性にインデックスを作成する必要があります。
今回は、Flagで検索ができるようにグローバルセカンダリインデックスを用意します。
[Index Type]を「Global Secondary Index」にし、[Index Hash Key]に「Flag」と入力してください。[Index Range Key]は使いません。他はそのままで、[Add Index To Table]をクリックしてください。
よし、インデックスが作成されました。
スループットを設定する
Amazon DynamoDBでは、スループットとして読み取りと書き込みのキャパシティユニットというものを指定します。1ユニットは、読み取りと書き込みで異なり、読み取りではサイズが4KBの項目、書き込みでは1KBの項目を1秒間に1回処理できることを意味します。今回はひとまずデフォルトのままとします。
次は、監視の設定ですが今回はひとまず設定をしないで先に進みます。したがってって[Use Basic Alarms]のチェックを外して[Continue]をクリックしてください。
最後にテーブルの概要が表示されたら、[Create]をクリックしてください。
langテーブルが作成されました。
テーブルに項目を追加する
テーブルが作成されると[Status]が「ACTIVE」になります。そうしたら[Explore Table]をクリックして、テーブルに項目を追加していきます。
[Create Item]をクリックすると、先ほど指定したLangとFlagが表示されます。LangにRuby、Flagに1を入力して、[Save]をクリックします。
Flagは画面への表示/非表示を示すために使い、1の場合にその項目を画面に表示することにします。
「Item Added Successfully」と表示されました。
じゃあ、好きな言語をいくつか追加していきましょう。追加したら[Browse Items]タブを選択し、[Scan]を選択して[Go]をクリックすると、テーブルの全項目が表示されます。
集計値テーブルを作成する
そういえば、プログラミング言語ごとのセンサーデータの集計値は、どのAttiributeに保存するんですか?
それは言語マスターテーブルではなく、集計値テーブルに保存します。集計値テーブルを作成しましょう。
[List Tables]タブで[Create Table]をクリックしてください。
[Table Name]を「counter」、[Primary Key Type]を「Hash」、[Hash Attribute Name]を「Event_Id」にして[Continue]をクリック。
セカンダリインデックスは使わないので、そのまま[Continue]をクリック。あとの手順はlangテーブルと同じです。最後に[Create]でテーブルを作成してください。
忘れてましたけど、そもそも集計はどこでやるんですか? Amazon DynamoDBじゃないんですよね!?
AWS Lambdaという、イベントドリブン処理を簡単に実現するサービスを使って行います。これは制作2日目のお楽しみです。
参加したい方、ご興味のある方はデベロッパーカンファレンスのWebサイトへ!