CodeDeployメモ

# CodeDeploy環境構築

### 概要
* CodeDeployを構築する上で以下3点を事前準備する必要がある。
* IAMロール作成
* CodeDeploy用（AWSCodeDeployRole権限付与）
* EC2インスタンス用（AmazonS3ReadOnlyAccess権限付与）
* IAMロールアタッチ
* デプロイ対象EC2インスタンスにAWS CodeDeployエージェントのインストール

### IAMロール作成

#### 信頼関係

* 「AWSサービス」から「CodeDeploy」を選択し、「次のステップ：アクセス権限」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/8343b83f-b2c3-6bb6-d1b4-1b79628b36af.png)

* 「AWSCodeDeployRole」が選択されていることを確認し、「次のステップ：確認」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/1ddf8301-7cb6-c888-fe1e-b425981ce8e6.png)

* 確認

ロール名に「codedeploy-example-banded-service-role」を入力し、「ロールの作成」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/8a6f1eac-332d-bb0d-b716-c3796b408ece.png)

### EC2インスタンス用（AmazonS3ReadOnlyAccess権限付与）

* 今回は独自のポリシーは作成せず、既存のポリシーを使用し、ロールのみ作成
* IAMサービスのロール画面から「ロールの作成」を選択し、作成を開始

#### 信頼関係
* 「AWSサービス」から「EC2」を選択。
* 「ユースケースの選択」から「EC2」を選択し、「次のステップ：アクセス権限」をクリック。

#### アクセス権限

* 検索窓に「S3」と入力し、下部に表示された「AmazonS3ReadOnlyAccess」を選択。
* 「次のステップ：確認」をクリック。



#### 確認

* ロール名に「codedeploy-ec2-service-role」を入力し、「ロールの作成」をクリック。

### IAMロールアタッチ

* EC2インスタンス画面から作成したEC2インスタンス用ロール「codedeploy-ec2-service-role」をデプロイ対象EC2インスタンスにアタッチする。

* 「IAMロールの割り当て/置換」を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/4db631cc-253a-d6e7-173f-b437e787514c.png)

* IAMロール欄に先ほど作成した「codedeploy-ec2-service-role」を選択し、適応する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/8a78de72-13c9-7d40-8210-5024d0677bed.png)


### Ruby導入

* 環境はEC2（AmazonLinux2）
* CodeDeployAgentはRubyで動く
* rbenv上のRubyでは動かない
* システムデフォルトのRubyで動かす必要がある
* rbenvにもRubyは入れておき、システムにもデフォルトのRubyを入れシステム側のRubyを使用する用にする

```
# システム上にRubyを導入
$ sudo yum update
$ sudo yum install ruby

# システム上のRubyを使用する場合
$ rbenv global system
$ ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

# rbenv上にRubyを導入
$ rbenv install --list
$ rbenv install 2.3.6

# rbenv上のRubyを使用する場合
$ rbenv global 2.3.6
$ ruby -v
ruby 2.3.6p384 (2017-12-14 revision 61254) [x86_64-linux]
```

### CodeDeployAgent導入

* システム上のRubyを使用すること
* rbenv上のRubyを使用すると失敗する
* [公式マニュアル](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html)

```
$ wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install

$ sudo ./install auto

$ sudo service codedeploy-agent status

$ CodeDeployエージェントのログ確認
tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log

#エラーログが出ている場合はEC2インスタンスに適切なIAMロールがついている事を確認し再起動
2018-03-19 18:05:28 ERROR [codedeploy-agent(28817)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile

$ sudo service codedeploy-agent restart
Restarting codedeploy-agent:
```

### 参考エラー
```
# rbenv上のRubyで導入しようとすると以下のようなエラーになりCodeDeployエージェントを導入できない
$ sudo ./install auto
/usr/bin/env: ruby: No such file or directory
 
==========================================================================================
    AWS CodeDeploy needs Ruby version 2.0 or above to be installed for root under /usr/bin
    Please install Ruby 2.x for user root
==========================================================================================
error: %pre(codedeploy-agent-1.0-1.1352.noarch) scriptlet failed, exit status 1
Error in PREIN scriptlet in rpm package codedeploy-agent-1.0-1.1352.noarch
  Verifying  : codedeploy-agent-1.0-1.1352.noarch                                                                     1/1
Failed:
  codedeploy-agent.noarch 0:1.0-1.1352
Code

```


### アプリケーション

#### アプリケーション作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/9a272325-6fe2-62a2-5de5-409250c70908.png)


CodeDeployの「アプリケーション」を選択し、「アプリケーションの作成」ボタンをクリック。

|大項目|中項目|小項目|値|
|:----------|------------:|:----------:|:----------:|
|アプリケーション名|||example-codedeploy|
|コンピューティングプラットフォーム|||「EC2/オンプレミス」を選択|
|デプロイグループ名|||staging|
|デプロイタイプ|||「インプレースデプロイ」を選択|
|環境設定|Amazon EC2 インスタンス||キー：Environment 値：staging|
||ロードバランサー||今回はロードバランサーを使用していないのでチェックしない。本番環境ではロードバランサーを使用しているはずなので設定する。|
|デプロイ設定|デプロイ設定||「CodeDeployDefault.OneAtTime」を選択。※1台づつデプロイする設定|
|詳細設定|トリガー|トリガー作成|今回は作成せず|
|||警告|今回は作成せず|
||ロールバック|デプロイが失敗したときにロールバックする|チェックする|
|||アラームのしきい値が一致したときにロールバックする|チェックしない|
|||ロールバックを無効にする|チェックしない|
|サービスロール|サービスロールARN||「codedeploy-example-service-role」を選択|


#### デプロイグループ追加

上記で作成したアプリケーションに本番用のデプロイグループを追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/5984c826-139a-49db-ba06-9f8755d85af5.png)


CodeDeployの「アプリケーション詳細」を選択し、「デプロイグループの作成」ボタンをクリック。



|大項目|中項目|小項目|値|
|:----------|------------:|:----------:|:----------:|
|アプリケーション名|||example-codedeploy|
|コンピューティングプラットフォーム|||「EC2/オンプレミス」を選択|
|デプロイグループ名|||production|
|デプロイタイプ|||「インプレースデプロイ」を選択|
|環境設定|Amazon EC2 インスタンス||キー：Environment 値：staging|
||ロードバランサー||今回はロードバランサーを使用していないのでチェックしない。本番環境ではロードバランサーを使用しているはずなので設定する。|
|デプロイ設定|デプロイ設定||「CodeDeployDefault.OneAtTime」を選択。※1台づつデプロイする設定|
|詳細設定|トリガー|トリガー作成|今回は作成せず|
|||警告|今回は作成せず|
||ロールバック|デプロイが失敗したときにロールバックする|チェックする|
|||アラームのしきい値が一致したときにロールバックする|チェックしない|
|||ロールバックを無効にする|チェックしない|
|サービスロール|サービスロールARN||「codedeploy-example-service-role」を選択|



続きはCodePipelineで設定する