the industrial

都内で働くITエンジニアの日記

AWS Elastic Beanstalkを使ってMySQLを利用したPlayframwork2.0を動かす

Playframworkと(以下Play)言えば、herokuで動かすのが一般的と思っているんだけど、会社が「\AWS!/\AWS!/\AWS!/」っと言っているので、お勉強がてらPlay2.0をAWSで動かしてみようかと。

なんか最近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に変更しておく。

$ 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」を押下。




「Application Infomation」で、「Application name:」を記入。
ここでは「omiend-play-crud」とする。
「Create」ボタン押下。




「Environment Type」で、下記をそれぞれ選択。
「Continue」ボタン押下。
ロードバランサー使う時は「Environment type」で「Load balancing, autoscaling」を選択すればいいと思うけど、ここではやらなーい。

  • Environment tier: Web Server
  • Predefined configuration: Tomcat
  • Environment type: Single instance




「Application Version」で、とりあえず「Sample application」を選択。
「Continue」ボタン押下。
※ここで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分くらい?)




元気なtomcatちゃん。(関係ない




こんな感じになれば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 編

1PlayframworkのWebアプリの用意

Play2.0とMySQLを使ったCRUDが実装されているWebアプリを作っておく。
まあ、DB機能さえ使えれば良いと思うんだけどね。



2AWS(EC2+RDS)を使う為に、色々設定する


conf/application.conf
# Database configuration
# ~~~~~
# 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
※Evolutionsの設定は切る。



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"
  )
}



project/plugins.sbt
// 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を使うだろうから、ここで書いたのは本当に勉強だけかもめ〜。