CodeDeploy 事始め（基本設定、基本動作の確認）

#1. はじめに
* OpsWorks の Chef12 版（カスタムLayer） の Apps（デプロイ） は、ユーザ側でカスタムデプロイレシピを作成する必要がありそうなので敷居が高そう。代わりに CodeDeploy を利用できないか。

* [Deployレシピ](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/create-custom-deploy.html)
>アプリケーションをカスタム Layer にデプロイするには、アプリケーションのファイルをリポジトリからインスタンスの適切な場所にダウンロードするカスタム Deploy レシピを実装する必要があります。ただし、多くの場合、組み込みのデプロイクックブックを使用してデプロイの一部の側面を処理することで、記述する必要のあるコードの量を制限することができます。

#2. 今回の環境
* デプロイするサーバ：EC2 Amazon Linux
* リポジトリ：Github (private/public)

#3. 注意点
* ~~EC2に設定する CodeDeploy 用IAMロール設定はEC2起動時にしか設定できないため、すでに起動している EC2 に対してCodeDeployでのデプロイを行うことはできない。~~
* [マネージメントコンソールからも、既存のEC2インスタンスにIAMロールを簡単にアタッチ、変更できるようになりました](https://aws.amazon.com/jp/blogs/news/easily-replace-or-attach-an-iam-role-to-an-existing-ec2-instance-by-using-the-ec2-console/)


#4. 設定概要
##4.1 CodeDeploy 用 EC2設定とEC2起動　
* [CodeDeploy 用 IAM instance profile (IAMロール) の作成](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)
* [EC2起動時の CodeDeploy 用設定](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-set-up-new-instance.html)
 * EC2タグ設定
 * IAMロール設定
 * ユーザーデータに CodeDeploy エージェントインストール設定
 
##4.2 Githubリポジトリ設定
* デプロイするものを github リポジトリへ Push
* [appspec.yml ファイルをデプロイするソースコードのリポジトリのトップに配備](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-add-appspec-file.html?icmpid=docs_acd_console)

##4.3 CodeDeployサービス設定
* [Service Role for AWS CodeDeploy 作成](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/how-to-create-service-role.html)
* [アプリケーション設定](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-application.html)
* [デプロイ設定](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-new-deployment.html)

#5. CodeDeploy 用 EC2設定とEC2起動
##5.1 [CodeDeploy 用 IAM instance profile (IAMロール) の作成](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)

* 用途

>Your Amazon EC2 instances need permission to access the Amazon S3 buckets or GitHub repositories where the applications that will be deployed by AWS CodeDeploy are stored. To launch Amazon EC2 instances that are compatible with AWS CodeDeploy, you must create an additional IAM role, an instance profile. These instructions show you how to create an IAM instance profile to attach to your Amazon EC2 instances. This role gives AWS CodeDeploy permission to access the Amazon S3 buckets or GitHub repositories where your applications are stored.

* ポリシー作成 （コンソールから）

>サービス　⇒　IAM　⇒　ポリシー　⇒　ポリシーの作成　⇒　独自のポリシーを作成　⇒ 選択 ⇒ ポリシーの確認
>>・ポリシー名
<pre>CodeDeployDemo-EC2-Permissions</pre>

>>・ポリシードキュメント
<pre>
　{
　　"Version": "2012-10-17",
　　"Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*" 
      ],
      "Resource": [
        "arn:aws:s3:::aws-codedeploy-ap-northeast-1/*" 
      ]
    }
  ]
}
</pre>
>>・ポリシーの作成

* ロール作成

> IAM　⇒　ロール　⇒　新しいロールの作成
>>・ロール名
<pre>
CodeDeployDemo-EC2-Instance-Profile
</pre>

>>・ロールタイプの選択
<pre>Amazon EC2</pre>を選択

>>・ポリシーのアタッチ
<pre>CodeDeployDemo-EC2-Permissions</pre>をアタッチ

>>・ロールの作成

##5.2 [EC2起動時の CodeDeploy 用設定](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-set-up-new-instance.html)

* EC2起動

> サービス　⇒　EC2　⇒　インスタンスの作成
>>・IAMロール設定
<pre>
CodeDeployDemo-EC2-Instance-Profile
</pre>
>>・高度な詳細　⇒　ユーザーデータ
<pre>#!/bin/bash
yum -y update
yum install -y ruby
cd /home/ec2-user
curl -O https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
</pre>
>>・EC2タグ設定（Add Tags）
<pre>
キー: deploy
値：yes
</pre>

* [EC2作成後の CodeDeploy Agent 起動確認](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent-verify.html)
 * 作成したEC2へSSHログイン
<pre>
$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 8017
</pre>


#6. Githubリポジトリ設定
* Githubリポジトリ構成例
<pre>
github.com/tonishy/sample-source
├── appspec.yml
└── test.txt
</pre>

* デプロイするものを github リポジトリへ Push

* appspec.yml ファイルをデプロイするソースコードのリポジトリのトップに配備


```yml:appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /tmp
```

「source: /」＝ 「https://github.com/tonishy/sample-source/」 (の特定コミットID)を
「destination: /tmp」＝ デプロイするEC2サーバの /tmp」 へデプロイする

#7. CodeDeployサービス設定
##7.1 [Service Role for AWS CodeDeploy 作成](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/how-to-create-service-role.html)

* 用途

>The AWSCodeDeployRole policy provides the permissions required for your service role to read the tags on your instances or identify your Amazon EC2 instances by Auto Scaling group names; to publish information to Amazon SNS topics; and to retrieve information about CloudWatch alarms. By default, this policy also includes a trust relationship that grants your service role access to all of the endpoints currently supported by AWS CodeDeploy. You can restrict the service role's access to only those endpoints you specify.

* ロール作成 （コンソールから）

>サービス　⇒　IAM　⇒　ロール　⇒　新しいロールの作成
>>・ロール名
<pre>
CodeDeployServiceRole
</pre>
>>・ロールタイプの選択
<pre>AWS CodeDeploy</pre>を選択

>>・ポリシーのアタッチ
<pre>AWSCodeDeployRole</pre>をチェック

>>・ロールの作成

* 信頼ポリシー編集

>作成したロール「CodeDeployServiceRole」を選択 ⇒　信頼関係　⇒　信頼関係の編集
>>・ポリシードキュメント
<pre>
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codedeploy.ap-northeast-1.amazonaws.com" 
        ]
      },
      "Action": "sts:AssumeRole" 
    }
  ]
}
</pre>
>>・信頼ポリシーの更新

##7.2 [アプリケーション設定](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-application.html)

* アプリケーション設定をAWSコンソールから作成

>サービス　⇒　CodeDeploy　⇒　今すぐ始める　⇒　カスタムデプロイ　⇒　ウォークスルーのスキップ　⇒　新しいアプリケーションの作成
>>・アプリケーション名
<pre>demo</pre>[Note] In an AWS account, an AWS CodeDeploy application name can be used only once per region. You can reuse an application name in different regions.

>>・デプロイグループ名
<pre>demo</pre>[Note] If you want to use the same settings used in another deployment group (including the deployment group name; tags, Auto Scaling group names, or both; and the deployment configuration), specify those settings on this page. Although this new deployment group and the existing deployment group will have the same name, AWS CodeDeploy treats them as separate deployment groups, because they are each associated with separate applications.

>>・インスタンスの追加
<pre>
タグの種類：　Amazon EC2
キー：　deploy
値：　yes
</pre>今回は、EC2起動時に設定したタグが付いているEC2をデプロイ対象とする。ただし、この指定の場合、terminate しているインスタンスでもデプロイ用タグがついていれば選択される。

>>・デプロイ設定　⇒　デプロイ実行
とりあえず<pre>CodeDeployDefault.OneAtATime</pre>

>>・トリガー
今回はスルー

>>・警告
今回はスルー

>>・ロールバック
今回はスルー

>>・サービスロール
<pre>
arn:aws:iam::************:role/CodeDeployServiceRole
</pre>（[7.1](#71-service-role-for-aws-codedeploy-%E4%BD%9C%E6%88%90)で作成したもの）

>>・アプリケーションの作成

##7.3 [デプロイ設定](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-new-deployment.html)

* デプロイ設定をAWSコンソールから作成

>サービス　⇒　CodeDeploy　⇒　AWS CodeDeploy メニューのデプロイ　⇒
>>・新しいデプロイの作成
<pre>
アプリケーション：demo
デプロイグループ：demo
リビジョンタイプ：アプリケーションは GitHub に格納されています
</pre>
>>・GitHubに接続
　「GitHubに接続」をクリック

>>・リポジトリ名
<pre>
tonishy/sample-source
</pre>

>>・コミットID
<pre>
30326398c84d********************fdbdf2b8
</pre>

>>・デプロイ設定
<pre>
CodeDeployDefault.OneAtATime
</pre>

>>・今すぐデプロイ

>
![2016-11-18-01.png](https://qiita-image-store.s3.amazonaws.com/0/148868/cd8a8a23-9463-5838-692f-e59adeb0e3b4.png)
↓
![2016-11-18-02.png](https://qiita-image-store.s3.amazonaws.com/0/148868/54b6d555-3091-d35c-5508-576a09c32025.png)