Hatena::ブログ(Diary)

leftovers... このページをアンテナに追加 RSSフィード

2010-03-07

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



準備するもの

では開始!

デプロイしたい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




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インスタンスを起動するので柔軟だがそれなりにコストがかかる。





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

2010-03-06

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での問題。

情報ソース多分=>

no title

no title

ここは、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.