AWS SDK for Smalltalk
-
Upload
sho-yoshida -
Category
Engineering
-
view
1.826 -
download
0
Transcript of AWS SDK for Smalltalk
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
A W S S D K f o r S m a l l t a l k2 0 1 4 M E R R Y C H R I S T M A S
@newapplesho
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
S m a l l t a l kでのR D B以外の候補
• OmniBase
• Magma
• GemStone
• MongoDB
• Neo4j
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
O m n i B a s e
• Smalltalkのオブジェクト指向データーベース
• GORISEK Ltd.の製品でDolphin Smalltalkで開発
• VisualWorks, Squeakにも移植されている
• 2014年にGitHubにソースが移行?
• MITライセンスになったhttps://github.com/sebastianconcept/OmniBase
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
M a g m a
• Smalltalkのオブジェクト指向データーベース
• Squeakでもともと開発されいた
• Pharo, VisualWorksで動くか不明?
http://wiki.squeak.org/squeak/2665
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
G e m S t o n e
• GemStone/S Smalltalkの歴史あるOODB
• SmalltalkとDB機能が一体化されたすごいSmalltalk
• 商用利用でも一部フリーで使えるOODB
• GLASSというWeb特化の製品もある
https://github.com/GsDevKit/gsDevKitHome
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
M o n g o D B
• ドキュメント指向データベース
• 非常に有名なNoSQL
• Smalltalk用ドライバーはKent Beckさんが作った
http://smalltalkhub.com/#!/~francois/MongoTalk
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
N e o 4 j
• グラフ指向データーベース
• 複雑なデータを扱うのに最適
• SmalltalkからはNeo4reStを使って利用可能
http://smalltalkhub.com/#!/~MasashiUmezawa/Neo4reSt
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
どれも素敵だけど
クラウドサービスを作ろうと考えると・・・
Mikatahttps://mikatacloud.com
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
ビジネスで堅牢なN o S Q Lを運用するには
• 一人だと大変だったりする
• バックアップが難しいOODB
• スタートアップには高い商用ライセンス
• Replica Setsを構成するには最低各DCゾーンに1台ずつ、Arbiter1台、計3台マシンが必要だったり
• メモリやディスクI/Oに左右されたりする
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
もう考えるのが嫌になる
川に飛び込むしかない
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
2 0 1 4年 0 4月
あきらめず考えました
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
A m a z o n D y n a m o D B
• キー・バリュー型のNoSQLデータベースサービス
• 管理不要で信頼性が高いデータベース
• データセンター間の自動同期レプリケーション
• 高速なアクセスが可能
• SSDを利用している
• ストレージ容量制限がない
• プロビジョンスループットだけを指定するだけ
• API(SDK)経由で利用できる
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
S m a l l t a l k e rがA W Sを使う際の問題
nodeJS
iOS
iOS JavaJavascript Net
nodeJS
Android
PHP Python
Ruby
Ruby
SDKがない
I love Smalltalk
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
A W S S D K f o r S m a l l t a l k作りました
https://github.com/newapplesho/aws-sdk-smalltalk
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
今回公開するもの
• Signature V4
• DynamoDBの接続クライアント(低レベル API、エラー処理は未実装)
• DynamoDBの簡易アクセス版(未完成)
いずれはすべてのSDKを公開する予定DynamoDB
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
A W S S i g n a t u r e Ve r s i o n 4
• 多くのAWSサービスとやり取りするとき必要
• Signature version 4 signing process
http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
D y n a m o D B H T T P A P I
• SSL接続
• URLは全て/。URLで処理内容を指定しない
• ヘッダーのx-amz-targetで処理内容を指定する
• エンドポイントはデーターセンターの場所を指定
• JSON形式で送信、JSON形式で受信
• ヘッダーにx-amz-dateというISO 8601形式(例: 20130315T092054Z)の日付を入れなければならない
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/MakingHTTPRequests.html
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
A W S S D K f o r S m a l l t a l k D y n a m o D B
AWS SDK for Smalltalk DynamoDBで対応するデーター型
* スカラーデータ型 - 文字列、数値 * 多値型 - 文字列セット、数値セット。
Amazon DynamoDB for Smalltalk supports the following data types:
* Scalar types – Number, String. * Multi-valued types – String Set, Number Set.
その他も実装中
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
だって他にやれることがないからね
ということで
DynamoDB使うしかない!
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
H o w t o i n s t a l l S t e p 1
Get started in minutes using Metacello and FileTree.
$ git clone https://github.com/newapplesho/aws-sdk-smalltalk
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
H o w t o i n s t a l l S t e p 2
Get started in minutes using Metacello and FileTree.
| pathToPackageDirectory | "edit to match the path to your chosen package directory" pathToPackageDirectory := ‘/YOUR-GIT-DIRECTORY-PATH/aws-sdk-smalltalk/pharo-repository/‘. Metacello new baseline: 'AWS'; repository: 'filetree://', pathToPackageDirectory; load.
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
R A W A P I
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
S e t u p
awsConfig := AWSDynamoDBConfig default. awsConfig accessKeyId:'YOURACCESSKEY'. awsConfig secretKey:'YOURSECRETKEY'.
dy := DynamoDBRawClient new. dy awsConfig accessKeyId:'YOURACCESSKEY'. dy awsConfig secretKey:'YOURSECRETKEY'.
or
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
C r e a t e Ta b l e
DynamoDBDynamoDB
Table
C o l u m n Ty p e K e y S c h e ma
i d S t r i n g H A S H
{ "AttributeDefinitions": [ { "AttributeName": "id", "AttributeType": "S"} ], "TableName": "dmodeltest1", "KeySchema": [ { "AttributeName": "id", "KeyType": "HASH"}], "ProvisionedThroughput": { "ReadCapacityUnits": 10, "WriteCapacityUnits": 10} }
dmodeltest1
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
C r e a t e Ta b l e
dy := DynamoDBRawClient new. operationName := #CreateTable. requestBody := '{ "AttributeDefinitions": [ { "AttributeName": "id", "AttributeType": "S"} ], "TableName": "dmodeltest1", "KeySchema": [ { "AttributeName": "id", "KeyType": "HASH"}], "ProvisionedThroughput": { "ReadCapacityUnits": 10, "WriteCapacityUnits": 10} }'. resp := dy operationName: operationName entityContents: requestBody.
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
L i s t Ta b l e s
dy := DynamoDBRawClient new. operationName := #ListTables. requestBody := '{}'. resp := dy operationName: operationName entityContents: requestBody. Json readFrom: (resp contents) readStream.
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
P u t I t e m
DynamoDB Item
C o l u m n Ty p e K e y S c h e m a
i d S t r i n g H A S H
{"TableName":"dmodeltest1", "Item": {"id": {"S":"af2d4b16147f45fea3753cc9c0a3f739"} } }
DynamoDB Table
UUID new primMakeUUID hex.
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
P u t I t e m ( J a v a )
client = new AmazonDynamoDBClient(credentials); String tableName = "dmodeltest1"; Map<String, AttributeValue> item = new HashMap<String, AttributeValue>(); item.put("id", new AttributeValue().withS("babe2d60c42a45fca9120d1c111d8844")); PutItemRequest putItemRequest = new PutItemRequest() .withTableName(tableName) .withItem(item); PutItemResult result = client.putItem(putItemRequest);
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
P u t I t e m
dy := DynamoDBRawClient new. operationName := 'PutItem'. requestBody := '{"TableName":"dmodeltest1","Item":{"id":{"S":"af2d4b16147f45fea3753cc9c0a3f739"}}}' resp := dy operationName: operationName entityContents: requestBody.
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
P u t I t e m
DynamoDBModelを継承したModelを作成
DynamoDBModelのDictionaryのインスタンス変数dataにアクセスしてModelを作成するだけ
P u t I t e m
dy := DynamoDBRawClient new. operationName := 'PutItem'. json := JsonObject new at:'TableName' put:'dmodeltest1';yourself. d:= DModelTest1 new. d at: ‘id’ put:‘af2d4b16147f45fea3753cc9c0a3f739’. mapper := DynamoDBMapper new. c := (mapper convertItem:d). json at:'Item' put: c . requestBody := json asJsonString . resp := dy operationName: operationName entityContents: requestBody.
Json is generated in Smalltalk.
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
G e t I t e m
DynamoDB Item
C o l u m n Ty p e K e y S c h e m a
i d S t r i n g H A S H
{"TableName":"dmodeltest1", "Key": {"id": {"S":"af2d4b16147f45fea3753cc9c0a3f739"} } }
DynamoDB Table
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
G e t I t e m
operationName := 'GetItem'. json := JsonObject new at:'TableName' put:'dmodeltest1';yourself. d:= DModelTest1 new. d at: ‘id’ put:‘af2d4b16147f45fea3753cc9c0a3f739’. mapper := DynamoDBMapper new. c := (mapper convertItem:d). json at:'Key' put: c . requestBody := json asJsonString . resp := dy operationName: operationName entityContents: requestBody. result := Json readFrom: (resp contents) readStream. mapper loadItem: (result at:'Item') .
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
Q u e r y
operationName := 'Query'. json := JsonObject new at:'TableName' put:'dmodeltest1';yourself. d:= DModelTest1 new. d data at:#id put:uuid. mapper := DynamoDBMapper new. c := (mapper convertItem:d). c := JsonObject new at: (c keys first) put: ((JsonObject new at:'AttributeValueList' put: (Array with: c anyOne); yourself ) at:'ComparisonOperator' put:'EQ'; yourself); yourself. json at:'KeyConditions' put: c . json at:'Select' put: 'ALL_ATTRIBUTES'. requestBody := json asJsonString . resp := dy operationName: operationName entityContents: requestBody. result := Json readFrom: (resp contents) readStream. (result at:'Count') > 0 ifTrue:[ ^ (result at:'Items') collect:[:v | mapper loadItem:v ]. ] .
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
D e l e t e I t e m
operationName := 'DeleteItem'. json := JsonObject new at:'TableName' put:'dmodeltest1';yourself. d:= DModelTest1 new. d id:uuid. mapper := DynamoDBMapper new. c := (mapper convertItem:d). json at:'Key' put: c . requestBody := json asJsonString. resp := dy operationName: operationName entityContents: requestBody. result := Json readFrom: (resp contents) readStream.
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
D e l e t e Ta b l e
operationName := #DeleteTable. requestBody := JsonObject new at:'TableName' put:'dmodeltest1'; asJsonString . resp := dy operationName: operationName entityContents: requestBody. Json readFrom: (resp contents) readStream.
簡易アクセス版
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
P u t I t e m
uuid := UUID new primMakeUUID hex. d:= DModelTest1 new. d id: uuid. d save.
DynamoDBModelを継承したModelを作成
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
G e t I t e m
"検索キーを作成"
keyData := DModelTest1 new. keyData id: uuid. result := d getItem: keyData.
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
その他
• AWSDynamoDBConfigのendpoint:で接続するRegion
を変更可能
• DynamoDB Localにも対応
• 英語が苦手なのでドキュメントの翻訳してくれる方募集
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
エンドポイントの変更
http://docs.aws.amazon.com/general/latest/gr/rande.html
DefaultAWSDynamoDBConfig initialize. AWSDynamoDBConfig default endpoint.
'dynamodb.ap-northeast-1.amazonaws.com'
change endpointAWSDynamoDBConfig initialize. AWSDynamoDBConfig default regionName:'us-west-2'. AWSDynamoDBConfig default endpoint.
'dynamodb.us-west-2.amazonaws.com'
Regions and Endpoints
Asia Pacific (Tokyo)
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
D y n a m o D B L o c a l
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html
とりあえず試したい人はDynamoDB Local
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
D y n a m o D B L o c a l実行方法
$ java -jar DynamoDBLocal.jar –Djava.library.path=.
AWSDynamoDBConfig initialize. AWSDynamoDBConfig developmentDynamoDBSetting.
Set up
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
今後対応のS m a l l t a l k
• Squeak
• VisualWorks
• GemStone
Copyright © 2014 SORABITO Co., Ltd. All Rights Reserved.
今後
• DynamoDB改良版
• S3
• EC2
• Elastic Transcoder
2015年公開予定
ただし私のポケットマネーと相談だったりする
Amazon EC2
DynamoDB
Amazon Elastic Transcoder
S3 Bucket