Scala & Play2 学習ノート(3)

# Scala & Play2 学習ノート(3)

前回作った play2-hands-on をAWSで動かします。
Beanstalk 使った事なかったので Beanstalkで、DBもせっかくなのでRDSで作ります。

## AWS RDS を使用する

まず DB だけ AWS RDS で作成し、ローカルで RDS上のDBに繋いで動くようにします。

### RDS 作成

![3-create-rds.png](https://qiita-image-store.s3.amazonaws.com/0/246831/27145b36-2d49-bac8-d4c0-5332ffb9c388.png)
![3-config-rds.png](https://qiita-image-store.s3.amazonaws.com/0/246831/e36d745a-3864-7946-e601-fd0c0484e79f.png)


AWS コンソールに繋いで MariaDB を作ります。当然無料利用枠オプションON。
ローカルから繋ぎたいのでパブリックアクセシビリティだけ"はい" に変更し、インスタンス作成。


### DB作成

ハンズオンの h2 DBに含まれる create.sql を元に MariaDB用の DDL を作成し、テーブルと初期データを作成します。
MySQL使うのが久々すぎてヤバい。

```
create table COMPANIES (
    ID INT NOT NULL UNIQUE,
    NAME VARCHAR(256) NOT NULL
) engine=InnoDB;

create table USERS (
    ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    NAME VARCHAR(256) NOT NULL,
    COMPANY_ID INT,
    foreign key(COMPANY_ID) references COMPANIES(ID)
) engine=InnoDB;

insert into COMPANIES values (1, 'BizReach');
insert into COMPANIES values (2, 'Recruit');

insert into USERS(NAME, COMPANY_ID) values ('Taro Yamada', 1);
insert into USERS(NAME) values ('Jiro Sato');

```

### Play2アプリの接続先変更

build.sbt に MariaDB のドライバを追加。

```
libraryDependencies ++= Seq(
    ...
    "org.mariadb.jdbc" % "mariadb-java-client" % "2.2.5",
    ...
```

application.conf の使用ドライバと接続先を RDS上のDBに変更する。

```
db.default.driver=org.mariadb.jdbc.Driver
db.default.url="jdbc:mariadb://xxxx-db.cyjetzq1uaz9.ap-northeast-1.rds.amazonaws.com/play2_hands_on_db"
db.default.username=yossy6954
db.default.password=xxxx
```

これで動くかなと思ったのですが動かしてみるとDBアクセス時にエラーが出ました。
調べてみると生成されたモデルのソースにDB名が埋め込まれてしまっている模様。db.default.urlから引っ張るようにしてほしいよなあと思いながらここは直接指定する事にします。

```
object Users extends SQLSyntaxSupport[Users] {
  override val schemaName = Some("play2_hands_on_db")
```

```
object Companies extends SQLSyntaxSupport[Companies] {
  override val schemaName = Some("play2_hands_on_db")
```

## Play2アプリを Beanstalk にデプロイする

Beanstalk で Play2アプリを動かすには大きく分けて3つ。

* warを作ってTomcatにデプロイする方法
* Javaで直接動かす方法
* Dockerイメージを動かす方法

Dockerが楽ですがせっかくのPaaSなんだからパッケージをアップロードして動かしてみたいよね、という事で直接動かす方法を試してみます。

### Procfile を作成

アプリの起動方法を指示する Procfile を作成します。
Beanstalk では nginx のリバースプロキシが 5000番に張られるので 5000で起動させます。

```
web: sh bin/play2-hands-on -Dhttp.port=5000
```

### パッケージにProcfileを追加

build.sbt に以下を追加し、sbt dist で生成されるパッケージのzipに Procfile を追加します。

```
mappings in Universal += file("Procfile") -> "Procfile"
```

### application.conf にフィルタを追加

デフォルトの application.conf では接続元が指定されていない為ローカルホスト以外から繋ぐと拒否られます。どこからでも接続を受け入れるよう設定を追加します。

```
play.filters.hosts {
  allowed = ["."]
}
```

### Beanstalk環境の作成

いよいよ Beanstalk環境を作成し、アプリをデプロイします。
Elastic Beanstalkのコンソールを開いて新しいアプリケーションを作成します。

![3-create-app.png](https://qiita-image-store.s3.amazonaws.com/0/246831/a71ba0d3-6a81-e8d2-7752-1bc8cca24416.png)
![3-create-web.png](https://qiita-image-store.s3.amazonaws.com/0/246831/0bc5dc43-9d65-f3da-176e-6b8732a7b128.png)
![3-base-config.png](https://qiita-image-store.s3.amazonaws.com/0/246831/1de127d9-65b6-6d60-950e-671c4bbae65d.png)

環境枠はウェブサーバー環境、プラットフォームは Java を選択し、アプリケーションコードを開いて sbt distで作成したzipをアップロードしておきます。

![3-more-option.png](https://qiita-image-store.s3.amazonaws.com/0/246831/5f93c93a-c236-ac1d-c4d8-ff976a4a1d3b.png)
![3-config-vpc.png](https://qiita-image-store.s3.amazonaws.com/0/246831/a3edf435-6c1b-6f4d-3e28-8c6f6032395e.png)


また、なぜかBeanstalkはデフォルトでVPC外にできてしまうみたいなので「さらにオプションを設定」からネットワーク設定を開き、VPCを選択しておきます。(この手順を省くとVPCと非VPC間ではセキュリティグループによる接続の許可が設定できないようでハマります)
そして、RDSのセキュリティグループ設定を変更し、インバウンドルールの追加でBeanstalkのセキュリティグループからの接続を受け入れるようにすれば BeanstalkからRDSに接続できるようになります。

これで動きます。お疲れ様でした。