AWS はじめてのCodeDeploy 



CodeDeployを設定したので備忘録的に残そうと思います。

#IAM作成
毎回悩まされる権限周り
CodeDeployに必要なIAMとデプロイ先のEC2インスタンス用のIAMをそれぞれ作成する

#CodeDeploy用のIAM
`AWSCodedeploy`をアタッチ
AutoScalingを利用する場合には、AutoScaling関連の権限もアタッチ。
・ロールタイプ
　AWSサービスロール→EC2
・ポリシーのアタッチ
　AWSCodeDeployRole

#EC2用のIAM
`AmazonS3ReadOnlyAccess`をアタッチ
・ロールタイプ
　AWSサービスロール→EC2
・ポリシーのアタッチ
　AmazonS3ReadOnlyAccess

#EC2のセットアップ
#EC2インスタンス用意
デプロイするEC2インスタンスを作成。
この時、上記で作成したEC2用のIAMロールを割り当てる
（ロールを割り当てていないとデプロイ失敗のもととなる。体験談。。）

#CodeDeploy-agentの導入
EC2インスタンスを立てたら、次はCodeDeploy-agentの導入。
OSはAmazon Linuxを利用している。基本的に以下の通りに進めれば問題ない。
[Install the CodeDeploy agent for Amazon Linux or RHEL][]
[Install the CodeDeploy agent for Amazon Linux or RHEL]:https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html

東京リージョンで利用する場合は、以下の通り。

```

$ 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
```

導入後agentが起動しているか確認。以下の結果が返ってこればOK

```
$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 12491
```

#appspec作成
デプロイ内容を記載する`appspec.yml`を作成。
作成後は、リポジトリの直下に配置する。

設定の内容は以下の感じ

| 項目 | 説明 |
|:--|:--|
| version | デプロイバージョン |
| os | デプロイ先のサーバのOS（linux or windows） |
| files:source | どこのディレクトリのコードを持ってくるか。全ファイルを持ってきたい時は"/"にする |
| files:destination | デプロイ先のサーバのどこのディレクトリにコードを配置するかを指定する |
| hooks | デプロイの過程で実行するスクリプトの配置先などを指定する |

あとはコンソールでCodeDeployの設定
#CodeDeploy設定
#はじめにアプリケーションの作成
CodeDeploy→アプリケーション→アプリケーションの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272957/9d752dd5-c0d0-eb9e-8f33-47698507fc2e.png)

| 項目 | 説明 |
|:--|:--|
| アプリケーション名 | 任意 |
| コンピューティングプラットフォーム | EC2/オンプレミス、AWS Lambda、Amazon ECSから選択 |

#デプロイグループの作成
CodeDeploy→アプリケーション→作成したアプリケーション名→デプロイグループの作成

| 項目 | 説明 |
|:--|:--|
| デプロイグループ名 | 任意 |
| サービスロール | はじめの方に作成したCodeDeploy用のIAMを選択 |
| デプロイタイプ | アプリケーションのデプロイ方法を**インプレース**、**Blue/Green**のどちらかを選択（違いについては今回説明しない） |
| 環境設定 | **EC2インスタンス** **AutoScalingグループ**、**オンプレミスインスタンス**の任意の組み合わせを選択 |
| デプロイ設定 |**OneAtATime**（1回に1個のインスタンスにデプロイ）、**AllAtOnce**（1回に最大ですべてのインスタンスにデプロイ）、**HalfAtATime**（1回に最大で半分のインスタンスにデプロイ）を選択  |
| ロードバランサー | デプロイプロセス中に着信トラフィックを管理するロードバランサーを選択（今回は使ってないので、使う機会がある時に調べてみる） |


#デプロイの作成&デプロイ実行
CodeDeploy→アプリケーション→作成したアプリケーション名→デプロイの作成

| 項目 | 説明 |
|:--|:--|
| リビジョンタイプ | アプリケーションの格納先を**S3**、**GitHub**から選択 |
| リビジョンの場所 | 上記から保存されている場所をしていする |
| デプロイの説明 | デプロイについて簡単な説明を記入（任意） |
| 追加のデプロイ動作設定 | ApplicationStop ライフサイクルイベントの障害、配置先のインスタンスに同じファイルがあった場合の対処方法について選択（任意）デプロイタイプをインプレース選択時にコンテンツ上書きを選択してなかったことがありつまづいた（体験談。。） |
| デプロイグループのオーバーライド | 上記デプロイ設定と同じ（**OneAtATime**、**AllAtOnce**、**HalfAtATime**）から選択 |
| ロールバック設定の上書き | デプロイ失敗時のロールバックや、アラームのしきい値を超えた場合のロールバックについて選択可能 |

デプロイ作成ボタンを押すとデプロイが実行される

#結果を確認
成功！やったね♪
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272957/a9a56f9b-b225-57a2-eff2-3c2da64b354e.png)

デプロイのライフライクルイベント→Vieweventsから詳細を確認することも可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272957/8eb4d9a9-d9e6-a7ad-5636-2716607e5d24.png)

お疲れさまでしたー

参考：
[EC2デプロイのためにCodeDeployを導入する][]
[EC2デプロイのためにCodeDeployを導入する]:https://qiita.com/yukofeb/items/e077fc8755416c904032