Scala+PlayでRDSの文字化けに対処したりスワップ作ったりElastic BeanstalkにNew Relicを追加してデプロイしたりするメモ


## はじめに

自分用備忘録なので箇条書き。

この辺↓のつづき。
[Scala+Play+SecureSocialでTwitterにログイン認証してユーザ名とアバターを表示するメモ](http://qiita.com/JunSuzukiJapan@github/items/ff0412617b0e99a6166f)
[[Scala]SecureSocialで取得したTwitterアクセストークンでタイムラインを取得するメモ[Play]](http://qiita.com/JunSuzukiJapan@github/items/777b337952375bd09002)
[[Scala]SecureSocialで取得したTwitterアクセストークンでタイムラインを取得するメモ[Play]](http://qiita.com/JunSuzukiJapan@github/items/777b337952375bd09002)
[Docker初心者がimageファイルを開発してみる[Mac]](http://qiita.com/JunSuzukiJapan@github/items/cdc34c621a94e28c2f22)
[[Scala]Elastic Beanstalk(Docker)でevolutionが自動実行されないとデプロイに失敗する件[Play]](http://qiita.com/JunSuzukiJapan@github/items/8d58e23be102b22fd5ef)
[VPCを超えて、Elastic BeanstalkのMySQLサーバーに接続するメモ](http://qiita.com/JunSuzukiJapan@github/items/b31d358606afd71aecd2)
[[Scala]SecureSocialで、すべてのビューを独自のビューで置き換えるメモ[Play]](http://qiita.com/JunSuzukiJapan@github/items/5dc6a50903f2f5c7e26c)


## RDS(MySQL)の文字化けに対処するためにしたこと

t1.microだとParameter Groupを後から変更できないので、
Elastic Beanstalk作成時にt1.micro以外のインスタンスを選択しておく。

### Parameter Groupの変更

>参考： [OSXでAWS Elastic BeanstalkにRailsアプリをデプロイした](http://qiita.com/saito400/items/0e31c384d2cbc3a2eada)

・新規にparameter groupを作成し、"character_set"で検索して以下の値をutf8に変更する。

character_set_database
character_set_client
character_set_connection
character_set_results
character_set_server

・skip-character-set-client-handshakeを1に変更
・該当インスタンスのparameter groupを作成したものに変更。


## Swap領域の確保

Elastic Beanstalkは .ebextensions ディレクトリに .config ファイルを含めておけば、初期設定をすることができる。
playアプリと同じディレクトリに.ebextensionsフォルダを作成し、フォルダ内にconfigファイルを置く。

>参考： [Elastic Beanstalk 環境カスタマイズメモ](http://qiita.com/kakipo/items/37cac238c1934f473960)

```text:.ebextensions/00_add_swap.config
commands:
  01_enable_sudo:
    command: "echo Defaults:root !requiretty >> /etc/sudoers"
    test: "test ! -e /home/ec2-user/swapdone"
  02_dd:
    command: "sudo dd if=/dev/zero of=/swapfile bs=1M count=1024"
    test: "test ! -e /home/ec2-user/swapdone"
  03_mkswap:
    command: "sudo mkswap /swapfile"
    test: "test ! -e /home/ec2-user/swapdone"
  04_swapon:
    command: "sudo swapon /swapfile"
    test: "test ! -e /home/ec2-user/swapdone"
  05_swapdone:
    command: "touch /home/ec2-user/swapdone"
    test: "test ! -e /home/ec2-user/swapdone"
```

## New Relicの設定とか

### DockerfileとDockerrun.aws.jsonファイルを用意しておく

```text:Dockerfile
FROM junsuzuki/java8
MAINTAINER Jun Suzuki

# Copy the app into the image.
ADD ./target /opt/playapp

# Start app
EXPOSE	   80
CMD /opt/playapp/universal/stage/bin/play221ss214snslogin -Dhttp.port=80  -J-javaagent:/opt/playapp/universal/newrelic/newrelic.jar
```

CMDのところでオプション ```-J-javaagent:/opt/playapp/universal/newrelic/newrelic.jar```を指定するのがミソ。


```text:Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": "1",
  "Ports" : [
      {
	  "ContainerPort": "2375"
      }
  ]
}
```

### New Relicにアプリケーションを登録

手順：
１．New Relicに登録する。
２．New Relicのサイトで新規でアプリケーションを作成する。
　　このとき、使用言語はJavaにする。
３．Javaを選択すると、作成したアプリケーション専用のzipファイルをダウンロードできるようになるのでダウンロードする。

>このzipファイルには設定済みのnewrelic.ymlが入っているので便利。
>自分でアプリケーションキーなどを設定する必要はない。

４．下記のように、ダウンロードしたzipファイルをplayのtarget/universalディレクトリに解凍する。
　　（```play clean compile stage```　を実行するたびに、解凍したファイルが消えるので毎回しなければならない。)
　　shellスクリプトでも書いておくのが吉。

```shell:
$ play clean compile stage
$ unzip -d target/universal/ newrelic-java-3.11.0.zip
$ zip -r app.zip Dockerfile Dockerrun.aws.json target/ .ebextensions/
```

>newrelicも一緒にzipに固めてしまう。
>.ebextensionsも固めておくことで初期設定が走る。

参考サイト：
https://docs.newrelic.com/docs/agents/java-agent/frameworks/play-installation-java#prod-mode