ExAws - CargoSense/ex_aws A flexible easy to use set of AWS APIs. Dynamo / DynamoStreams EC2 / ElasticTranscoder Firehose / Kinesis KMS Lambda RDS Route53 S3 SES / SNS / SQS /STS 8
ExAws Dynamo - sample code PutItem u s e r = % T e s t . U s e r { e m a i l : " f o o @ b a r . c o m " , n a m e : % { f i r s t : " b o b " , l a s t : " b u b b a " } , a g e : 2 3 , a d m i n : f a l s e } # = > { : o k , _ } D y n a m o . p u t _ i t e m ( " U s e r s " , u s e r ) | > E x A w s . r e q u e s t GetItem u s e r = T e s t . U s e r | > D y n a m o . g e t _ i t e m ( % { e m a i l : u s e r . e m a i l } ) | > E x A w s . r e q u e s t ! | > D y n a m o . d e c o d e _ i t e m ( a s : T e s t . U s e r ) 9
ExAws Dynamo それぞれの処理が分離されているのが特徴 リクエストパラメータの生成 リクエスト処理 Encode/Decode DynamoDBのリクエストを愚直に作るようなコードになる D y n a m o . q u e r y ( " U s e r s " , # t a b l e n a m e e x p r e s s i o n _ a t t r i b u t e _ n a m e s : [ a g e : " # a g e " ] e x p r e s s i o n _ a t t r i b u t e _ v a l u e s : [ a g e : 2 3 ] , c o n d i t i o n _ e x p r e s s i o n : " A g e = # a g e " ) | > E x A w s . r e q u e s t | > E n u m . m a p ( f n ( i t e m ) - > d e c o d e ( i t e m , m o d e l ) e n d ) DynamoDBのリクエスト生成に精通してないと使いにくい 精通してる人はDynamoDBの機能をフルに使いこなせる 10
Motivation RDBを利用してた人が使うとリクエストを作るだけでハマる GetItem/PutItem/Query/Scan expression_attribute_names/expression_attribute_v alues key_condition_expression/condition_expression/Filt erExpression ModuleレベルでのI/Oをシンプルに安全に記述したい id:23の U s e r とか A c t i v e R e c o r d や e c t o のレベルでデータを操作したい 11
Create table ExAWS D y n a m o . c r e a t e _ t a b l e ( " U s e r s " , [ e m a i l : : h a s h , a g e : : r a n g e ] , [ e m a i l : : s t r i n g , a g e : : n u m b e r ] , 1 , 1 ) Surge d e f m o d u l e U s e r d o u s e S u r g e . M o d e l h a s h e m a i l : { : s t r i n g , n i l } r a n g e a g e : { : n u m b e r , n i l } a t t r i b u t e s n a m e : { : s t r i n g , n i l } t h r o u g h p u t r e a d : 1 , w r i t e : 1 e n d S u r g e . D D L . c r e a t e _ t a b l e ( U s e r ) 13
PutItem 1レコード保存する場合 ExAWS D y n a m o . p u t _ i t e m ( " U s e r s " , u s e r ) | > E x A w s . r e q u e s t Surge S u r g e . D M L . p u t _ i t e m ( u s e r , i n t o : T e s t . U s e r ) 14
GetItem 1レコード取得する場合 ExAWS u s e r = T e s t . U s e r | > D y n a m o . g e t _ i t e m ( % { e m a i l : u s e r . e m a i l } ) | > E x A w s . r e q u e s t ! | > D y n a m o . d e c o d e _ i t e m ( a s : T e s t . U s e r ) Surge S u r g e . D M L . g e t _ i t e m ( e m a i l : u s e r . e m a i l , f r o m : T e s t . U s e r ) 15
Query 複数レコード取得する場合 ExAWS D y n a m o . q u e r y ( " U s e r s " , # t a b l e n a m e e x p r e s s i o n _ a t t r i b u t e _ n a m e s : [ a g e : " # a g e " ] e x p r e s s i o n _ a t t r i b u t e _ v a l u e s : [ a g e : 2 3 ] , c o n d i t i o n _ e x p r e s s i o n : " A g e = # a g e " ) | > E x A w s . r e q u e s t | > E n u m . m a p ( f n ( i t e m ) - > d e c o d e ( i t e m , m o d e l ) e n d ) Surge S u r g e . Q u e r y . q u e r y ( w h e r e : [ " # a g e = ? " , 2 3 ] , f o r : T e s t . U s e r ) 16
Query and Filter 複数レコード取得し、さらに条件でフィルターする場合 ExAWS D y n a m o . q u e r y ( " U s e r s " , # t a b l e n a m e e x p r e s s i o n _ a t t r i b u t e _ n a m e s : [ a g e : " # a g e " , a d m i n : " # a d m i n " ] , e x p r e s s i o n _ a t t r i b u t e _ v a l u e s : [ a g e : 2 3 , a d m i n : t r u e ] , c o n d i t i o n _ e x p r e s s i o n : " A g e = # a g e " , F i l t e r E x p r e s s i o n : " A d m i n = # a d m i n " ) | > E x A w s . r e q u e s t | > E n u m . m a p ( f n ( i t e m ) - > d e c o d e ( i t e m , m o d e l ) e n d ) Surge S u r g e . Q u e r y . q u e r y ( w h e r e : [ " # a g e = ? " , 2 3 ] , f o r : T e s t . U s e r 、 f i l t e r : [ " # a d m i n = ? " , t r u e ] ) 17