1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AlibabaCloudのtableStoreを試してみた

1
Last updated at Posted at 2018-10-01

はじめに

AlibabaCloudを触れるようになったので、とりあえずNoSQLでデータを入れたり削除したりしてみる。
これができればIoTっぽいことができる...はず多分。
今回はpythonですが、nodeやJava、GoなんかもSDKがあるので同じことはできるっぽい。

SDKのインストール

普通にpipでインストールできるっぽい。
今回必要なのはtablestore(テーブルいじったりするやつ)とots2(AlibabaCloudにアカウントを紐づけるやつ)

コンソール
pip install ots2
pip install tablestore

RAMアクセスキーの取得

アリクラウドのコンソールを開いて、RAMを選択し、ユーザーのAccessKeyから「AccessKeyを取得」を押す。
CSVをダウンロードでき、アクセスキー、シークレットキーが記載されているので無くさず、流出しないようにする。
これが流出しちゃうと悪意のあるユーザーに色々悪いことされるので絶対に流出させないようにましょう。
ぶっちゃけAWSのIAMと全く同じです

Table Storeの作成

どうもインスタンスを立てて、そこにNoSQLのテーブルとかを設定する形っぽい。
まずはデフォルトリージョンが中国になっているので、左上の国旗からリージョンを日本に変更する。
そのあと、Table Storeからインスタンスを作成を押して適当にインスタンス立ててみる。
スクリーンショット 2018-09-28 15.32.52.png

インスタンスを選んで、テーブルを作成してみる。
プライマリーキーは最大で4つまで設定できるっぽい。今回はテストだし1個だけ設定してみる。
スクリーンショット 2018-09-28 15.37.36.png

テーブルを作るとこんな感じになる。
このとき、左上にあるインターネット:の部分のURLをメモっておきましょう。
画像だと「 https://testins.ap-northeast-1.ots.aliyuncs.com 」の部分です。
スクリーンショット 2018-09-28 15.47.37.png

pythonからテーブルを色々やってみる

テーブル一覧を取得する

とりあえず一番簡単そうなテーブルの取得から
以後のpythonと共通で設定値は以下の通りに
ENDPOINT:table storeに記載されている、インターネットの値
ACCESSID:CSVに記載されているアクセスキー
ACCESSKEY:CSVに記載されているシークレットキー
INSTANCENAME:作成したインスタンスの名前

tableList
# -- coding: utf8 --
from ots2 import *

ENDPOINT = "https://testins.ap-northeast-1.ots.aliyuncs.com"
ACCESSID = ""
ACCESSKEY = ""
INSTANCENAME = "testins"

ots_client = OTSClient(ENDPOINT, ACCESSID, ACCESSKEY, INSTANCENAME)
list_response = ots_client.list_table()
for table_name in list_response:
    print table_name

OTSClientでインスタンスと紐付け、そこから各種コマンドで色々やるってやり方みたい。
出力がこちら。

コンソール
python tablesotre.py 
poke

きちんと作成したテーブルが出てこればオッケー。

データを挿入してみる

やり方はリスト取得と基本的には同じ。

put_row
# -- coding: utf8 --
from ots2 import *
from tablestore import *

ENDPOINT = "https://testins.ap-northeast-1.ots.aliyuncs.com"
ACCESSID = ""
ACCESSKEY = ""
INSTANCENAME = "testins"

primary_key = [('name','Latios')]
attribute_columns = [('cp',3644), ('no',381)]
row = Row(primary_key, attribute_columns)

condition = Condition(RowExistenceExpectation.EXPECT_NOT_EXIST)
ots_client = OTSClient(ENDPOINT, ACCESSID, ACCESSKEY, INSTANCENAME)
list_response = ots_client.put_row("poke", row, condition)

Conditionでデータの上書きとかを指定できる。
RowExistenceExpectation.IGNORE:プライマリキーが同じだろうが新規だろうが問答無用でPUTする
RowExistenceExpectation.EXPECT_EXIST:プライマリキーがすでに存在してる場合のみPUTで上書きする
RowExistenceExpectation.EXPECT_NOT_EXIST:指定行が存在しない場合のみ挿入
この辺りはAWSより融通が利きそう。
ちなみに、Rowはtablestoreをimportすれば使えるAPIでした。それがわからずに苦労しました...

スクリーンショット 2018-10-01 16.29.11.png
コンソールから確認、ちゃんとデータ入ってますね。

データを取得してみる

こちらも基本的にはやり方は同じ。
scanは存在しないみたいなので、全範囲を指定して取得するようにしてみる。

get_range
# -- coding: utf8 --
from ots2 import *
from tablestore import *

ENDPOINT = "https://testins.ap-northeast-1.ots.aliyuncs.com"
ACCESSID = ""
ACCESSKEY = ""
INSTANCENAME = "testins"

start_primary_key = [('name',INF_MIN)]
end_primary_key = [('name',INF_MAX)]
columns_to_get = []
limit = 10

ots_client = OTSClient(ENDPOINT, ACCESSID, ACCESSKEY, INSTANCENAME)

consumed, next_start_primary_key, row_list, next_token  = ots_client.get_range(
                "poke",
                Direction.FORWARD, 
                start_primary_key,
                end_primary_key,
                columns_to_get, 
                limit)

for row in row_list:
    print row.primary_key, row.attribute_columns

get_rangeの帰り値は4つほどあるみたいだが、今回必要なのはrow_listのみ。
row_listの中に取得したデータがあるのでprintなりで表示してあげればOK

コンソール
python get_range.py 
[(u'name', u'Latios')] [(u'cp', 3644, 1538374251039), (u'no', 381, 1538374251039)]
[(u'name', u'Metagross')] [(u'cp', 3644, 1538374586327), (u'no', 376, 1538374586327)]
[(u'name', u'Tranitar')] [(u'cp', 3670, 1538374608754), (u'no', 248, 1538374608754)]

無事出力されている...のはいいんだが、1538374251039とかの数字って何だろう?
1行毎に設定されているのかな?
ただとりあえず、データの取得が問題なくいけてますね。

やってみたよかった点

複数プライマリーキーが設定できる

dynamoDBで非常に大変だった部分なのでこれはありがたい。
4つもあれば、データ保持とかもだいぶ楽になるんじゃないかな

やってみた不満点

ACCESSID、ACCESSKEYをコードに記載しないといけない。

なにこのセキュリティ事故発生しまくりそうな仕様...。
一応CLIでアカウント設定はできるんだけど、pythonからその情報を取る手段を調べてる限りなさげ。
これはなんとかどうにかして欲しいなぁ。

検索が不便

get_rangeで取得して見ましたが、なんかまだ色々私自身理解できてないせいなのか、
なんか複数リターンがあったり、スキャンやお手軽クエリができなかったりなんか微妙。
1行だけ取得とかそういうのはあったんですが、この辺りは勉強不足の可能性もある?

ググっても出てこない

みんなもっと使ってあげて。
英語はまぁいいとしても中国語とか出てきてもさっぱりわかんないよ...

まとめ

NoSQLというだけでdynamoDBとか異なる何かっぽい奴でしたが、なんとかうまくいけました。
インスタンス立てたりしないといけないのはめんどくさいですが、プライマリキーを4つまで
設定できるのは非常に魅力的。
ただコードにアクセスキー埋め込まないとダメなのはいけてない。絶対事故るよね。

今後やりたいこと

本当はDBに直接書き込みじゃなくてAWSでいうKinesisみたいなやつを挟みたいなぁ
IoTPlatformからmqttで送信とかはできそうなのでこっちでやってみるのも手かな

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?