作成者別アーカイブ: takayukimel

Amazon Elastic Beanstalkで複数のwarファイルをアップロードする方法

| コメントをどうぞ

Amazon Elastic Beanstalk (以下 Beanstalk)では、javaアプリケーションを動かす時、warファイルをアップロードしてそのwarファイルをBeanstalkが自動的に展開してtomcatにデプロイしてくれます。 ただし、現在のBeanstalkではwarファイルは1つしかアップロードできません。 複数warファイルがあるアプリケーションをBeanstalk上で動かすのは無理なのかなーと思って色々調べたら、どうにか複数warファイルでもアプリケーションが動作する環境ができたので、その方法をまとめてみます。

ただし、公式の方法ではないので実際に試す時は注意して行なって下さい。

1.Beanstalkで利用可能なEC2インスタンスをAMIから作成する。

まずは、Beanstalkで使用するためのAMI(Amazon Machine Image)のベースになるインスタンスを作成します。

EC2のインスタンス作成時に下記画像のようにCommunity AMIsから「beanstalk」を検索し、beanstalk用のAMIからインスタンスを作成します。

2.Beanstalkで利用しているEC2インスタンスのRubyファイルを編集する。

インスタンスが作成されたら、ssh等でサーバーへログインします。

sshでログイン後に、下記コマンドでrubyファイルを編集します。このrubyファイルが、beanstalkでインスタンスを作成時に実行されて、インスタンス内のtomcatにアプリケーションをデプロイしています。

vi /opt/elasticbeanstalk/srv/hostmanager/lib/elasticbeanstalk/hostmanager/applications/tomcatapplication.rb

編集箇所1

/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/ROOT


/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/

編集箇所2

/usr/bin/sudo /bin/chown -R tomcat:elasticbeanstalk #{TomcatApplication.tomcat_webapps_dir}/ROOT

/usr/bin/sudo /bin/chown -R tomcat:elasticbeanstalk #{TomcatApplication.tomcat_webapps_dir}/*

編集箇所3

/usr/bin/sudo mv #{TomcatApplication.tomcat_deploy_dir}/application.war #{TomcatApplication.tomcat_webapps_dir}/ROOT.war

/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/

編集後に、インスタンスをAMIとして保存します。

3.Warファイルを作成しBeanstalkでアプリケーションを作成する。

Beanstalkに複数のwarファイルをアップロードして複数のアプリケーションを立てる場合は、次のようなwarファイルを用意します。

application.war
├─appA.war
├─appB.war
└─appC.war

また、application.warに含まれている各warファイルのMETA-INFフォルダには、context.xmlを含めるようにして下さい。

次に、Beanstalkでアプリケーションを作成し、用意したwarファイルをbeanstalkのアプリケーションにアップロードします。

Beanstalkでのアプリケーション作成方法は下記URLなどを参考にして下さい。

http://www.atmarkit.co.jp/fjava/rensai4/devtool23/devtool23_1.html

アプリケーションを作成後しばらくすると、EC2のインスタンスが立ち上がりますが、この時点ではアップロードしたwarファイルは正常にデプロイされません。

Beanstalkでアプリケーションを作成する際、一番初めのデプロイではAMIを指定できずにデフォルトとインスタンスでアプリケーションを作成してしまうためです。

複数のwarを含んだアプリケーションをデプロイする場合は、一旦デフォルトのインスタンスで作成された後に、Beanstalk上の設定でAMIを指定する必要があります。

4.BeanstalkでAMIを指定する。

最後に、Beanstalkの「Edit Configuration」をクリックして設定画面を開き、

2で作成したAMIのIDを「Custom AMI ID」の欄に入力して「Apply Changes」で保存します。

しばらくすると3の最後で作成されたインスタンスが破棄され、設定したAMIで新しいインスタンスが起動します。

インスタンス起動後に

http://アプリケーション名.elasticbeanstalk.com/コンテキスト名

のコンテキスト名を変えると、各コンテキストへアクセスできます。

参考:https://forums.aws.amazon.com/thread.jspa?messageID=229121

Tomcatのクラスタ環境でSession Replicationする方法

| コメントをどうぞ

Tomcatを複数台立てて、各Tomcat上に上がっている同じアプリケーションのセッションを共有する方法です。

この設定をしておくと、Tomcatが1台落ちた時でも他のTomcatが落ちたTomcatで持っているセッションを引き継いでくれるため、
アプリケーションのユーザーは落ちたTomcatを使っていたとしても、セッションが切れずに他のTomcatでアプリケーションを引き続き利用することができます。

上記のような図の構成で、ユーザーのセッションがTomcat Bにあり、Tomcat B が落ちてしまった場合、Tomcat Aが生きていてもユーザーのセッションは切れてしまいユーザーは再度ログインなどをしてセッションを作成しなければならなくなります。

Session Replicationを設定していると、このような状況になってもTomcat B にあるセッションをTomcat Aに複製してくれるので、ユーザーのセッションは切れずにそのままアプリケーションを利用することが可能です。

今回はinfoScoop OSS 3.1.0 quick startでバンドルされているTomcatで設定してみます。

infoScoop OSS 3.1.0 quick startは下記URLからダウンロードできます。
http://www.infoscoop.org/index.php/ja/download/file/65-infoscoop-3.1.0-quickstart.zip.html

infoScoop OSS 3.1.0 quick startのインストール方法は下記のURLをご参照下さい。
http://www.infoscoop.org/index.php/document-310/installation-guide/quickstart-setup.html

セッションレプリケーションにはいくつか方法があるようですが、今回はJDBCを使ってデータベースにセッション情報を保存する方法を試しました。

設定手順は大きく分けると下記のような手順になります。

  1. データベースにセッション情報保存用のテーブルを作成する
  2. コンテキストファイルにデータベース情報を記述する
  3. tomcatのシステムプロパティに宣言を記述する
  4. データベースのドライバーを<TOMCAT_HOME>/libに追加する

これらの手順はinfoScoop OSS quick startをインストール後に行なって下さい。

各手順の詳細を説明します。

1.データベースにセッション情報保存用のテーブルを作成する

今回はquickstartで利用する「iscoop」というデータベースにセッション情報保存ようのテーブルを作成します。

下記sqlを対象のデータベースに対して実行します。

create table tomcat_sessions (
session_id varchar(100) not null primary key,
valid_session char(1) not null,
max_inactive int not null,
last_access bigint not null,
app_name varchar(255),
session_data mediumblob,
KEY kapp_name(app_name)
);

2.コンテキストファイルにデータベース情報を記述する

quick startのtomcat内にあるinfoscoop.xmlにデータベース情報を記述します。

apache-tomcat-6.0.28/conf/Catalina/localhost/infoscoop.xml

上記ファイルのcontext要素内に下記の情報を追記します。

<Manager className='org.apache.catalina.session.PersistentManager'
 saveOnRestart='false' minIdelSwap='0' maxIdleSwap='0' maxIdleBackup='1'>
<Store className="org.apache.catalina.session.JDBCStore"
driverName="com.mysql.jdbc.Driver"
checkInterval="1"
connectionURL="jdbc:mysql://DBサーバー名:3306/iscoop?useUnicode=true&amp;characterEncoding=UTF-8&amp;user=DB接続ユーザー名&amp;password=DB接続ユーザーパスワード"
sessionTable="tomcat_sessions"
sessionIdCol="session_id"
sessionDataCol="session_data"
sessionValidCol="valid_session"
sessionMaxInactiveCol="max_inactive"
sessionLastAccessedCol="last_access"
sessionAppCol='app_name' />
 </Manager>

connectionURLに記述するDBへの接続情報はお使いの環境に合わせて編集して下さい。

3.tomcatのシステムプロパティに宣言を記述する

tomcatのシステムプロパティファイルは下記の場所にあります。

apache-tomcat-6.0.28/conf/catalina.properties

上記ファイルの一番下に下記の内容を追記します。

org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true

4.データベースのドライバーを<TOMCAT_HOME>/libに追加する

quick start内のtomcatにはすでに追加されているので、特に作業は必要ありません。

quick startを利用しない場合は、データベースのドライバーを追加して下さい。

以上でセッションレプリケーションの設定ができます。

参考:http://d.hatena.ne.jp/sato-shi/20110122/p3

javascriptのデバッグでobjectの中身を文字列として展開する方法

| コメントをどうぞ

javascriptで開発をしていると、オブジェクトをブラウザの開発ツール上のコンソールに出力してデバッグする機会が多いかと思います。

例えば、このようなオブジェクトをFireFoxのFirebug に出力すると、下記画像のように表示されます。

var obj = {"Name":"John","Hobby":[{"Hobby1":"Tennis"},{"Hobby2":"Golf"}]};
console.log(obj);

こちらの例のように中身が少なく階層の浅いオブジェクトであればこのまま表示しても問題ありませんが、

階層がもっと深かったり、オブジェクトのテキストをコピーしたい場合にはこのままでは望ましくありません。

そんな時は、object.toSource() という関数を使用するとコンソール上にオブジェクトが展開された形で表示されます。

var obj = {"Name":"John","Hobby":[{"Hobby1":"Tennis"},{"Hobby2":"Golf"}]};
console.log(obj.toSource());


ただし、この関数はGoogle Chromeでは使用できません。
Google Chromeで同様のことを行いたい場合は、JSON.stringify() という関数を使います。

var obj = {"Name":"John","Hobby":[{"Hobby1":"Tennis"},{"Hobby2":"Golf"}]};
console.log(JSON.stringify(obj));

参考:http://jtrancas.wordpress.com/2010/09/21/chrome-chromium-tosource-object-method/

Google Site でjavascriptを利用する

| コメントをどうぞ

Google apps の3 月 20 日付 計画的リリース用機能のアップデートでカスタム JavaScript と CSS が追加可能になったらしいのでさっそく試してみました。

参考:http://googleappsupdates-ja.blogspot.jp/2012/03/3-20.html

次の手順でGoogle Site 内でjavascriptやcssを追加することができます。

  1. Google Siteの編集画面を開きます
  2. 「挿入」から「HTMLボックス」を選択します
  3. 入力欄が表示されるので、ここにHTML、javascriptやCSSを入力し保存します

今回は、Googleのヘルプで提供されているサンプルを入力してみました。

Googleのヘルプ:http://support.google.com/sites/bin/answer.py?hl=ja&answer=2500646

  1. Siteを保存します。

以上の手順でSiteにjavascriptが仕込まれます。

3の時点では次の画像のようにHTMLボックスという表示で、実際に設定したjavascriptはロードされません。

4でSiteを保存後にjavascriptがロードされます。ロードされると次の画像のように表示されます。

中々便利な機能ですが、いくつか制限があるようです。

  1. iFrameは使用できない
  2. javascriptでscript,imageまたはlinkのタグを生成できない
  3. Document/windowのonload/onready functionは使用できない。(scriptは一番下に書けばdocumentがロードされた後にscriptが読まれる)

この制限を守れば、Google SiteでもjavascriptやCSSを利用できます。

Google DevelopersでAPIを試す「Try It!」

| コメントをどうぞ

最近Google +のAPIを調査する機会があり調べていたら、GoogleのAPIのドキュメントが「Google Developers」という名前になっていました。
変わったのは見た目だけかなーと思っていたら、ちょっと便利な機能もついていたのご紹介したいと思います。

Google plusのAPIドキュメントはこちら

今回はActivityの取得を調べていたのですが、ページの一番下に「Try It!」という欄があり、ここでAPIを試せるようになっていました。

とりあえず、userID欄にmeを使うにはOAuth2.0を有効にしないといけないらしいので、Onにしようと思います。ちなみにちゃんとユーザーIDを指定する場合はOAuth2.0は無効のままで大丈夫です。
OnにするとScopeの選択を迫られるので、そのままAuthorizeを押して進みます。

OAuth2.0が有効化されたら、後はクエリーのフィールドを埋めてExecuteで実行するだけです。

実行すると実行結果が下の方に出てきます。リクエストとレスポンスの詳細ですね。

レスポンスのJSONがどのような形で返って来るかを確認できるので、いちいちFireBugでコンソールに出力して中身を確認する手間などが省けて便利そうです。

ちなみに、OAuth2.0を利用する場合でもGoogle APIコンソールからGoogle plusのAPIを有効化しなくても利用できます。また、有効化されている場合でもそのアカウントのusage減らないので好きなだけ何回でも試せます。

今回はGoogle plusのAPIで試しましたが、他のGoogle APIのドキュメントもGoogle Developersになっているようで、同じようにTry Itが利用できるようになっています。

アメリカに行ってきました 〜Google編 前半〜

| 1件のフィードバック

初めまして

宮本と申します。現在はinfoScoop for Google Appsの開発をしています。今年の4月まではinfoScoop Cloud Enterpriseの開発もしていました。

これからinfoScoopの開発者としてちょくちょくブログを書いていこうと思います。宜しくお願いします。

アメリカに行ってきました

さっそく開発にはあまり関係ない話です。

11月6日〜12日の5日間で弊社Beacon ITが企画をしている海外IT動向研究会というイベントに同行させて頂き、アメリカのサンフランシスコに行ってきました。

その企画の中で、Googleさんの本社に行けるというなかなかめったにない機会がありました。

Googleの本社では、現地の営業の方(ローレンさん)にGoogleについての色々なことを紹介してもらいました。中でも印象に残った話を書いていこうと思います。

20% Time

ご存知の方も多いかもしれませんが、Googleの社員には20% Timeという自分の労働時間の20%の時間を使って、メインのプロジェクトとは別のプロジェクトを企画したり、自分のやりたい プロジェクトを探して参加したりする時間を設けなければいけないという規則のようなものがあります。プロジェクトの企画や参加は非公式に行われているそうで、募集なども勝手に掲示板などで募集をしてメンバーを集めたりしているそうです。

ちなみにGmailやGoogle Talkなどサービスはこの20% Timeから生まれたそうです。

うちの会社でもやらないかな〜とか少し思ったりもしたのですが、日本の企業では難しいのかなとも思いました。

Googleではうまくいっているのは、色々な要因があるとは思いますが、Googleの文化で「フラットな組織と、小規模なチームでプロジェクトを進める」というのが関係しているのではないかな〜と思います。それと非公式に行っているので、カッチリしたプロジェクトマネジメントではなく比較的カジュアルな感じでプロジェクトを進めているのも要因の1つかもしれません。

まぁこんな感じでGoogleさんはものすごいスピードで色々なサービスを生み出しているのですね。

ちなみに、80%のメインプロジェクトが火を噴いていたりしても20%の方はやるんですか?という質問をしたら、やっぱり80%を優先にして作業するそうです。ただ、Googleの社員はの大半は情熱を持っているので、120%で稼働することがほとんどとも言っていました。

結局プロジェクトを掛け持ちしているのとあまり変わらないような気がするのは気のせいですよね。

写真撮ってきました

施設内は基本的に写真を撮ってはダメと言われたのですが、外観などはOKとのことだったので何枚か撮ってきました。

Googleのオフィスの外観です。手前の像は誰だか分かりませがすごい人だと思います。

Googleには恐竜の骨もあります。元々はどっかの企業が使っていた施設をGoogleが買い取ったそうです。

ちょっと手前の柵でわかりずらくなっていますが、ビーチバレーコートです。社員は休憩時間にバレーを嗜みます。視察中もプレーしている人がいました。Google社員のジャンプ力はすごかったです。

今回はここまでにしておきます。