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