かれ4

かれこれ4個目のブログ

動的サイトにEC2を使わない。

CDP Advent Calendar 11日目
クラウドを使うにあたって、EC2をWebサーバに使うことに疑問を感じています。
EC2 Elastic Compute Cloud
Computeを提供するサービスなのに、なぜコンテンツを配信なんてしなきゃいけないんだと。
コンテンツの配信はCloudFrontにまかせておけばいいじゃないか。
色々な会社の言ってるクラウドVPSと区別つかなくなってしまってるのもここに原因があるように思ってます。

と、前置きはこんな所にして、実際に今日提案したいCDPは

EC2を使わずに動的なサイトを公開するパターンです。

静的なサイトはS3を使えば簡単にできてしまうので、動的なサイトを。
そもそもなんで動的なサイトをS3に置けないかというと、何かしらの処理をサーバサイドにやらせようとしていたからです。
それを全てクライアントサイドとデータベースでやったらいいじゃないかという考えです。
なので、基本全てJavaScriptでの実装です。


よくある構成が左で、今回の構成が右です。

S3を使ってこの構成をやるにはいくつかの問題があります。

  1. JSからデータベースにつなげるドライバがない。
  2. 認証
  3. クロスドメインの通信

この3つが大きな問題点ですが、そこはAWSにこれを解決出来るサービス達がちゃんとあります。

JSからデータベースにつなげるドライバがない

まず1つめの問題ですが、これはHTTPでアクセス出来るデータベースがあれば、問題はありません。
AWSにはHTTPでアクセスできるデータベースが3つもあります。

  1. SimpleDB
  2. DynamoDB
  3. CloudSearch

です。(AWS_Simple_Icons Ver2 でアイコンが入って来ましたが、ちゃんと紫色でした。)
この中でもDynamoDBとCloudSearchはレスポンスがJSONなので、JSとの親和性が高くて素敵です。

認証

認証をどうとるかという問題ですが、DynamoDBは今はAuthV4という認証を使っているので、Signatureを生成するためにAccessKeyとSecretKeyが必要になります。
一方CloudSearchはCIDRでのコントロールが出来ます。
また、書き込むためのACLとsearchのためのACLをわけることが出来るので、簡単そうです。
なので、データベースはCloudSearchを使います。

クロスドメインの問題。

S3においたJSからどうやってCloudSearchにアクセスするのかというところです。
2つのアプローチがあると思います。
FLASHなどを経由して、クロスドメインでのアクセスをする方法と
S3とCloudSearchの両方を同じドメインにしてしまう方法です。

今回は後者を使います。

S3とCloudSearchを同じドメインにするためのサービスがAWSには有りました。
そうCloudFrontです。

というわけで朝から出ていた、予告!の図です。

これです。CloudFrontの力を借りてS3とCloudSearchを同じドメインにします。
あとはもうJSでぐわーって感じです。
S3でバケットを作り、CloudFrontのOrigin に追加
(S3 website Hostingの方のドメインをCustomOriginとしていれると/でアクセスした時良い感じです。)
CloudSearchでドメインを作りsearchのエンドポイントをCloudFrontのOriginに追加

したら、behaviorsで
PathPattern /2011-02-01/*に対してはcloud search なOriginに向くように設定します。
大事な事はS3よりも上にあることです。
この順序で、マッチさせていくので、先に無いとS3の2011-02-01で始まるキーのオブジェクトを探しにいってしまいます。

これで準備は完了です。
実際に作ってみたサイトがこちらです。
12/14には落としてしまう予定です。

http://cdpadvent.tottokug.com/index.html

imacとか入れて検索してみて下さい。

デザインとかは適当です。
JSでCloudSearchのデータを取り出して、HTMLを作っています。
なんか家電的なものの値段をまとめてみました。
裏でクローラなんか使ってCloudSearchにデータを入れていけば、表側はS3で対処できます。

これからは動的か静的かでEC2を使う使わないを選択するのではなく、
コンテンツ閲覧者からの書込の有無で選択したら良いと思います。

これってCDPになりませんか?

追記:

注意点として、CloudFrontのキャッシュが効いてしまうので、開発中はS3にも2011-02-01/selectというファイルを作って、S3だけで開発して、
出来たなと思ったらCloudFrontの設定をすると、開発がしやすいです。
もし、CloudFrontのキャッシュを消したい時はInvalidationsを使うのがおすすめです。
Invalidationsする時はindex.htmlだけでなく/も指定しておくとさらに良いと思います。