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





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

GrailsでSQLiteしたメモ

以下のサイトを参考にしてSQLite+Grailsとか試す。
Big Oh No: Groovy on Grails & Sqlite

ここ↓からhibernateのDialectを持ってきてビルド
http://code.google.com/p/hibernate-sqlite/

mvn eclipse:clean
mvn eclipse:eclipse

おっと。。。別にビルドしなくても、
srcディレクトリにある、SQLiteDialect.javaをそのままコピー。
src/main/java/dialect/SQLiteDialect.java

Grailsでの設定。

  • Grailsプロジェクト/grails-app/conf/BuildConfig.groovyを編集

repositoriesのmavenCentral()を有効にして、dependenciesにruntime 'org.xerial:sqlite-jdbc:3.6.17.1'を追加する。

    repositories {       
        grailsPlugins()
        grailsHome()
        mavenCentral() //これを有効にする
    }
    dependencies {
        runtime 'org.xerial:sqlite-jdbc:3.6.20' //これを追加
    }
  • データソースの設定。Grailsプロジェクト/grails-app/conf/DataSource.groovyを編集してSQLite用にする。
driverClassName = "org.sqlite.JDBC"
dialect = "dialect.SQLiteDialect"
url = "jdbc:sqlite:dev.sqlite3"

以上です。

意外と簡単。まあ、Grailsですから:-)


ちょっと、まったぁーー!これだけではつまらない!こんな簡単なメモでいいのか!



って事で。
何だか毎回SQLiteDialect.java持ってくるのもめんどうだなってことで、sqlite-dialectをローカルレポに入れる説明。・・・長くなるのでgithubに置いておきました。
githubに置いてあるので、http://github.com/tyama/sqlite-dialect 持ってくる。

git clone git@github.com:tyama/sqlite-dialect.git

そしてローカルにインストール

mvn install

これで今後はソースコードを持ってこなくても、Grailsプロジェクト/grails-app/conf/BuildConfig.groovyを以下の設定にして、

    repositories {       
        grailsPlugins()
        grailsHome()
        mavenLocal() //これを有効にする
        mavenCentral() //これを有効にする
    }
    dependencies {
        runtime 'org.xerial:sqlite-jdbc:3.6.20' //これを追加
        runtime 'sqlite-dialect:sqlite-dialect:1.0' //これを追加
    }
  • データソースの設定は、ちょっと事情があって変更で、
driverClassName = "org.sqlite.JDBC"
dialect = "org.hibernate.dialect.SQLiteDialect" // ここさっきとかえた。
url = "jdbc:sqlite:dev.sqlite3"

これで完了です。

ん、で、なんだか物足りないので、なんとなくGradleのビルドファイルも書いた。Gradle派な人専用。
おー、ステキ!

usePlugin 'java'
usePlugin 'maven'

group="sqlite-dialect"
artifactId="sqlite-dialect"
version="1.0"

dependencies {
  compile "org.hibernate:hibernate:3.2.6.ga"
  compile 'org.xerial:sqlite-jdbc:3.6.20'
}

これの実行は、

gradle install






なんでマッピングの設定のインデックスきかないんだろ?気のせいかな?
まあいいか・・・。
手動でコンソールから入ってインデックス作りました。 sqlite3 dev.sqlite3