leftovers...

about grails groovy

Cloudtoolsを使ってEC2インスタンスを起動してwarをデプロイする.Maven編

Cloudtoolsを使ってEC2インスタンスを起動してwarをデプロイする。

今回は、CloudtoolsのMavenプラグインでWebアプリケーションをEC2にデプロイする方法です。
Cloudtoolsとは、前のポストでも説明していますが。
CloudToolsプラグインでAmazon EC2 - leftovers...
Chris Richardson氏(POJOs in Actionの著者さん)が開発した、
EC2にJEEアプリケーションを簡単にデプロイするためのGroovyベースのフレームワークEC2Deploy使用したツール群です。現在MavenプラグインGrailsプラグインがあります。AMIはCloudtools専用?のものが用意されています。

http://code.google.com/p/cloudtools
http://www.cloudfoundry.com/cloudtools.html



準備するもの

  • 適当なディレクトリとその中にpom.xml
  • どれだけ使っても自己責任なAWSのアカウント(実行すると課金されます!)
  • AWSアカウントの設定などをしたプロパティファイル。aws.properties
  • デプロイしたいwarを準備
  • もちろんMavenがインストールされていること。

では開始!

デプロイしたいwarをS3にアップロード
S3にフォルダというかバケットを作成してその中にアップロード


aws.propertiesの設定
imageId.m1.small、imageId.m1.large、imageId.m1.xlargeは以下と同じように設定。
accountId、accessKey、secretKey、keyName、keyPairFile、sshDirを設定

imageId.m1.small=ami-6f2cc906
imageId.m1.large=ami-0129cc68
imageId.m1.xlarge=ami-0129cc68
accountId=0000-0000-0000な感じのAWSのID
accessKey=あなたのアクセスキー
secretKey=あなたのシークレットキー
keyName=キー名称キーペアの名前
keyPairFile=/Path/to/your/mykeypair.pem キーペアファイルへのパス
sshDir=/usr/bin sshのあるディレクト

pom.xmlの設定

<project>  <modelVersion>4.0.0</modelVersion>
  <groupId>ec2deploy</groupId>
  <artifactId>standalone-deployment</artifactId>
  <version>1.0</version>

  <repositories>
    <repository>
      <id>pia-repository</id>
      <url>http://www.pojosinaction.com/repository</url>;
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>pia-repository</id>
      <url>http://www.pojosinaction.com/repository</url>;
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </pluginRepository>
  </pluginRepositories>

  <properties>
    <aws.properties>ここにaws.propertiesのパスを入れる</aws.properties>
    <s3.war>s3://保存先バケット名/myapp.war</s3.war>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>net.chrisrichardson</groupId>
        <artifactId>cloudtools-maven-plugin</artifactId>
        <configuration>
          <awsPropertiesFile>${aws.properties}</awsPropertiesFile>
          <schemaName>myschema</schemaName>
          <schemaUsers>
            <param>user1:user1</param>
          </schemaUsers>
          <warDirectory>${s3.war}</warDirectory>
          <!-- warの名前 -->
          <warName>myapp</warName>
          <numberOfMySqlSlaves>0</numberOfMySqlSlaves>
          <numberOfTomcats>1</numberOfTomcats>
          <topology>SingleInstanceTopology</topology>
          <catalinaOptsBuilder>
            <![CDATA[
              {builder, databasePrivateDnsName, slaves ->
                  builder.arg("-server")
                  builder.arg("-Xmx1000m")
                  builder.arg("-Xms1000m")
                  builder.prop("jdbc.db.server", databasePrivateDnsName)
              }
            ]]>
          </catalinaOptsBuilder>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

ここまで設定がおわったら後は、コマンド実行

mvn cloudtools:deploy

インスタンスが起動します。もちろん時間かかります。そして課金が始まります。
起動が終了したら。ブラウザで動作確認。サーバアドレスはcloudtools:describeで情報をみるかAWSの管理コンソールで確認しましょう!

mvn cloudtools:describe


インスタンス停止方法

mvn cloudtools:stop

Maven Goalは、
http://code.google.com/p/cloudtools/wiki/UsingTheCloudToolsMavenPlugin

  • cloudtools:deploy - デプロイ
  • cloudtools:stop - 停止
  • cloudtools:redeploy - 再デプロイ
  • cloudtools:jmeter - jmeterロードテスト
  • cloudtools:dbsave - cloudtools.s3.pathに定義したS3のパスにDBスナップショットを保存
  • cloudtools:dbrestore - cloudtools.s3.pathに定義したS3のパスからDBスナップショットをDBに例ストア
  • cloudtools:clone - cloudtools.new.cluster.nameに定義した内容でクラスタをコピー
  • cloudtools:describe - 情報を見る
  • cloudtools:list - 使用可能なクラスタリスト表示


EBS(Elastic Block Store)対応
http://code.google.com/p/cloudtools/wiki/UsingEBS
cloudtools:deployで新規デプロイの際に以下のオプション新規EBSも一緒に作成。
以下の例では、デバイス(cloudtools.ebs.device)が/dev/sdj で、サイズ(cloudtools.ebs.volume.size)10GB。

-Dcloudtools.ebs.device=/dev/sdj -Dcloudtools.ebs.volume.size=10

起動中EC2インスタンスMySQLデータを新規のEBSを作成して移動する事もできます。
以下の例だと2GBのEBSを新規に作成。

mvn cloudtools:enableebs -Dcloudtools.ebs.device=/dev/sdh -Dcloudtools.ebs.volume.size=2


トポロジー
pom.xmlの途中に設定できます。現在は2個だけっぽい。

<topology>SingleInstanceTopology</topology>

SingleInstanceTopology
シングルインスタンス上に、Apache,Tomcat,MySQLマスターを起動。0個以上のMySQLスレーブも同じインスタンスに起動可能。シングルTomcatインスタンス限定の一番安価な方法。
MultipleInstancesTopology
Apache,Tomcat,MySQLマスターMySQLスレーブをそれぞれのEC2インスタンスで起動。複数のEC2インスタンスを起動するので柔軟だがそれなりにコストがかかる。





簡単にサーバ構築とデプロイができ、そして課金されてしまう!おそろしい世の中です。

CloudToolsプラグインでAmazon EC2

新しめのGrailsでCloudToolsプラグインを使ってAmazon EC2にデプロイをしてみた。
Cloud Toolsって何?
SpringSource Cloud Foundryの元になっているツールです。CloudToolsには、MavenプラグインGrailsプラグインがあるのです。
http://code.google.com/p/cloudtools/
http://www.cloudfoundry.com/cloudtools.html

Mavenプラグインを使うと mvn cloudtools:deploy を実行するだけで、
指定した数のAmazon EC2インスタンスを起動。
MySQLのマスタDBを設定。
MySQLのスレーブを設定。
WebアプリケーションをEC2にアップロード。
1つまたは複数のTomcatを定義してWebアプリケーションをデプロイ。
ロードバランス用のApacheを定義して起動。
などなど、他にもいろいろできます。 もちろん、Grailsプラグインでも同じ事ができます。(一部除く)

grails prod cloud-tools-deploy

grails-1.2.1 + cloud-tools-0.6 => ダメ!
grails-1.1.1 + cloud-tools-0.6 => これもダメなの! 但し何故か一回だけOKだった。
公式!?のリポジトリにある最新版は実際には0.7でec2deployer-1.2-SNAPSHOT.jar
ちなみにcloud-tools-0.7+grails-1.1.1は試してない。
気合いいれて、動くように修正しようと、リポジトリからcheckout。
少しずつ問題が見えてくる。
grails-1.2.1での問題点はXmlParser系がおかしい。
これは、groovy-1.6.7での問題。
(情報ソース多分=>
http://jira.codehaus.org/browse/GRAILS-5670
http://jira.codehaus.org/browse/GROOVY-4010
ここは、ExpandoMetaClassでと、強引な修正を試みたがキリがない・・・。最初はサクサク進んだが後半になると実際のサーバが起動してしまうのにエラーで止まるため、無駄なコストかかるのでやめ(サーバ起動する度にお金かかるね)

いろいろあきらめてgrails-1.2.2を待つことに・・・。いいや!それならばGrails-1.3.0.SNAPSHOT!
grails 1.3.0.SNAPSHOTで試す。
1st try そのまま動かす!ダメ!
2nd try スクリプト修正しいて動かす!NO!


プラグイン関連に仕様変更に気付く。

setDefaultTarget('default')

デフォルトターゲット
スクリプトにこれ書いてないとGrailsスクリプトは何も動かずとまる。
追記して
3rd TRY 動きましたとさ。

ぁぁ、ちなみに、修正した内容の一部。
cloud-tools-0.6 => pluginHome = new File("./plugins").listFiles().find { it.name.startsWith('cloud-tools-')}
0.6は1.0.x用なのでこれでも動いたっぽい。
cloud-tools-0.7 => pluginHome = new File( grailsSettings.projectPluginsDir.path ).listFiles().find { it.name.startsWith('cloud-tools-') }
0.7から1.1.x系用に修正されて、上記のようになった。
これでも動くのだが。pluginHomeを探すときは、1.0.x系からずっと以下のように書いてます。
pluginHome = cloudToolsPluginDir
プラグイン名を最初が小文字のキャメルケースでサフィックスにPluginDir。この仕様もいつまで存在するかわかりませんが自分はこれを採用しています。


今回の内容のパッチとか、Grails Cloud Toolsプラグインの使い方はまた今度書きます。(使ってるGrails自体がSNAPSHOTだし・・。)
Grails-1.0.X系であれば公式なドキュメントの内容で動作するはずです。
Google Code Archive - Long-term storage for Google Code Project Hosting.