CodeCommit + CodeDeploy + CodePipelineでEC2にデプロイ~CodePipelineの設定・デプロイ実行~



|    目次    |
|:------------------|
| 1. [CodeCommitの設定](https://qiita.com/k_senbei/items/dd1b912debfa38136b9d)  |
| 2. [CodeDeployの設定](https://qiita.com/k_senbei/items/b713d828737f3810b187)   |
| 3. CodePipelineの設定・デプロイ実行(この記事)  |

AWSのCodeCommit、CodeDeploy、CodePipelineを組み合わせてEC2にデプロイするまでをまとめました。
この記事ではCodePipelineでデプロイを自動実行するパイプラインを作成する手順を説明します。

## 前提

* 前回、前々回の記事でCodeCommitのリポジトリ、CodeDeployのアプリケーションを作成済みとします。

## CodePipeline

CI/CD のパイプラインを提供するサービスです。
パイプラインを作成することで、アプリケーションのビルド・テスト・デプロイを自動化することができます。
パイプラインの実行中ステータスはCodePipelineコンソールから視覚的に監視できます。

#### 用語

* **ステージ** : パイプラインの実行中に通過する「アプリケーションに何らかのアクションを実行する」各種フェーズの単位。

## 今回作るパイプライン

先に作成したCodeCommitのリポジトリのmasterブランチが変更されたら、EC2インスタンスにデプロイするパイプラインを作成します。
パイプラインにはリポジトリからソースコードを取得する「ソースステージ」と、デプロイを実行する「デプロイステージ」の2つのステージがあります。
ソースプロバイダはCodeCommit、デプロイプロバイダはCodeDeployを使用します。それぞれ、GithubやAmazon ECSなど他のサービスを代わりに使う事も可能です。CodePipelineに統合できるツール・サービスのリストは[こちら](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/integrations-action-type.html#integrations-deploy)を参照してください。

## パイプライン作成

1. CodePipelineコンソール([http://console.aws.amazon.com/codesuite/codepipeline/home](http://console.aws.amazon.com/codesuite/codepipeline/home))にアクセスします。
2. [パイプラインの作成]を選択します。
3. パイプラインの設定を選択します。
![1_create_pipeline.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/94701b19-f457-ae2f-3772-c61cc4fffd2f.png)
  * パイプライン名 : SampleAppPipeline
  * サービスロール : 新しいサービスロール(CodePipelineに新規サービスロール作成を許可する)
4. [高度な設定]の[アーティファクトストア]で[カスタムロケーション]を選択し、CodeDeployの設定時に作成したS3バケットを選択します。
![1_5_create_pipeline.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/161aa29f-18e9-7417-6864-4f7798c55355.png)
5. [次に]を選択し、ソースステージを追加します。
6. ![2_create_pipeline.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/ceea9dfa-649d-4a5e-0747-e1e8a9150525.png)
  * ソースプロバイダー : AWS CodeCommit
  * リポジトリ名 : ソースコードのリポジトリ名
  * ブランチ名 : master
  * 検出オプション : Amazon CloudWatch Events
7. [次に]を選択するとビルドステージの追加画面が表示されます。今回ビルドステージは不要なので、[ビルドステージをスキップ]を選択します。
![3_create_pipeline.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/17e156ab-3e21-85a1-c6d0-a81a0889fb53.png)
8. デプロイステージの追加画面が表示されるので、設定を入力して[次に]を選択します。
![4_create_pipeline.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/71cba078-4293-9174-6bcd-2b6c3c40d7a8.png)
  * デプロイプロバイダー : AWS CodeDeploy
  * アプリケーション名 : CodeDeployアプリケーション名
  * デプロイグループ : デプロイするデプロイグループ
9. [パイプラインの作成]を選択します。

## pushしてデプロイの実行

これでmasterブランチにpushするとデプロイを自動実行するパイプラインを作成できました。
「ソースステージ」と「デプロイステージ」があることを確認できると思います。
![2_deploy_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/c75bc7f5-95b4-45bc-5211-48ffe68b31db.png)
試しにmasterブランチに対してgit pushするとソースステージのアクションが開始します。
![3_deploy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/c9ab5fbe-d733-9c3f-3347-c852d0131764.png)
しばらくしてソースコードの取得が終わるとデプロイステージのアクションが開始します。
![4_deploy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/d52a70af-604a-9d03-21fd-5c320b04f94f.png)

進行中のデプロイアクションの[詳細]を選択すると、CodeDeployコンソールが開きます。
![5_deploy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/89d10a55-b56c-38ea-01c0-8b90f9cd4d3e.png)
上のスクリーンショットでは2つのEC2インスタンスにデプロイを実行しています。
デプロイ中インスタンスの[View events]を選択すると、CodeDeployライフライクルの進捗状況を監視できます。
![7_deploy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/29c22dc9-9c7a-1819-1bf2-036d27d42a8b.png)

## デプロイでエラー発生時のログ

CodeDeployのライフライクルでエラーが発生した場合、先程のCodeDeployコンソールからエラー発生個所を特定できます。
![1_error.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/eb6d3f86-e9c8-964e-869d-c338549b0ee3.png)
エラーコード[ScriptFailed]はデプロイスクリプトの実行でエラーになったことを意味します。
[ScriptFailed]を選択すると下のようにエラー発生時のログを確認できるのですが、エラー発生個所の周辺数行しか見れません。
![2_error.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118624/cbdce05a-235b-4263-fd29-aac70645f125.png)
これだけで解決できる場合もありますが、より詳細なログが見たい場合はEC2インスタンスにログインしてデプロイのログを確認する必要があります。

デプロイに関連するログは下記の場所にあるので、lessコマンド等で確認できます。

CodeDeployAgentのログ
`/var/log/aws/codedeploy-agent/codedeploy-agent.log`
CodeDeployスクリプトのログ
`/opt/codedeploy-agent/deployment-root/{deployment-group-ID}/{deployment-ID}/logs/scripts.log`

## まとめ

以上で「CodeCommit + CodeDeploy + CodePipelineでEC2にデプロイ」する事ができました。
今回は「ビルドステージ」を追加しませんでしたが、CodeBuildを使用すればDockerイメージを使用したアプリケーションのビルド・テスト実行をパイプラインに組み込むこともできます。
他にも、デプロイが成功したらAmazon SNSで通知を送るなども可能です。
コンソールでポチポチしていくだけで簡単にサービスを連携できる所がAWSの魅力だと思います。

## 参考記事

* [CodePipeline公式ドキュメント](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-simple-codecommit.html)
* [CodeCommit＋CodeDeploy＋CodePiplineでデプロイを自動化](https://qiita.com/tailix/items/08a176457801be3278ec#_reference-0457cded07b428683d8d)