MyCSS

2012/02/21

S3のバケット名はよく考えて命名しましょう! はてなブックマークに追加

この間のJAWS-UG札幌勉強会で話しそびれた小ネタの一つです。タイトルを一読して「そんなことわざわざブログに書かなくても(ry」というAWSエキスパートな方は読み飛ばしてくださいねw


オブジェクトのURLについておさらい
S3に保存したオブジェクトは、すべてURLがつきます。 例えば、東京のS3に「hoge」というバケットを作り、そこに「fuga.jpg」を保存したとすれば、
http://s3-ap-northeast-1.amazonaws.com/hoge/fuga.jpg
というURLが割り当てられます。 また、バケット名をサブホストとしても有効なので、
http://hoge.s3-ap-northeast-1.amazonaws.com/fuga.jpg
でもOKです。

SSLも使えるよ!
さらに、S3はSSLも使えます。つまり、上記のオブジェクトは
  • https://s3-ap-northeast-1.amazonaws.com/hoge/fuga.jpg
  • https://hoge.s3-ap-northeast-1.amazonaws.com/fuga.jpg
でも行けちゃうわけですね。スバラシイ!

ヤバいのはどれだ?
さてここで問題です。以下のURLで、ヤバいのが一つだけあります。それはどれでしょう?(すべてパブリックにしてありますので、ブラウザで確認する事が出来ます。)
  1. http://s3-ap-northeast-1.amazonaws.com/with.dot/index.html
  2. https://s3-ap-northeast-1.amazonaws.com/with.dot/index.html
  3. http://with.dot.s3-ap-northeast-1.amazonaws.com/index.html
  4. https://with.dot.s3-ap-northeast-1.amazonaws.com/index.html

正解
実際にリンク先に飛んでみると分かるのですが、問題なのは4番です。要するに、バケット名に「ピリオド(ドット)」が入ったパターンです。SSL証明書の警告が出ましたよね?



S3のSSL証明書は、ワイルドカード証明書です。でも、ピリオドが含まれていると問題になります。ちょっと考えればすぐ分かる事なのですが、S3を直に参照させてSSLも通したい場合は、バケット名に気を使わないと後で泣く事になりますので要注意です!!

CNAMEも同じ事
もうひとつのURLパターン、手持ちのドメインでS3バケットに対してCNAMEしてあげるという方法もあります。例えば、
suberu.dateofrock.com
というバケットを作成して、なおかつ
images.hoge.com CNAME images.hoge.com.s3-ap-northeast-1.amazonaws.com
としてやれば、
のように、まるで自分のサーバーのようにURLを作る事が出来ます。
ですが、これもSSLだと証明書の問題が発生します。そもそも証明書とドメイン名違いますから!
というわけで、バケット名はよく考えて命名しましょう!

2012/02/15

第5回 JAWS-UG札幌勉強会に参加してきました はてなブックマークに追加

第五回JAWS-UG札幌勉強会に参加してきました。今回は内容が濃くて、札幌はかなりレベルが高いなぁ、と思った次第です。 AWSエバンジェリスト玉川さん(@KenTamagawa)が東京からリモート参加になり、とうとうAWSはエバンジェリストまでクラウド化(笑)したのか!?という勉強会でしたw
Ustream録画アーカイブ
みなさんの発表
ちなみに今回のLTは、女性によるLady's Talkということで盛り上がったわけであります。
自分が発表したスライドはこちら
というわけで、このスライドにもあるように、今後小ネタを少しずつアップしていこうと思いますww
リンク

2012/02/06

AWS MVP "AWS Samurai" award をいただきました! はてなブックマークに追加

かなり遅ればせながらのご報告ですが… 昨年末のJAWS-UG東京勉強会にて、AWS MVP "AWS Samurai" awardの発表があり、このすばらしい賞を受賞いたしました!!!当日は札幌の自宅でしたので、お茶の間でUstreamで見ていたのですが、正直予想もしていなかったので大変驚きました〜!Twitterでコメントしたのですが、どうにも遅延があってリアルタイムとはいかなかったですww

私の他、JAWS-UG東京会長の竹下さん(@dynakou)、gumi CTOの堀内さん(@horiuchi)、cloudpackの後藤さん(@kaz_goto)と言う事で、この4人で2012年のAWSサムライという事になりますw

東京・札幌勉強会でのUstream中継やJAWS-UGの勉強会での発表、雑誌記事執筆、ブログその他での情報発信などを評価していただいたようです。ほんとうにありがたい事です。

自分はAWSの1ユーザーにすぎず、実務でもそれほど大規模に使っているわけではありません。ですが、印刷会社の開発者としてこうして北海道の地に戻って来てテレワーク出来るのも、AWSをはじめとしたクラウドがあったからです。これからも、この経験を皆さんにシェアできたらいいなぁ、と思っています。

本当にありがとうございました!!

2012/02/02

Amazon SimpleDBのJava版データマッパーを作り始めました はてなブックマークに追加

Amazon SimpleDBのJava版データマッパーを作り始めました。 MavenのオレオレリポジトリをS3に作ってありますんで、ちょっと試してみたい方はpom.xmlに以下を追加してください。
<repositories>
<repository>
<id>dateofrock</id>
<url>https://s3-ap-northeast-1.amazonaws.com/dateofrock-repository/maven/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.dateofrock.aws</groupId>
<artifactId>simpledb-mapper</artifactId>
<version>0.6-SNAPSHOT</version>
</dependency>
</dependencies>
view raw gistfile1.xml hosted with ❤ by GitHub

なにそれ?
HibernateとかS2JDBCとか世の中に沢山あるORM的なもので、データストアをSimpleDBに特化させたものです。APIはJPAに準拠しているわけでも何でもなく、オレオレAPIです。 たとえば、
package model;
import java.util.Date;
import java.util.Set;
import com.dateofrock.simpledbmapper.SimpleDBAttribute;
import com.dateofrock.simpledbmapper.SimpleDBBlob;
import com.dateofrock.simpledbmapper.SimpleDBEntity;
import com.dateofrock.simpledbmapper.SimpleDBItemName;
import com.dateofrock.simpledbmapper.SimpleDBVersionAttribute;
/**
* テスト用モデル
*/
@SimpleDBEntity(
domainName = "SimpleDBMapper-Book-Testing",
s3BucketName = "simpledbmapper-book-testing",
s3KeyPrefix = "simpledb-blob/")
public class Book {
@SimpleDBItemName
public Long id;
@SimpleDBAttribute(attributeName = "title")
public String title;
@SimpleDBAttribute(attributeName = "isbn")
public String isbn;
@SimpleDBAttribute(attributeName = "authors")
public Set<String> authors;
@SimpleDBAttribute(attributeName = "publishedAt")
public Date publishedAt;
@SimpleDBAttribute(attributeName = "price")
public Integer price;
@SimpleDBAttribute(attributeName = "height")
public Float height;
@SimpleDBAttribute(attributeName = "width")
public Float width;
@SimpleDBAttribute(attributeName = "available")
public boolean available;
@SimpleDBBlob(attributeName = "review", contentType = "text/plain")
public String review;
@SimpleDBBlob(attributeName = "coverImage", contentType = "image/jpeg")
public byte[] coverImage;
@SimpleDBVersionAttribute
public Long version;
}
view raw Book.java hosted with ❤ by GitHub
があったとして、こんなかんじです。
Book book = new Book();
book.id = 123L;
book.title = "スベらないプレゼン";
book.authors = new HashSet<String>();
book.authors.add("恥 忍");
book.authors.add("恥 晒");
book.price = 480;
book.publishedAt = toDate("2015-3-10 00:00:00");
book.isbn = "0987654321";
book.width = 18.2f;
book.height = 23.0f;
book.available = false;
book.review = readUTF8String("/book2.review.txt"); //大きなテキストなど
book.coverImage = readBytes("/book2.cover.jpg"); //JPEG画像など
AWSCredentials cred = new BasicAWSCredentials(accessKey, secretKey);;
AmazonSimpleDB sdb = new AmazonSimpleDBClient(cred);
sdb.setEndpoint("sdb.ap-northeast-1.amazonaws.com"); //東京リージョン
AmazonS3 s3 = new AmazonS3Client(cred);
SimpleDBMapper mapper = new SimpleDBMapper(sdb, s3);
mapper.save(book);
book.title = "スベりまくるプレゼン";
mapper.save(book);
mapper.delete(book);
view raw Sample.java hosted with ❤ by GitHub

なぜそんなものを作ったのか?
Ruby版のSDKには、SimpleDBをデータストアにしたActiveRecordがあるんです。
これは結構ステキですね〜。 そして、最近発表になったDynamoDBでは、なんとJava版SDK内にデータマッパーを持っています。
これもかなりステキですね〜。 そんな中で、AWSの(把握しきれないくらい)数あるサービスの中でも、とりわけシンプルシリーズ(SimpleDB/S3/SQS/SNS/SES)大好き人間からみると、どうもSimpleDBのAPIが全然シンプルじゃないww かといって、JavaのSimpleDBラッパーが世の中にあるのかなぁ?と探してみると、確かにJDBCJPAのインターフェースに乗せたすごいものがありますけど、ちょっとそれはオーバースペック(というか、そういうインターフェースに無理矢理マッチさせている感が苦手…)なので、恥を忍んで書いた次第です。APIはDynamoDBのデータマッパーパクって参考にしました。
追伸
ちなみにJavaを書いたのは結構久しぶりだったので、アノテーションってどうやって定義するの?とか、そういうレベルでした(←JavaSE5から取り残されている人)
でも、リフレクションAPIをいじりだしたら異常にメンドクサイのは確かなんだけど、何だろう?この開放感はww 基本的に自分のために作っているライブラリで、まだまだ機能不足やら不具合があります。正直テストもマトモに書いていませんので、ご利用はAt your own riskでおねげーします。
さらに追伸
すでにこういうスバラシイものがありました。もっと早く気がつけば良かったよ…