Scala+PlayでAmazon Elastic Beanstalkの開発

# 概要

今回は、ScalaとPlay2 Frameworkを使って、
Amazon Elastic BeanstalkにWebアプリをデプロイするお話。

まず、ScalaとPlay2はインストールされていることを前提とします。
それぞれのVersionは、
　・Scala 2.10
　・Play 2.1.1
を使用しています。

Amazon Elastic BeanstalkにScala+Play2でWebアプリをアップロードするには
.warファイルを作成する必要があります。（他の方法もあるのかもしれませんが
わかりません。）

Play２フレームワークで作成したWebアプリをwarファイルにするのに、
ここでは[play2-war-plugin](https://github.com/dlecan/play2-war-plugin)を使います。

# アプリの作成

では、その使用方法です。

まずはじめに、普通にPlayアプリケーションを作成します。
今回は、Helloを表示するだけのシンプルなアプリを作ります。

```bash
$ play new hello
```

上記のコマンドをシェル上で実行すると、アプリ名や言語（ScalaあるいはJava）を
聞かれますが適当に入力します。

例：

```bash
       _            _
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/

play! 2.1.1 (using Java 1.6.0_45 and Scala 2.10.0), http://www.playframework.org

The new application will be created in /Users/randy/Documents/Homepage/hello

What is the application name? [hello]
> 

Which template do you want to use for this new application? 

  1             - Create a simple Scala application
  2             - Create a simple Java application

> 1
OK, application hello is created.

Have fun!

```

次に作成したアプリのディレクトリに移動しておきましょう。

```bash
$ cd hello
```

# play2-war-pluginの設定

play2-war-pluginの設定のためにエディタで、
project/plugins.sbtとproject/Build.scalaに修正を加えます。

```scala: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("play" % "sbt-plugin" % "2.1.1")

addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "0.9")
```

```scala:Build.scala
import sbt._
import Keys._
import play.Project._
import com.github.play2war.plugin._

object ApplicationBuild extends Build {

  val appName         = "hello"
  val appVersion      = "1.0"

  val appDependencies = Seq(
    // Add your project dependencies here,                                              
    jdbc,
    anorm
  )

  val main = play.Project(appName, appVersion, appDependencies)
    .settings(Play2WarPlugin.play2WarSettings: _*)
    .settings(
      // Add your own project settings here                                             
      Play2WarKeys.servletVersion := "3.0"
  )
}
```

ここまで出来たら、きちんと設定ができているか確認しておきます。

```bash
$ play run
```

ブラウザから 、[localhost:9000](http://localhost:9000/)　にアクセスしていつものPlay2の初期画面が
表示されれば成功です。
一旦、Ctrl+Dでplayを終了しておきます。

# HTMLの記述

トップ画面を変更しておきましょう。
トップ画面のビューはapp/views/index.scala.htmlになります。

```html:app/views/index.scala.html
@(message: String)

@main("Welcome to Play 2.1") {

  <h1>Hello!</h1>

}

```

変更をくわえたら、再び

```bash
$ play run
```

で、、[localhost:9000](http://localhost:9000/)　にアクセスしてうまく変更されていることを
確認しておきます。

# warファイルの作成

では、これをwarファイルにします。play2-war-pluginの設定は終わっていますので
シェル上で

```bash
$ play war
```

とするだけで、targetディレクトリにwarファイルが作成されます。
（warファイル名には、project/Build.scalaで設定したappName、appVersionが
使われます。）
あとはこのwarファイルをAmazon Elastic Beanstalkにアップロードするだけで
アプリが動作します。

# Amazon Elastic Beanstalk へアップロード

実際にやってみましょう。

ブラウザで、AWSのホームに接続したら、Elastic Beanstalkを選択します。
右上のほうにある「Create New Application」をクリック。

![スクリーンショット 0025-05-28 9.55.33.png](https://qiita-image-store.s3.amazonaws.com/0/20722/74c8ae79-0d76-329a-2275-d9bc6049caca.png)
Application Nameに（他の人のアプリと被らないような）適当な名前を入力して
Container Typeは、Tomcat7（６４bitあるいは３２bit）を選びます。
Application Sourceは、「Upload your Existing Application」にチェックをいれ
さきほど作成したwarファイルを選択して、"Continue"をクリック。

次に進みましたね。
![スクリーンショット 0025-05-28 9.58.30.png](https://qiita-image-store.s3.amazonaws.com/0/20722/553dd07e-1db3-9f1b-eb46-71f4c0ec2c60.png)
Create an RDS DB Instance with this environmentは今回はDBを使わないので
チェックをはずしておきます。
Environment Nameは（他の人のアプリと被らない）適当な名前を入力します。
"Continue"をクリック。

次に、Instance Typeなどを選ぶウインドウが開きますが、
特に変更するところはないので、"Continue"をクリック。

次のウインドウが開きます。ここが最終確認になりますが、
今回はこのまま"Finish"をクリック。

数分（５〜１０分くらい？）待つとアプリケーションが起動します。
（アプリ名）　Environments
の下にあるEnvironment Detailsをクリックすると詳細がみれます。
Overviewタブのなかの「URL: 」欄にあるURLをクリックすると
起動したアプリに飛べます。

以上


## 補足
play2-war-pluginサイトの説明ではproject/Build.scalaの内容が

```scala:project/Build.scala
val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA)
  .settings(Play2WarPlugin.play2WarSettings: _*)
  .settings(
    // ... Your own settings here
    Play2WarKeys.servletVersion := "3.0"
)

```

になっているが、PlayProject(...)は古いバージョンの書き方なので、
この記事では

```scala:project/Build.scala
  val main = play.Project(appName, appVersion, appDependencies)
    .settings(Play2WarPlugin.play2WarSettings: _*)
    .settings(
      // Add your own project settings here                                             
      Play2WarKeys.servletVersion := "3.0"
  )
```

と、play.Project(...)を使用しています。