2012年2月28日火曜日

低コストなのはやはりGAEなのか 〜Elastic Beanstalkを触ってみて〜

先日からAmazonのJavaのPaasであるElastic Beanstalkを使っているのだが、思ったより金銭的コスト高い気がしてきた。Beanstalkはそれ自体の料金は無料で、バックで動いているEC2などの利用料金が取られる仕組みになっている。このバックで動いているサービスが厄介な感じだ。 

インスタンス課金の問題 
例えば、EC2はインスタンス単位の従量制課金になっている。GAEもインスタンス課金に変わったが、ちょっとこれとは意味が違う。まず、バックで動くEC2インスタンスは、ウェブアプリにアクセスに関わらず常時動いているということになる。先日でお試しでEnvironmentを作ってちょっとアプリを置いて、数回試しただけなのだが、Account Activityを確認してみたら、
Amazon EC2 running Linux/UNIX 186 Hrs 
となっている。186Hrsってどういうこと?アカウント作成したのはほんと数日前で、ほとんどアクセスしてないのに。。。なぜ186時間なのかといえば、
  • アクセスがなくてもインスタンスは起動し続けている
  • 1Environmentごとに1インスタンスが起動
という仕組みで、お試して2つぐらいEnvironmentを作ったままにしていたからそうなった感じ。まあこれは世間的にはあたり前のことかもしれないけど、今までGAEしか使ってなかったものからするとちょっと意外なんですよね。

もれなくサービスがついてくることの問題
Elastic Beanstalkってとても高機能なJavaサーブレットコンテナですが、それはつまり単体のサービスではなく、いろいろなサービスを組み合わせたものであると。。。しかも有料のね。おさらいするとElastic Beanstalkとは、
  • Amazon EC2
  • Amazon EC2 EBS
  • Elastic Load Balancing
  • Amazon CloudWatch
  • Amazon Simple Notification Service
がバックで動いていることで、スケーラビリティの高いPaaSを実現しているわけですが、これらは使うと当然課金されます。で、やっかいなことにBeanstalkではこれらのサービスがもれなくついてきます。ロードバランサーなんかいらないんだけど、、、といっても外せません。だから、ロードバランサーについても今現在で、
Elastic Load Balancing 199 Hrs
という課金になっています。これは1Environmentを構築するたびに、Load Balancingも立ち上がっているということが原因です。

文句があるならEC2で環境構築しろや
まあ、そういうことでしょうね。EC2単体でLinuxを用意してそこで環境整備すればそれで解決するのだとは思います。ですけどね、、、環境整備が面倒だからこういったPaaSに感心があるわけでー。逆に言うと、そういう手間暇かからないんだから金は取られて当然ってことになるんですかね。

やっぱりGAEって安いのかな
そう考えると、GAEってやっぱり安い気がします。インスタンスは、アクセスが有るときのみ動いているようですし無料枠もあります。GAEが正式版になって、「1日28インスタンスだけ?!高すぎ」とか思ったりしましたが、使わなければ課金されないという手軽さがあるんですよね。

AWSにも無料枠はありますので、実際今のところ課金は発生していません。ただ無料枠適用は最初の1年だけのようですし、今後、永続的に利用する環境となるとちょっと心配です。まあ、毎月数千円でインフラが整うっているのは、一般的にみると安いんでしょうね。大学はいちおう回線ありますし、マシンもありますから別にEC2とか使わなくてもいいのでは?と思われるかもしれませんが、やはりメンテナンスが。。。研究室レベルのちょっとしたインフラとしてはちょっとBeanstalkやEC2は割りに合わないのかなぁ。




2012年2月26日日曜日

Netbeans7.0.1でGAEプラグインを動かす

Netbeans7.0.1でGAEのプラグインを動かそうとしたのだが、相変わらず7以上のバージョンに対応したプラグインは存在せず。仕方なく6.9用のプラグインをダウンロードするもインストール時に
Javaヒント(バージョン4以上)が必要です
というエラーが発生してインストールできないという事象が発生。ネットでもあんまり話題になっておらず(NetbeansでGAEってマニアックな感じだし)、どうしたものかと困っていましたが解決策がわかりました。
6.7.1用のプラグインをkenaiからダウンロードする( http://kenai.com/downloads/nbappengine/1.0_NetBeans671/updates.xml)
ことで解決しました!プラグインの設定画面から上記URLを登録してください。これは解決したことになったのか?バージョン古くてちゃんと動くのか完全には未確認ですが、とりあえずJettyが起動してサーブレットを動かくすことはできました。

P.S
最後にサーバを追加した時に、なぜかエラーというかサーバが追加できない事象が発生しましたが、これは8080ポートが他のサーバとかぶっていたからのようで、別のポートにすることで解決しました。



2012年2月25日土曜日

考察:クラウドなプラットフォームの選定あれこれ

大学というのはネットやコンピュータをある程度自由に使える環境をもっているわけだが、基本、メンテナンスは自分でやる必要がある。永続的にメンテナンスをしてくれる人材を確保できるであればかまわないが、残念ながらなかなかそうになならない。だから自分でやるしかないといっても時間は絶対的に少ない。そんな余裕はない。。。だから、インフラについてはクラウドなサービスにまかせようというわけで、手をつけたのがGAEだったわけだが、、、

GAEの使い勝手が悪くなってきたか、、
GAEの正式リリースに伴いちょっと雲行きが怪しくなってきた。最大のネックはDataStoreの課金問題。課金の仕組みに問題があり、あっという間に無料枠を飛び越え、しかもかなりの額になるという話題を耳にしており、おそらく現在もそのままだろう。同じ研究者仲間もGAEの利用はやめるとか言ってたし。。。
金額の問題をカバーするためにはシステム設計で工夫が必要になる気配で、開発効率を下げるような手間暇をかけるのはできるだけ避けたい。どうせ金を払うんだったら自由度の高いインフラがいい。。。ということで、現在、AWS、アマゾンウェブサービスも視野に入れていろいろやっている。

データベースはニュートラルなプラットフォームがベターか
データベースというのはシステムにおいて重要な位置づけであるが、GAEよりもAWSをプラットフォームにしたほうが良いことに気づいてきた。AWSには幾つかのDBサービスがあるが、これはいろいろなインタフェースでアクセスが可能なようになっている。一方、GoogleのDatastoreはどちらかというとGAEと密な関係にある。GoogleのDatastore使うならGAE一択になってしまい、ロックインされてしまうおそれが高い。AWSのデータベースは、ウェブアプリだけでなく、通常のアプリからもアクセス可能。C#にも対応してるので、いろいろな研究プロジェクトでのちょっとしたDBとして使えそう。そういうことを考えるとAWSのほうがよい気がする。

GAE+AWSのソリューション
AWSは正直関心がなかったのだが、いつのまにかJavaが動くPaasが始まっている。GAEよりも自由度が高く、金銭的な問題を気にしなければAWSのほうがいいかもしれない。
また、適材適所でGAEとAWSを使い分ければ、金額的にも安く収まるんじゃないかなというきがしている。DBが不要なライトなサービスはGAEで十分だし、無料枠はそれなりに魅力。
一番の理想は、GAEでAWSのデータベースを呼び出すこと。実は、GAEの制約によりAWSのSDKは利用できないことになっている(GAE対応に対応したSDKの亜種も出ているが、ちょっとバージョンが古く最新版はまだ対応していない)。とりあえずデータベース周りの処理は、AWS上にProxyみたいなのを用意して対応する予定(技術的な目処は経った)。この点については、後日BLOGで取り上げたい。

とまあ、ちょっと独り言的なネタでしたが、たまにはこういうのもいいでしょう。

2012年2月24日金曜日

DynamoDB:IAMでのUserPolicyによるアクセス制限

諸事情で、ちょっといまAWSのDynamoDBについて調査中のメモ書き。
DynamoDBをラボで利用しようかと検討しているのだが、問題となるのはゼミ内で共有する時に問題となるのがテーブルへのアクセス制御。EclipseのPluginを使うとテーブルが全て見えてしまうのでこれは正直都合が悪い。そこで、要求仕様として
  • ユーザごとにテーブルへのアクセス制限をする。具体的にはテーブルを見えないようにする。
というのを設定したわけだが、ここでちょっとハマった。。。
DynamoDBではIAMを用いてポリシーを記述することができるらしく、DynamoDBのテーブル参照のActionはおそらく、
  • dynamodb:ListTables
なんだろうと推測。これをユーザとテーブルに対応したARNでDenyさせとけばいいと思ったわけだが、どうやらListTablesのアクションはARNでは制御できないとか。。。。
具体的にいうと
"Resource": "arn:aws:dynamodb:*:xxxxxxxxxxxxx:table/table1"
という記述で、table1に対してDenyするということはできない。ここは、
"Resource": "*" とするしかないわけだ。つまり、
  • テーブルリストは全て見せるか全て見せないかの2択。
  • アイテムの参照のレベルでテーブル毎にアクセス制限をつける
という戦略をとるしかないようだ。具体的には、
  • 全てのリソース(テーブル)に対する"dynamodb:ListTables"をAllowとするステートメントを用意
  • 特定のテーブルに対してアイテムのScanやCRUD操作ができるActionをAllowとするステートメントを用意
とすれば良いようだ。

なお、テーブル毎にステートメントを書いていくのは面倒な気がするがちょっとしたコツがある。AWSのARNの書き方では、*を利用した前方一致の指定ができる。そこで、プロジェクト毎にテーブル名の名前の付け方を決めておけば、*で一発で検索できる。例えばtest用のテーブルにtestという接頭語をつけるようにしておけば、test*の指定でOKとなる。


EclipseのGWTプラグインのHTML生成ウィザードにバグ?

EclipseのGWTプラグインHTML生成ウィザードにちょっとバグがあるようなので2つほど取り上げときます。

旧バージョンにバグ
1つ目は既に解決済みのバグですが、古いバージョンだとHTMLファイルが生成されない模様(ネットでも同様の指摘があり)。Finishを押してもウィザードが閉じずに何も作られない現象が起きることがあります。これは古いバージョンで起きていたようで、もしこの現象が生じたらプラグインを最新版にアップデートしておきましょう。

現バージョンでもバグ?
もう1つはおそらく現在も治っていないバグですが、ウィザードで生成されるHTMLファイルが正しく生成されません。このHTMLはアプリの実体、つまりnocache.jsファイルへの参照が記述されてるのですが、その参照の記述が正しくされないというバグが起きています。具体的にいうとnocache.jsだけ書いてあって、ディレクトリとかパッケージ名が正しい名前が書かれていません。実際にこのファイルがどこに配備されるのかは、GWTコンパイラが生成するファイルみればわかりますので、その通りにしましょう。まあだいたい、
モジュール名/モジュール名.nocache.js
という記述になっているはずです。

なお2つめのバグは、Dynamic WebApplicationプロジェクトでGWTを利用した際に発生しました。動作環境はEclipse3.7 with GWT2.4 on Macです。GWTを利用するときは普通はGoogleのWebapplicationプロジェクトを利用するので、ほとんどの人はHTMLファイルウィザードなんて利用してないから気づいてないのかもしれません(あるいは私の固有のバグ?)。


2012年2月22日水曜日

[GWT:エラー] reportUnusedDeclaredThrownExceptionIncludeDocCommentReference

EclipseでTomcatの環境でGWTをコンパイルしようとした時に、標題にあるようなエラーが出ました。詳しく書くと、
java.lang.NoSuchFieldError:reportUnusedDeclaredThrownExceptionIncludeDocCommentReference
という感じです。これの解決策ですが、ライブラリの参照順番によってこのようなエラーがおきるようです。具体的に言うと、
  • Tomcatライブラリの参照の前にGWTのライブラリ参照をする
という方法で解決できます。Eclipseでは[Configure Build Path]→[Order and Expert]のところでクラスパスの順番を変えることでOKなようです。

このように、GWTSDKを上の方に持ってくることでコンパイルが成功しました。

P.S
ちょっと現在、GAEからの脱却を図りつつGWTを利用していく方針を検討しているのですが、Netbeansだったらすんなりサーバ切り替えでで対応できるんですが、EclipseはGAEとGWTが結構密接に関係しているようで、GAEに依存しないGWTアプリを作るにはちょっとした手間がかかりそうです。


EclipseのGAEローカルサーバーにlocalhost以外からアクセスする方法

ちょっとハマったのでメモ書き。

EclipseのGAEローカルサーバ(つまりJetty)に、LAN内の他のマシンからアクセスすることができないという事象が発生。もちろん、LANの環境は問題なく設定されています。で、原因なのですが、EclipseのGAEローカルサーバはデフォルトでは外部からアクセスができないようになっているらしい。具体的にいうとサーバが自分のIPを認識できてない模様?で、localhostでは反応するがIP直接指定だと同じマシンでもダメ。。。ということになっている。それを解決する設定は下記の通り。

  • Run→RunConfiguration→Arguments→Program argumentsを開く
  • 左ペインから 設定したい Web Application名を選択←間違えないように。
  • --address=xxx.xxx.xx.xx を追記(xxxのところは自分のマシンのIPアドレス)

そうすることで、IPアドレス指定のアクセスに反応してくれます。

以前は、こんなことをしなくても動いてくれたたはずなので、、、、いつのバージョンから変わったんだろうか。

2012年2月7日火曜日

Global Android Dev Camp Kyotoが開催されます

2/17 ~2/19 に世界各地でGlobal Android Dev Campなるイベントが開催されます。 関西では、京都リサーチパーク京都にて、主催:京都GTUG、協催:神戸GTUG、日本Androidの会 (関西支部、神戸支部、京都支部)によりGlobal Android Dev Camp Kyotoを開催します。
私は残念ながら参加できませんが、おちラボから学生が1名参加予定です。世界的なイベントに乗る絶好の機会ですので、興味が有る方はぜひ!
詳細は、京都GTUGのサイトを御覧ください



2012年2月1日水曜日

C#: OpenCVSharpでビデオファイルを作成する

OpenCVSharpを利用したビデオファイルの作成する方法です。
上記プログラムでは省略してますが、bmpVideoという変数はBitmapクラスで、フレームに相当する画像データだと思ってください。画像をIPLImageに変換し保存する。。。という処理を繰り返すことで、動画が出来上がります。ただし、最後に必ずVideoWriterはDisposeしてください。この処理をしないと再生できないAVIファイルができあがります。