Your SlideShare is downloading. ×
AWS小ネタ集
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

AWS小ネタ集

3,031
views

Published on

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

第五回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,031
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
9
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 第5回 AWS User Group - Sapporo 勉強会AWS小ネタ集欧文印刷株式会社 田名辺健人2012.02.14 http://www.flickr.com/photos/mendhak/4271441910/
  • 2. 田名辺 健人(たなべたけひと) ソフトウェアエンジニア 欧文印刷株式会社(東京都) 2011年11月から札幌でテレワーク@dateofrock 札幌・東京コアメンバー Ustream担当 好きなサービスはSQS
  • 3. Happy Valentinehttp://www.flickr.com/photos/pinksherbet/1483193019/
  • 4. LT(Ladys Happy Valentine Talk)してくれた貴女へ… http://www.flickr.com/photos/pinksherbet/1483193019/
  • 5. NUboard Happy Valentineプレゼント♡ from 欧文印刷 http://www.flickr.com/photos/pinksherbet/1483193019/
  • 6. たまには 技術の話をしようと思います www
  • 7. • S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 http://www.flickr.com/photos/mendhak/4271441910/
  • 8. ネ タ 作 り す ぎ た whttp://www.flickr.com/photos/donsolo/2435421847/
  • 9. • S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 http://www.flickr.com/photos/mendhak/4271441910/
  • 10. 半分• S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ カット • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 orz http://www.flickr.com/photos/mendhak/4271441910/
  • 11. • S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 http://www.flickr.com/photos/mendhak/4271441910/
  • 12. Pre-signed URLの使い道• S3オブジェクトに対して有効期限付きの パブリックなURLを生成できる• Query String Request Authentication http://docs.amazonwebservices.com/AmazonS3/latest/dev/ RESTAuthentication.html#RESTAuthenticationQueryStringAuth
  • 13. Pre-signed URL どんなもの?
  • 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. こんなマンドクサイものはSDKに頼ろう
  • 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. 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. 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. Pre-signed URL 実 例
  • 20. Pre-signed URLの使い道• Webサーバーの負荷が劇的に減る! • アプリはPre-signed URLを生成してS3 にリダイレクトするだけ • 重たいデータ送出はS3にお任せ!
  • 21. • S3 小ネタ • 読み書きのスループットを上げる方法 • バケット名にピリオドでハマる方法• S3実践ネタ • 設定ファイル置き場 • Pre-signed URLの使い道• Simpleシリーズ2連発 • アプリ内エラー通知はSNSが便利 • SimpleDB APIがシンプルじゃない件 http://www.flickr.com/photos/mendhak/4271441910/
  • 22. アプリ内の通知は SNSが便利たとえば例外が投げられたら メールでお知らせとか
  • 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. 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. ただし、 メッセージは8kB以内に限るorz
  • 26. SimpleDB APIが シンプルじゃない件• いや、シンプルすぎて冗長なコードに なってしまう• 素のJDBCはチョット…的な。• データの型は全部文字列だよ!
  • 27. SimpleDBのData Mapperがホスィ Hibernate的なActiveRecord的な WOのEOF的な
  • 28. RubySDKにSimpleDBのData Mapperが!
  • 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. 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. Java• AWS SDK for Javaには低レベルAPIしかな いのだよ。• JPA実装とかはあるけど… https://github.com/appoxy/simplejpa
  • 32. でも実はね…
  • 33. DynamoDBにはDataMapperがあるのだよ(;́Д`)
  • 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. 使用例 (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. なぜSimpleDBに は無いのだ!
  • 37. ついカッとなって つくってみたw
  • 38. SimpleDBMapper (笑)
  • 39. @SimpleDBDomain(domainName = "BookDomain")public class Book { @SimpleDBItemName public Long id; @SimpleDBAttribute(attributeName = "title") public String title;}
  • 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. DynamoをSimpleに変えただけ(笑)
  • 42. simpledb-mapper(笑)• DynamoDBMapperライクなAPI(笑)• でもパクっただけじゃない • 1024byteを超えるデータ(Blob)はS3に • @SimpleDBVersionでOptimistic Lock(Conditional PUT/DELETE) • 検索APIにはナウいFluent Interface採用
  • 43. ナウな感じに書けるList<Book> books = mapper.from(Book.class). where("title", Like, "%スベる%"). and("price", GreaterThan, 1000). orderBy("price", DESC). limit(10). fetch();
  • 44. ただし
  • 45. 使用上のご注意• 自分が現状必要としていないものは実装 していません(笑)• リレーション機能は持たせないつもりで す。(Simpleじゃなくなるので)• テストは適当です(これはひどい)
  • 46. というわけで
  • 47. dateofrock/simpledb-mapper (笑)
  • 48. 気が向いたらForkしてね
  • 49. 残りは後日ブログに書きますw http://www.flickr.com/photos/mendhak/4271441910/
  • 50. Thank you! http://www.flickr.com/photos/mendhak/4271441910/