なんか最近Elastic Beanstalkというのがあるそうで、ブラウザからボタンをぽちぽち(だけじゃないけど)押して行くだけでWarがデプロイできちゃったりいろいろ出来るらしい。
EBでの設定を元に、結局裏側ではEC2やらRDSが立ち上がってくれるので、まあ便利機能とでも思えば良いのかしら。
ってことで、タイトル通りAWS Elastic Beanstalkを使ってMySQLを利用したPlayを動かしてみた。
AWS Elastic Beanstalk 編
1.Key Pairsの作成
Elastic Beanstalk(以下EB)を始める前に、EC2でKey Pairsを作成しておくやりかたはノリですよね。
EC2 > KeyPairs > Create Key Pairs
勝手にダウンロードされる「*.pem」ファイルを、Macの~ディレクトリに配置。
ついでに、権限を600に変更しておく。
ログインする。
特にないけど、まあリージョンを「TOKYO」にするくらい。
「Create a New Application」を押下。
「Application Infomation」で、「Application name:」を記入。
ここでは「omiend-play-crud」とする。
「Create」ボタン押下。
「Environment Type」で、下記をそれぞれ選択。
「Continue」ボタン押下。
※ロードバランサー使う時は「Environment type」で「Load balancing, autoscaling」を選択すればいいと思うけど、ここではやらなーい。
「Environment Information」で、「Environment name:」にアプリケーション固有の名前を入力する。
「Continue」ボタン押下。
※「Environment URL:」に記載されるURLで、他に同じ物が無いか「Check availability」ボタンで確認するのをお忘れなく。
※ここでは「omiend-play-crud-java」とする。普段テストで使っているのでナメしちゃだめよん。
「Additional Resources」で、今回RDSを使うので、「Create an RDS DB Instance with this environment」を選択。
「Continue」ボタン押下。
「Configuration Details」で、下記の様に選択。これはEC2の設定かな。
※「EC2 key pair」は初めに作ったKeyPairsを選択する。
「RDS Configuration」で、下記の様に選択。
「Revew」画面で確認して「Create」ボタンで完了!
こんな感じになればOK。
EC2のコンソールを見てみると、インスタンスが立ち上がっているのが分かる。
同じく、RDSのコンソールを見てみると、インスタンスが立ち上がっている。
EC2 > Security Group > Inbound
試しに、EBから作成したEC2とRDSインスタンスにログインしてみる。
terminalを起動して下記のようにEC2へログイン。
-iに指定するファイルは、「1.Key Pairsの作成」でダウンロードしたファイル。
ユーザーはec2-userを指定。
ドメインはEC2インスタンスで参照する「Public IP」を指定。
RDSへのログイン
次に、RDSへのログイン。
僕は普段Sequel Proというクライアントを使っているのでこれで説明。
まあ、下記の様な感じに。
繋がったら、WebアプリのDBやらTableやらを設定しておく。
勝手にダウンロードされる「*.pem」ファイルを、Macの~ディレクトリに配置。
ついでに、権限を600に変更しておく。
$ ls -al
-rw-r--r--@ 1 omiend staff 1696 1 13 15:49 omiend_play_crud.pem
$ chmod 600 omiend_play_crud.pem
$
2.EBでアプリケーションを作成
とりあえず空のアプリを作成する。Warはまだデプロイしない。ログインする。
特にないけど、まあリージョンを「TOKYO」にするくらい。
「Create a New Application」を押下。
ここでは「omiend-play-crud」とする。
「Create」ボタン押下。
「Environment Type」で、下記をそれぞれ選択。
「Continue」ボタン押下。
※ロードバランサー使う時は「Environment type」で「Load balancing, autoscaling」を選択すればいいと思うけど、ここではやらなーい。
- Environment tier: Web Server
- Predefined configuration: Tomcat
- Environment type: Single instance
※ここでWarをアップロードするんだけど、DBの設定とかあるので一回スキップ。
- Source: Sample application
「Environment Information」で、「Environment name:」にアプリケーション固有の名前を入力する。
「Continue」ボタン押下。
※「Environment URL:」に記載されるURLで、他に同じ物が無いか「Check availability」ボタンで確認するのをお忘れなく。
※ここでは「omiend-play-crud-java」とする。普段テストで使っているのでナメしちゃだめよん。
「Additional Resources」で、今回RDSを使うので、「Create an RDS DB Instance with this environment」を選択。
「Continue」ボタン押下。
「Configuration Details」で、下記の様に選択。これはEC2の設定かな。
※「EC2 key pair」は初めに作ったKeyPairsを選択する。
- Instance type: t1.micro
- EC2 key pair: {1.Key Pairsの作成}
「RDS Configuration」で、下記の様に選択。
- DB engine: mysql
- Instance class: db.t1.micro
- Allocated storage: 5 GB(最小値)
- Username: 好きなユーザー名
- Password: 好きなパスワード
「Revew」画面で確認して「Create」ボタンで完了!
すると、下記の様な画面が表示されるので、くるくる回っている矢印が緑色になるまで待つ(5分くらい?)
こんな感じになればOK。
EC2のコンソールを見てみると、インスタンスが立ち上がっているのが分かる。
同じく、RDSのコンソールを見てみると、インスタンスが立ち上がっている。
3.MySQLのポート解放
EC2からRDSのMySQLを利用するために、下記のようにポート解放を行う。EC2 > Security Group > Inbound
4.試しにログイン
EC2へのSSHログイン試しに、EBから作成したEC2とRDSインスタンスにログインしてみる。
terminalを起動して下記のようにEC2へログイン。
-iに指定するファイルは、「1.Key Pairsの作成」でダウンロードしたファイル。
ユーザーはec2-userを指定。
ドメインはEC2インスタンスで参照する「Public IP」を指定。
$ cd ~
$ ssh -i ~/omiend_play_crud.pem ec2-user@54.248.137.158
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/
RDSへのログイン
次に、RDSへのログイン。
僕は普段Sequel Proというクライアントを使っているのでこれで説明。
まあ、下記の様な感じに。
繋がったら、WebアプリのDBやらTableやらを設定しておく。
- 名前:任意
- MySQLホスト:RDSのインスタンスで参照出来るエンドポイントを指定
- ユーザ名:RDSのユーザー名
- パスワード:RDSのパスワード
- データベース:任意
- ポート:ブランク(3306)
- SSHホスト:EC2のPublic IPを指定
- SSHユーザ:ec2-userを指定
- SSH 鍵:「1.Key Pairsの作成」でダウンロードしたファイルを指定
- SSH ポート:ブランク
Playframwork 編
1.PlayframworkのWebアプリの用意
Play2.0とMySQLを使ったCRUDが実装されているWebアプリを作っておく。まあ、DB機能さえ使えれば良いと思うんだけどね。
2.AWS(EC2+RDS)を使う為に、色々設定する
conf/application.conf
# Database configuration※Evolutionsの設定は切る。
# ~~~~~
# You can declare as many datasources as you want.
# By convention, the default datasource is named `default`
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://RDSのエンドポイント:3306/データベース名"
db.default.user=RDSのユーザー名
db.default.password="RDSのパスワード"
# Evolutions
# ~~~~~
# You can disable evolutions if needed
evolutionplugin=disabled
project/build.properties
sbt.version=0.13.0※sbtのバージョンは0.13.0を使用
project/Build.scala
import sbt._
import Keys._
import play.Project._
import com.github.play2war.plugin._
object ApplicationBuild extends Build {
val appName = "crud_java"
val appVersion = "1.0-SNAPSHOT"
val appDependencies = Seq(
// Add your project dependencies here,
"mysql" % "mysql-connector-java" % "5.1.20",
javaCore,
javaJdbc,
javaEbean
)
val main = play.Project(appName, appVersion, appDependencies)
.settings(Play2WarPlugin.play2WarSettings: _*)
.settings(
// Add your own project settings here
Play2WarKeys.servletVersion := "3.0"
)
}
// Comment to get more information during initialization
logLevel := Level.Warn
// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
// Use the Play sbt plugin for Play projects
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1")
// Play war
addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "1.2-beta2")
3.PlayfraworkプロジェクトのWarを作成する
Build.scalaの
import com.github.play2war.plugin._
・・・
val main = play.Project(appName, appVersion, appDependencies)
.settings(Play2WarPlugin.play2WarSettings: _*)
.settings(
// Add your own project settings here
Play2WarKeys.servletVersion := "3.0"
)
と、plugins.sbtの
// Play war
addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "1.2-beta2")
は、PlayのプロジェクトからWarファイルを作成するためにプラグイン設定。
Warを作成するには下記コマンドを実行する。
$ play war
すると、target/にwarファイルが作成される。
デプロイ編
1.デプロイ
EBの「Running Version」の「Upload and Deploy」から、先ほど作成したwarファイルを選択する。
2.待つ!
EBでまたくるくる矢印が回るので、同じくグリーンになったらOK。
グリーンのちょっと上のURLにアクセスすると、アプリにアクセス出来る。
3.画面が真っ白になってアプリが見れないよ?
以下の事に注意
- Security Groupでポート解放しているか?(MySQL:3306の解放が必要)
- conf/application.confの設定が間違っていないか?
- create database 〜 を忘れていないか?
- Evolutionsが有効になっていないか?(これは有効にしていても大丈夫かも?)
とまあ、ざーっくりだけどこれで一応出来た。
ダブルバイト文字使うと文字化けしちゃったりDBにアクセス出来なかったりするので解決しようと思ったけど、RDS特有の問題(ってかMySQL使う時に良く有る問題を解決する為に、RDSで設定する必要があるだけ)だから、一旦放置。
これでやっとアプリ開発に専念出来る気がする。
今作っているやつの実際の運用はherokuを使うだろうから、ここで書いたのは本当に勉強だけかもめ〜。