aws小ネタ集
DESCRIPTION
第五回JAWS-UG札幌勉強会で発表したスライドです。詳細はブログ(http://blog.dateofrock.com/)に書きますwTRANSCRIPT
第5回 AWS User Group - Sapporo 勉強会
AWS小ネタ集欧文印刷株式会社 田名辺健人2012.02.14
http://www.flickr.com/photos/mendhak/4271441910/
田名辺 健人(たなべたけひと)
ソフトウェアエンジニア欧文印刷株式会社(東京都)2011年11月から札幌でテレワーク
@dateofrock
札幌・東京コアメンバーUstream担当好きなサービスはSQS
http://www.flickr.com/photos/pinksherbet/1483193019/
Happy Valentine
http://www.flickr.com/photos/pinksherbet/1483193019/
Happy ValentineLT(Lady's Talk)してくれた貴女へ…
http://www.flickr.com/photos/pinksherbet/1483193019/
Happy ValentineNUboardプレゼント♡
from 欧文印刷
たまには技術の話を
しようと思いますwww
• S3 小ネタ• 読み書きのスループットを上げる方法• バケット名にピリオドでハマる方法
• S3実践ネタ• 設定ファイル置き場• Pre-signed URLの使い道
• Simpleシリーズ2連発• アプリ内エラー通知はSNSが便利• SimpleDB APIがシンプルじゃない件
http://www.flickr.com/photos/mendhak/4271441910/
http://www.flickr.com/photos/donsolo/2435421847/
ネタ作りすぎたw
• S3 小ネタ• 読み書きのスループットを上げる方法• バケット名にピリオドでハマる方法
• S3実践ネタ• 設定ファイル置き場• Pre-signed URLの使い道
• Simpleシリーズ2連発• アプリ内エラー通知はSNSが便利• SimpleDB APIがシンプルじゃない件
http://www.flickr.com/photos/mendhak/4271441910/
• S3 小ネタ• 読み書きのスループットを上げる方法• バケット名にピリオドでハマる方法
• S3実践ネタ• 設定ファイル置き場• Pre-signed URLの使い道
• Simpleシリーズ2連発• アプリ内エラー通知はSNSが便利• SimpleDB APIがシンプルじゃない件
http://www.flickr.com/photos/mendhak/4271441910/
半分カット
orz
http://www.flickr.com/photos/mendhak/4271441910/
• S3 小ネタ• 読み書きのスループットを上げる方法• バケット名にピリオドでハマる方法
• S3実践ネタ• 設定ファイル置き場• Pre-signed URLの使い道
• Simpleシリーズ2連発• アプリ内エラー通知はSNSが便利• SimpleDB APIがシンプルじゃない件
Pre-signed URLの使い道
• S3オブジェクトに対して有効期限付きのパブリックなURLを生成できる
• Query String Request Authenticationhttp://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth
Pre-signed URLどんなもの?
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;
こんなマンドクサイものはSDKに頼ろう
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);
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)
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)
Rubyステキ!
Pre-signed URL実 例
Pre-signed URLの使い道
• Webサーバーの負荷が劇的に減る!
• アプリはPre-signed URLを生成してS3
にリダイレクトするだけ
• 重たいデータ送出はS3にお任せ!
http://www.flickr.com/photos/mendhak/4271441910/
• S3 小ネタ• 読み書きのスループットを上げる方法• バケット名にピリオドでハマる方法
• S3実践ネタ• 設定ファイル置き場• Pre-signed URLの使い道
• Simpleシリーズ2連発• アプリ内エラー通知はSNSが便利• SimpleDB APIがシンプルじゃない件
アプリ内の通知はSNSが便利
たとえば例外が投げられたら
メールでお知らせとか
Java
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"));
" }" });
例えばUncaughtExceptionHandlerを使う
Ruby on Rails
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 endend
例えばApplicationController#rescue_fromを使う
ただし、メッセージは
8kB以内に限るorz
SimpleDB APIがシンプルじゃない件
• いや、シンプルすぎて冗長なコードになってしまう
• 素のJDBCはチョット…的な。
• データの型は全部文字列だよ!
SimpleDBのData Mapperがホスィ
Hibernate的なActiveRecord的な
WOのEOF的な
Ruby
SDKにSimpleDBのData Mapperが!
class Book < AWS::Record::Base string_attr :titleend
$ rails generate scaffold_controller Book title:string
config/routes.rb:Myapp::Application.routes.draw do resources :booksend
http://aws.amazon.com/articles/8621639827664165 より
Book.new(:title => 'スベらないプレゼン').save
Book.where('title like ?', '%プレゼン%').count
class Book < AWS::Record::Base string_attr :titleend
$ rails generate scaffold_controller Book title:string
config/routes.rb:Myapp::Application.routes.draw do resources :booksend
http://aws.amazon.com/articles/8621639827664165 より
Book.new(:title => 'スベらないプレゼン').save
Book.where('title like ?', '%プレゼン%').countRailsと違和感なしに統合できる!
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;
@DynamoDBHashKey public Long getId() {
" return this.id; }
@DynamoDBAttribute(attributeName = "title") public String getTitle() {
" return this.title; }
// 以下、setter}
使用例(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);
なぜSimpleDBには無いのだ!
ついカッとなってつくってみたw
SimpleDBMapper(笑)
@SimpleDBDomain(domainName = "BookDomain")public class Book {
@SimpleDBItemName public Long id;
@SimpleDBAttribute(attributeName = "title") public String title;
}
使用例(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);
DynamoをSimpleに変えただけ(笑)
simpledb-mapper(笑)• DynamoDBMapperライクなAPI(笑)
• でもパクっただけじゃない
• 1024byteを超えるデータ(Blob)はS3に
• @SimpleDBVersionでOptimistic
Lock(Conditional PUT/DELETE)
• 検索APIにはナウいFluent Interface採用
ナウな感じに書ける
List<Book> books = mapper.from(Book.class).where("title", Like, "%スベる%").and("price", GreaterThan, 1000).orderBy("price", DESC).limit(10).fetch();
ただし
使用上のご注意
• 自分が現状必要としていないものは実装していません(笑)
• リレーション機能は持たせないつもりです。(Simpleじゃなくなるので)
• テストは適当です(これはひどい)
というわけで
dateofrock/simpledb-mapper
(笑)
気が向いたらForkしてね
残りは後日ブログに書きますw
http://www.flickr.com/photos/mendhak/4271441910/
Thank you!
http://www.flickr.com/photos/mendhak/4271441910/