第5回 AWS User Group - Sapporo 勉強会AWS小ネタ集欧文印刷株式会社 田名辺健人2012.02.14        http://www.flickr.com/photos/mendhak/4271441910/
田名辺 健人(たなべたけひと)              ソフトウェアエンジニア              欧文印刷株式会社(東京都)              2011年11月から札幌でテレワーク@dateofrock            ...
Happy Valentinehttp://www.flickr.com/photos/pinksherbet/1483193019/
LT(Ladys Happy Valentine          Talk)してくれた貴女へ…      http://www.flickr.com/photos/pinksherbet/1483193019/
NUboard      Happy Valentineプレゼント♡       from 欧文印刷  http://www.flickr.com/photos/pinksherbet/1483193019/
たまには  技術の話をしようと思います    www
• S3 小ネタ •   読み書きのスループットを上げる方法 •   バケット名にピリオドでハマる方法• S3実践ネタ •   設定ファイル置き場 •   Pre-signed URLの使い道• Simpleシリーズ2連発 •   アプリ内エラ...
ネ                  タ                  作                  り                  す                  ぎ                  た       ...
• S3 小ネタ •   読み書きのスループットを上げる方法 •   バケット名にピリオドでハマる方法• S3実践ネタ •   設定ファイル置き場 •   Pre-signed URLの使い道• Simpleシリーズ2連発 •   アプリ内エラ...
半分• S3 小ネタ •   読み書きのスループットを上げる方法 •   バケット名にピリオドでハマる方法• S3実践ネタ           カット •   設定ファイル置き場 •   Pre-signed URLの使い道• Simpleシリ...
• S3 小ネタ •   読み書きのスループットを上げる方法 •   バケット名にピリオドでハマる方法• S3実践ネタ •   設定ファイル置き場 •   Pre-signed URLの使い道• Simpleシリーズ2連発 •   アプリ内エラ...
Pre-signed URLの使い道• S3オブジェクトに対して有効期限付きの  パブリックなURLを生成できる• Query String Request Authentication  http://docs.amazonwebservic...
Pre-signed URL  どんなもの?
GET /images/photo.jpg?AWSAccessKeyId=0PN5J17HBGZHT7JJ3X82&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3DSig...
こんなマンドクサイものはSDKに頼ろう
JavaInterface AmazonS3java.net.URL generatePresignedUrl(java.lang.String bucketName,                                  java...
RubyClass: AWS::S3::S3Object- (URI::HTTP, URI::HTTPS) url_for(method, options = {})url = s3.buckets[mybucket].objects[imag...
Ruby      RubyClass: AWS::S3::S3Object- (URI::HTTP, URI::HTTPS) url_for(method, options = {})     ステキ!url = s3.buckets[myb...
Pre-signed URL     実 例
Pre-signed URLの使い道• Webサーバーの負荷が劇的に減る! • アプリはPre-signed URLを生成してS3  にリダイレクトするだけ • 重たいデータ送出はS3にお任せ!
• S3 小ネタ •   読み書きのスループットを上げる方法 •   バケット名にピリオドでハマる方法• S3実践ネタ •   設定ファイル置き場 •   Pre-signed URLの使い道• Simpleシリーズ2連発 •   アプリ内エラ...
アプリ内の通知は  SNSが便利たとえば例外が投げられたら メールでお知らせとか
Java            例えばUncaughtExceptionHandlerを使うThread.setDefaultUncaughtExceptionHandler(  new UncaughtExceptionHandler() {...
Ruby on Rails  例えばApplicationController#rescue_fromを使うrequire rubygemsrequire aws-sdkclass ApplicationController < ActionC...
ただし、  メッセージは8kB以内に限るorz
SimpleDB APIが  シンプルじゃない件• いや、シンプルすぎて冗長なコードに なってしまう• 素のJDBCはチョット…的な。• データの型は全部文字列だよ!
SimpleDBのData Mapperがホスィ Hibernate的なActiveRecord的な    WOのEOF的な
RubySDKにSimpleDBのData Mapperが!
class Book < AWS::Record::Base  string_attr :titleendBook.new(:title => スベらないプレゼン).saveBook.where(title like ?, %プレゼン%).co...
class Book < AWS::Record::Base  string_attr :titleendBook.new(:title => スベらないプレゼン).save Railsと違和感なしにBook.where(title like ...
Java• AWS SDK for Javaには低レベルAPIしかな いのだよ。• JPA実装とかはあるけど… https://github.com/appoxy/simplejpa
でも実はね…
DynamoDBにはDataMapperがあるのだよ(;́Д`)
@DynamoDBTable(tableName = "BookTable")public class Book {    private Long id;    private String title;    @DynamoDBHashKe...
使用例     (DynamoDBMapper)AWSCredentials cred = new BasicAWSCredentials(  "アクセスキ", "シークレットキー");AmazonDynamoDB db = new Amazo...
なぜSimpleDBに は無いのだ!
ついカッとなって つくってみたw
SimpleDBMapper     (笑)
@SimpleDBDomain(domainName = "BookDomain")public class Book {    @SimpleDBItemName    public Long id;    @SimpleDBAttribut...
使用例       (SimpleDBMapper)AWSCredentials cred = new BasicAWSCredentials(  "アクセスキ", "シークレットキー");AmazonSimpleDB db = new Ama...
DynamoをSimpleに変えただけ(笑)
simpledb-mapper(笑)•   DynamoDBMapperライクなAPI(笑)•   でもパクっただけじゃない    •   1024byteを超えるデータ(Blob)はS3に    •   @SimpleDBVersionでOp...
ナウな感じに書けるList<Book> books =  mapper.from(Book.class).    where("title", Like, "%スベる%").   and("price", GreaterThan, 1000)....
ただし
使用上のご注意• 自分が現状必要としていないものは実装 していません(笑)• リレーション機能は持たせないつもりで す。(Simpleじゃなくなるので)• テストは適当です(これはひどい)
というわけで
dateofrock/simpledb-mapper      (笑)
気が向いたらForkしてね
残りは後日ブログに書きますw   http://www.flickr.com/photos/mendhak/4271441910/
Thank you!    http://www.flickr.com/photos/mendhak/4271441910/
AWS小ネタ集
AWS小ネタ集
AWS小ネタ集
AWS小ネタ集
AWS小ネタ集
AWS小ネタ集
AWS小ネタ集
AWS小ネタ集
AWS小ネタ集
AWS小ネタ集
Upcoming SlideShare
Loading in …5
×

AWS小ネタ集

3,720 views

Published on

第五回JAWS-UG札幌勉強会で発表したスライドです。詳細はブログ(http://blog.dateofrock.com/)に書きますw

Published in: Technology, Design
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,720
On SlideShare
0
From Embeds
0
Number of Embeds
892
Actions
Shares
0
Downloads
11
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

AWS小ネタ集

  1. 1. 第5回 AWS User Group - Sapporo 勉強会AWS小ネタ集欧文印刷株式会社 田名辺健人2012.02.14 http://www.flickr.com/photos/mendhak/4271441910/
  2. 2. 田名辺 健人(たなべたけひと) ソフトウェアエンジニア 欧文印刷株式会社(東京都) 2011年11月から札幌でテレワーク@dateofrock 札幌・東京コアメンバー Ustream担当 好きなサービスはSQS
  3. 3. Happy Valentinehttp://www.flickr.com/photos/pinksherbet/1483193019/
  4. 4. LT(Ladys Happy Valentine Talk)してくれた貴女へ… http://www.flickr.com/photos/pinksherbet/1483193019/
  5. 5. NUboard Happy Valentineプレゼント♡ from 欧文印刷 http://www.flickr.com/photos/pinksherbet/1483193019/
  6. 6. たまには 技術の話をしようと思います www
  7. 7. • S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 http://www.flickr.com/photos/mendhak/4271441910/
  8. 8. ネ タ 作 り す ぎ た whttp://www.flickr.com/photos/donsolo/2435421847/
  9. 9. • S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 http://www.flickr.com/photos/mendhak/4271441910/
  10. 10. 半分• S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ カット • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 orz http://www.flickr.com/photos/mendhak/4271441910/
  11. 11. • S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 http://www.flickr.com/photos/mendhak/4271441910/
  12. 12. Pre-signed URLの使い道• S3オブジェクトに対して有効期限付きの パブリックなURLを生成できる• Query String Request Authentication http://docs.amazonwebservices.com/AmazonS3/latest/dev/ RESTAuthentication.html#RESTAuthenticationQueryStringAuth
  13. 13. Pre-signed URL どんなもの?
  14. 14. GET /images/photo.jpg?AWSAccessKeyId=0PN5J17HBGZHT7JJ3X82&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3DSignature =URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKeyID, UTF-8-Encoding-Of(StringToSign))));StringToSign = HTTP-VERB + "n" + Content-MD5 + "n" + Content-Type + "n" + Expires + "n" + CanonicalizedAmzHeaders + CanonicalizedResource;
  15. 15. こんなマンドクサイものはSDKに頼ろう
  16. 16. JavaInterface AmazonS3java.net.URL generatePresignedUrl(java.lang.String bucketName, java.lang.String key, java.util.Date expiration, HttpMethod method) throws AmazonClientExceptionDate after5Seconds = new Date();after5Seconds.setTime(System.currentTimeMillis() + 5 * 1000);AmazonS3 s3 = new AmazonS3Client(cred);Url url = s3.generatePresignedUrl(“mybucket”, “images/photo.jpg”, after5Seconds, HttpMethod.GET);
  17. 17. RubyClass: AWS::S3::S3Object- (URI::HTTP, URI::HTTPS) url_for(method, options = {})url = s3.buckets[mybucket].objects[images/photo.jpg]. url_for(:read, :expires => 5)
  18. 18. Ruby RubyClass: AWS::S3::S3Object- (URI::HTTP, URI::HTTPS) url_for(method, options = {}) ステキ!url = s3.buckets[mybucket].objects[images/photo.jpg]. url_for(:read, :expires => 5)
  19. 19. Pre-signed URL 実 例
  20. 20. Pre-signed URLの使い道• Webサーバーの負荷が劇的に減る! • アプリはPre-signed URLを生成してS3 にリダイレクトするだけ • 重たいデータ送出はS3にお任せ!
  21. 21. • S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 http://www.flickr.com/photos/mendhak/4271441910/
  22. 22. アプリ内の通知は SNSが便利たとえば例外が投げられたら メールでお知らせとか
  23. 23. Java 例えばUncaughtExceptionHandlerを使うThread.setDefaultUncaughtExceptionHandler( new UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) { " AWSCredentials cred = new BasicAWSCredentials( "アクセスキー","シークレットキー"); " AmazonSNS sns = new AmazonSNSClient(cred); " String stackTrace = getStackTraceString(e); " sns.publish(new PublishRequest( " " " "arn:aws:sns:ap-northeast-1:xxxxx:sns-test", " " " stackTrace, "Java Exception"));" }" });
  24. 24. Ruby on Rails 例えばApplicationController#rescue_fromを使うrequire rubygemsrequire aws-sdkclass ApplicationController < ActionController::Base rescue_from StandardError do |exception| topic = AWS::SNS::Topic.new( arn:aws:sns:ap-northeast-1:xxxxx:sns-test ) topic.publish(exception.backtrace.to_s, :subject => Rails exception); raise exception endend
  25. 25. ただし、 メッセージは8kB以内に限るorz
  26. 26. SimpleDB APIが シンプルじゃない件• いや、シンプルすぎて冗長なコードに なってしまう• 素のJDBCはチョット…的な。• データの型は全部文字列だよ!
  27. 27. SimpleDBのData Mapperがホスィ Hibernate的なActiveRecord的な WOのEOF的な
  28. 28. RubySDKにSimpleDBのData Mapperが!
  29. 29. class Book < AWS::Record::Base string_attr :titleendBook.new(:title => スベらないプレゼン).saveBook.where(title like ?, %プレゼン%).count$ rails generate scaffold_controller Book title:stringconfig/routes.rb:Myapp::Application.routes.draw do resources :booksend http://aws.amazon.com/articles/8621639827664165 より
  30. 30. class Book < AWS::Record::Base string_attr :titleendBook.new(:title => スベらないプレゼン).save Railsと違和感なしにBook.where(title like ?, %プレゼン%).count 統合できる!$ rails generate scaffold_controller Book title:stringconfig/routes.rb:Myapp::Application.routes.draw do resources :booksend http://aws.amazon.com/articles/8621639827664165 より
  31. 31. Java• AWS SDK for Javaには低レベルAPIしかな いのだよ。• JPA実装とかはあるけど… https://github.com/appoxy/simplejpa
  32. 32. でも実はね…
  33. 33. DynamoDBにはDataMapperがあるのだよ(;́Д`)
  34. 34. @DynamoDBTable(tableName = "BookTable")public class Book { private Long id; private String title; @DynamoDBHashKey public Long getId() { " return this.id; } @DynamoDBAttribute(attributeName = "title") public String getTitle() { " return this.title; } // 以下、setter}
  35. 35. 使用例 (DynamoDBMapper)AWSCredentials cred = new BasicAWSCredentials( "アクセスキ", "シークレットキー");AmazonDynamoDB db = new AmazonDynamoDBClient(cred);DynamoDBMapper mapper = new DynamoDBMapper(db);Long key = 105L;Book book = mapper.load(Book.class, key);book.setTitle("スベらないプレゼン");mapper.save(book);mapper.delete(book);
  36. 36. なぜSimpleDBに は無いのだ!
  37. 37. ついカッとなって つくってみたw
  38. 38. SimpleDBMapper (笑)
  39. 39. @SimpleDBDomain(domainName = "BookDomain")public class Book { @SimpleDBItemName public Long id; @SimpleDBAttribute(attributeName = "title") public String title;}
  40. 40. 使用例 (SimpleDBMapper)AWSCredentials cred = new BasicAWSCredentials( "アクセスキ", "シークレットキー");AmazonSimpleDB db = new AmazonSimpleDBClient(cred);SimpleDBMapper mapper = new SimpleDBMapper(db);Long key = 105L;Book book = mapper.load(Book.class, key);book.setTitle("スベらないプレゼン");mapper.save(book);mapper.delete(book);
  41. 41. DynamoをSimpleに変えただけ(笑)
  42. 42. simpledb-mapper(笑)• DynamoDBMapperライクなAPI(笑)• でもパクっただけじゃない • 1024byteを超えるデータ(Blob)はS3に • @SimpleDBVersionでOptimistic Lock(Conditional PUT/DELETE) • 検索APIにはナウいFluent Interface採用
  43. 43. ナウな感じに書けるList<Book> books = mapper.from(Book.class). where("title", Like, "%スベる%"). and("price", GreaterThan, 1000). orderBy("price", DESC). limit(10). fetch();
  44. 44. ただし
  45. 45. 使用上のご注意• 自分が現状必要としていないものは実装 していません(笑)• リレーション機能は持たせないつもりで す。(Simpleじゃなくなるので)• テストは適当です(これはひどい)
  46. 46. というわけで
  47. 47. dateofrock/simpledb-mapper (笑)
  48. 48. 気が向いたらForkしてね
  49. 49. 残りは後日ブログに書きますw http://www.flickr.com/photos/mendhak/4271441910/
  50. 50. Thank you! http://www.flickr.com/photos/mendhak/4271441910/

×