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での設定。
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' //これを追加
}
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