Rails on AWS OpsWorks

## What is OpsWorks?
- OpsWorksを用いると、短時間で手軽にアプリケーションを動かす環境一式を自動構築することができ、要件に応じて柔軟に構成を変更できる
     - プラットフォームの自動構築：ブラウザからポチポチするだけ
     - アプリケーションの簡単デプロイ：ブラウザからボタン一発


## 特徴
- Chefというツールを内部で利用して環境構築やアプリケーションのデプロイを自動化していること
     - Chefによる自動構築を行うためには、まずChefが動作する環境を構築する必要がある
     - OpsWorksではEC2インスタンスを作成してChefを動かす環境を構築し、必要なChefレシピを実行するまでの処理を全て自動で行ってくれる
     - 利用者はChefの実行環境構築に関して特に意識することなくChefの恩恵を受けることができる


## Rails on AWS OpsWorks
### Stackの構築
- Stackはアプリケーションのプラットフォーム全体

#### 設定
- 設定は、基本的にデフォルトでOK


#### ハマリポイント
- Custom JSONに、secret.ymlのsecret_key_baseをJSONで指定


```
{
  "hogexhoge_data": {
    "hogexhoge": {
      "SECRET_KEY_BASE": “xxxxx"
    }
  }
}

```


### Layersの構築
- Layerは、Railsアプリケーションや、Node.jsなどのアプリケーションのホスティング


#### 設定
- Rails App Serverを選択し、適切なruby versionを選択

#### ハマリポイント
- Gemfileのruby versionの指定は削除しておく
- .ruby-versionはあっても問題ない
- OS Packegeに、db用のパッケージを追加
     - sqlite3なら、sqlite-devel
     - mysqlなら、mysql-devel

### Instancesの構築
- Instanceは、EC2のインスタンス
     - ここでインスタンスを立ち上げると、EC2の一覧にも表示される

#### 設定
- 基本的にデフォルトでOK


#### Instanceの起動
- smallなら、起動に十数分かかる
     - microは、さらにかかるのでsmall以上がよいかと
- Global IPが割り当てられるので、Route 53からルーティング設定


### Appsの構築
#### 設定
- デプロイするアプリケーションを指定する
- ソースコードは、リポジトリ管理されていることが前提
     - Gitリポジトリを設定
          - URLは、git@bitbucket.org:jwako/hogexhoge.git など
          - SSH Keyは、ssh-keygenで鍵を生成し、そのprivate keyを貼り付ける. public keyをBitbucketに登録
     
### Deployments
#### 設定
- Appを選択して、デプロイ
     - Migrate database：Yes
     - Custom Chef JSONは以下を指定


```
{
  "deploy": {
    "hogexhoge": {
      "database": {
        "adapter": "sqlite3",
        "database": "db/production.sqlite3",
        "host": "localhost"
      }
    }
  }
}

```

- この設定をすることで、以下にdatabase.ymlを生成する（Railsのdatabase.ymlはこのファイルへのsymlink）
/srv/www/hogexhoge/shared/config


#### ハマリポイント
- database.ymlは、JSONで指定してやらないといけない
     - “hogexhoge”は、App名を指定
     - hostオプションを指定しないと、database.ymlをdeployしてくれない
     - databaseオプションを指定しないと、dbがないと怒られる

see: https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.4/rails/recipes/configure.rb

## その他
### 複数アプリケーションの構築(ステージング環境など）
- Railsのenvにstagingを追加。ローカルでstagingとして起動できるようにアプリを構築
- Appsにstaging用のappを追加
     - Rails env : staging
     - GitリポジトリのBranchオプション : staging
     - domain name : sp_staging.hogexhoge.com
          - 同時にproduction環境のdomain nameも指定する
- デプロイ時のCustom Chef JSONは以下を指定



```
{
  "deploy": {
    "hogexhoge_staging": {
      "database": {
        "adapter": "sqlite3",
        "database": “db/staging.sqlite3",
        "host": "localhost"
      }
    }
  }
}
```


#### ハマリポイント
- Domain nameの指定を忘れずに
     - 複数アプリを立ち上げた場合、同一IP＋このdomain nameでアプリケーションを判定している


### サーバーへのSSHログイン
- EC2のKey Pairsメニューから鍵を作成
- xxx.pem を.ssh以下に置く
- chmod 400 xxx.pem
- 生成した鍵xxxをOpsWorksのinstanceのSSH keyで指定する
- 下記のコマンドでアクセス

```
$ssh -i ~/.ssh/hogexhoge_sp.pem ec2-user@xxx.xxx.xxx.xxx
```

- デプロイされたディレクトリは以下. deployユーザーに変更


```
$ cd /srv/www/hogexhoge/current
$ sudo su deploy
```

### ログの確認
- Apache/Passengerのログ


```
$cd /etc/httpd/logs

```


- Railsのログ


```
$cd /srv/www/hogexhoge/current/log/production.log

```

## Refs.
[Aws OpsWorks [JAWSDAYS 2014 ACEに聞けトラック]](http://www.slideshare.net/YukihikoSawanobori/aws-opsworks-overview-32384777)
[20140315 JAWS Days OpsWorks](http://www.slideshare.net/interu07/20140315-jaws-days-2014opsworks)
[Rails App Server AWS OpsWorks Layer - AWS OpsWorks](http://docs.aws.amazon.com/opsworks/latest/userguide/workinglayers-rails.html)
[AWS OpsWorksを使ってみた (概要編) - Tech-Sketch](http://tech-sketch.jp/2013/08/aws-opsworks.html)
[OpsWorksでRailsな環境作ってみた。 - Develop with pleasure!](http://techmedia-think.hatenablog.com/entry/2013/04/10/220451)
[OpsWorksでRailsアプリを動かす際に注意しておきたいデータベース接続の設定 - よかろうもん！](http://interu.hatenablog.com/entry/2014/03/10/205811)
[AWS OpsWorksアプリケーション運用の勘所（1）：AWS OpsWorksって何？ から、運用しやすくなる下準備のポイントまで (1/5) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1304/17/news003.html)
[Chef(Server)と AWS OpsWorks(tm)の比較](http://www.slideshare.net/YukihikoSawanobori/opsworks-and-chef)