ec2のmicroインスタンスでPlay!2.1.1を動かす。

play frameworkに関するのslideshare(Play2.0+Javaでサービスを本番稼働させた話 #play_ja)を見ててそうそうと自分もハマった部分があったので、自分なりの解決策を。

問題

Amazon EC2 microでPlay!2.0が起動しない。
java -­‐Xms512M -­‐Xmx1536M
でPlay!2.0はデフォルト起動される      
  • --Xms512M:初期ヒープサイズを512Mに設定
  • --Xmx1536M:最大ヒープサイズを1536Mに設定
  • microインスタンスのメモリは613 Mでswapがない

解決策

cloud-initのYAMLをgistに書いてみました。

ec2のマイクロインスタンスでplayを動かす準備 ・時間の設定 ・文字コードの設定 ・swap領域の作成

cloud-initを利用して、インスタンス立ち上げ時にswapを作るという方法です。

swapの作成方法はAdding swap to an EC2 micro instance on Amazonを参考にしました。

いつものスポットインスタンスの起動スクリプトに組み込んで使ってます。

#!/bin/bash

AMI='ami-xxxxxxxx';
INSTANCE_TYPE='t1.micro';
PRICE='.003';
SUBNET='subnet-xxxxxxxx';
KEYPAIR='xxxxxxxxxx';
SECURITYGROUP='sg-xxxxxxxx';
DATA='#cloud-config
repo_upgrade: all
packages:
  - java-devel
  - git

runcmd:
  - [cp, /usr/share/zoneinfo/Asia/Tokyo, /etc/localtime]
  - [sed, -i, 's/LANG="en_US.UTF-8"/LANG="ja_JP.UTF-8"/', /etc/sysconfig/i18n]
  - [dd, if=/dev/zero, of=/var/swapfile, bs=1M, count=1024]
  - [mkswap, /var/swapfile]
  - [swapon, /var/swapfile]
';

#スポットインスタンスのリクエストを行う
SIR_ID=` ec2rsi $AMI -t $INSTANCE_TYPE -p $PRICE -n 1 -r one-time -s $SUBNET -k $KEYPAIR -g $SECURITYGROUP -d "$DATA" | awk '{if(NR==1) print $2;}' `

#2分間待機
sleep 120

TMP_EC2='';
while true; do
  #ec2のインスタンス情報取得(スポットインスタンスのIDを指定)
  TMP_EC2=`ec2din --filter "spot-instance-request-id=$SIR_ID"`;

  if test ${#TMP_EC2} -gt 0 ; then
    #情報が取得できた場合

    #インスタンス情報、ローカルIPの情報を取得する
    INSTANCE_ID=`echo $TMP_EC2 | awk '{ print $5 }'`;
    LOCAL_IP=`echo $TMP_EC2 | awk '{ print $52 }'`;

    #ループを抜ける
    break
  fi

  #30秒待機
  sleep 30
done

#IPアドレスを取得する
EIP_OBJ=`ec2allocaddr -d vpc`;
EIPALLOC=`echo $EIP_OBJ | awk '{ print $4 }'`
GLOBAL_IP=`echo $EIP_OBJ | awk '{ print $2 }'`

sleep 10

#IPアドレスをec2インスタンスに割り当てる
EIPASSOC_OBJ=`ec2assocaddr -a $EIPALLOC  -i $INSTANCE_ID -p $LOCAL_IP `

sleep 10

EIPASSOC=`echo $EIPASSOC_OBJ | awk '{ print $4}'`

#結果出力
echo "[info]instance_id: $INSTANCE_ID";
echo "[info]globalId: $GLOBAL_IP";
echo "[info]eipassoc: $EIPASSOC";
echo "[info]eipalloc: $EIPALLOC";
echo "[example] ssh -i ${KEYPAIR}.pem ec2-user@${GLOBAL_IP} ";
echo "[example] ec2disaddr -a $EIPASSOC ; ec2reladdr -a $EIPALLOC ; ec2kill $INSTANCE_ID ; "

なんだかんだいって、microインスタンスとsmallインスタンスには価格的な大きな壁があるので、 play framework2もmicroで使いたいです。 24h365d動かすならawsは少し高い気がしますが、実験はawsが手っ取り早いです。