Successfully reported this slideshow.

AWS小ネタ集

4

Share

1 of 60
1 of 60

More Related Content

More from Takehito Tanabe

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 Valentine http://www.flickr.com/photos/pinksherbet/1483193019/
  4. 4. LT(Lady's 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. ネ タ 作 り す ぎ た w http://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%3D Signature = 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. Java Interface AmazonS3 java.net.URL generatePresignedUrl(java.lang.String bucketName, java.lang.String key, java.util.Date expiration, HttpMethod method) throws AmazonClientException Date 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. Ruby Class: 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 Ruby Class: 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 'rubygems' require 'aws-sdk' class 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 end end
  25. 25. ただし、 メッセージは 8kB以内に限るorz
  26. 26. SimpleDB APIが シンプルじゃない件 • いや、シンプルすぎて冗長なコードに なってしまう • 素のJDBCはチョット…的な。 • データの型は全部文字列だよ!
  27. 27. SimpleDBの Data Mapperがホスィ Hibernate的な ActiveRecord的な WOのEOF的な
  28. 28. Ruby SDKにSimpleDBの Data Mapperが!
  29. 29. class Book < AWS::Record::Base string_attr :title end Book.new(:title => 'スベらないプレゼン').save Book.where('title like ?', '%プレゼン%').count $ rails generate scaffold_controller Book title:string config/routes.rb: Myapp::Application.routes.draw do resources :books end http://aws.amazon.com/articles/8621639827664165 より
  30. 30. class Book < AWS::Record::Base string_attr :title end Book.new(:title => 'スベらないプレゼン').save Railsと違和感なしに Book.where('title like ?', '%プレゼン%').count 統合できる! $ rails generate scaffold_controller Book title:string config/routes.rb: Myapp::Application.routes.draw do resources :books end 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/

×