EC2デプロイのためにCodeDeployを導入する

# 経緯
hubotのデプロイ用にCodeDeployを導入してみる。
色々と設定が多いので、まずは諸々下準備を行い、
その後CodeDeployのコンソール画面からデプロイを行う。

# IAM作成
CodeDeploy用とデプロイ先EC2用のIAMをそれぞれ作成する
※参考資料
[Create a Service Role for AWS CodeDeploy - AWS CodeDeploy](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/how-to-create-service-role.html)
[AWS CodeDeploy を使って Laravel アプリをデプロイしてみた - Qiita](http://qiita.com/kurikazu/items/869e7f4265c073d52211)

## CodeDeploy用IAM

IAMコンソールのロールから、「新しいロールの作成」をクリック

| 項目 | 入力 |
|:-----------|:------------|
|ロール名|適当に|
|ロールタイプ|AWSサービスロール＞Amazon EC2|
|ポリシーのアタッチ|AWSCodeDeployRole|

またTrust Relationships（信頼関係）も設定が必要。
設定内容は[Create a Service Role for AWS CodeDeploy - AWS CodeDeploy](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-service-role.html#how-to-create-service-role-console)を参照

```
# 例
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codedeploy.us-east-1.amazonaws.com", 
          "codedeploy.us-west-2.amazonaws.com",
          "codedeploy.eu-west-1.amazonaws.com",
          "codedeploy.ap-southeast-2.amazonaws.com",
          "codedeploy.ap-northeast-1.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

あとで使うので、ロールのARNを確認しておく

## EC2用IAM
IAMコンソールのロールから、「新しいロールの作成」をクリック

| 項目 | 入力 |
|:-----------|:------------|
|ロール名|適当に|
|ロールタイプ|AWSサービスロール＞Amazon EC2|
|ポリシーのアタッチ|AmazonS3ReadOnlyAccess|

あとで使うので、ロールのARNを確認しておく

# EC2セットアップ
## サーバ用意
先ほど作成したEC2用IAMを使って環境構築する必要があるが、
残念ながら既存のEC2へIAMを適用することができないらしい。
ということで、涙をのんで新しいEC2サーバをつくりなおす…(つд⊂)
インスタンス作成時にIAMロールを設定できるので、先ほどのEC2用IAMを入力する。

## agent導入
CodeDeploy用のagentをインストールする。
[AWS CodeDeploy Agent Operations - AWS CodeDeploy](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent.html)の通りに進めていけばOK

今回は東京リージョンなので、こんな感じ。

```
$ sudo yum update
$ sudo yum install ruby
$ sudo yum install aws-cli
$ cd /home/ec2-user
$ aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1
$ chmod +x ./install
$ sudo ./install auto
```

最終的に以下のコマンドで導入が確認できればOK

```
$ sudo service codedeploy-agent status
```

# appspec作成
デプロイ内容を記載するymlを作成し、リビジョンのルートに置く

※参考資料
[AWS CodeDeploy AppSpec File Reference - AWS CodeDeploy](http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html)
[AWS CodeDeploy の AppSpec を読み解く ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/code-deploy-appspec/)

設定内容

|項目|説明|
|:-----------|:------------|
|version|デプロイバージョン|
|os|デプロイ先OS。linuxかwindows|
|files:source|リビジョンのどこを引っ張ってくるか。全部のファイルを持ってきたいときは"/"を入力。|
|files:destination|デプロイ先サーバのどのディレクトリにファイルを配置するか|
|hooks|デプロイの任意の過程で実行できるスクリプトの設定内容。location（スクリプトの場所）,timeout（スクリプト実行のタイムアウト時間）,runas（スクリプトを実行するユーザ）を設定できる。|

今回はこんな感じにした。

```
version: 0.0
os: linux
files:
  - source: /
    destination: /opt/hubot
hooks:
  ApplicationStart:
    - location: scripts/codedeploy_start.sh
      timeout: 180
```

ここまでできたら準備完了！

# コンソール画面
## CodeDeployログイン
https://aws.amazon.com/jp/codedeploy/

## アプリケーション作成画面
「新しいアプリケーションの作成」をクリック
![](https://gist.githubusercontent.com/yukofeb/bacbb17031e98cd78d6b/raw/8f06af57374b5d461cee68c13ca8f1488678f0a7/codedeploy1.png)


## 設定
以下に沿って設定していく
![](https://gist.github.com/yukofeb/bacbb17031e98cd78d6b/raw/8f06af57374b5d461cee68c13ca8f1488678f0a7/codedeploy2.png)

|項目|設定内容|
|:-----|:-----|
|アプリケーション名|任意|
|デプロイグループ名|任意|
|インスタンスの追加（タグの種類）|デプロイ対象を特定する方法。EC2,Auto Scaling Group,On-Premises Instanceから選択できる|
|インスタンスの追加（キー、値）|タグのキーと値を設定して、サーバを特定するので、予めタグを設定しておく必要がある|
|デプロイ設定|OneAtATime(1回に1個のインスタンスにデプロイ),AllAtOnce(1回に最大ですべてのインスタンスにデプロイ),HalfAtATime(1回に最大で半分のインスタンスにデプロイ)が選択できる|

## デプロイ実行
デプロイ画面に移り、「新しいデプロイの作成」をクリック
![](https://gist.github.com/yukofeb/bacbb17031e98cd78d6b/raw/8f06af57374b5d461cee68c13ca8f1488678f0a7/codedeploy3.png)

## デプロイ結果を確認
デプロイIDをクリックすると、デプロイ状況が見えるので、
正常にデプロイされたことを確認する。
![](https://gist.github.com/yukofeb/bacbb17031e98cd78d6b/raw/8f06af57374b5d461cee68c13ca8f1488678f0a7/codedeploy4.png)