Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
第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,879 views

Published on

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

Published in: Technology, Design
  • Be the first to comment

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/

×