AWS CodePipeline で始めるデプロイオートメーションの話

この記事は[ウィルゲート Advent Calender 2019](https://qiita.com/advent-calendar/2019/willgate) 6 日目の記事です！
前回は @MayaGalaxy の「[キーキャップの本を技術書典に出した話](http://mayagalaxy-b.hatenablog.jp/entry/2019/12/05/115215)」でした。

# はじめに
最近業務のことよりスノーボードのことが頭から離れない [@int_sorarinu](https://twitter.com/int_sorarinu) です。

WEB アプリケーションを各サーバ群にデプロイする手法というものは数え切れないほど沢山ありますが、今回は AWS の CodePipeline というツールを使ってデプロイを行ってみました。

# AWS CodePipeline とは
AWS が提供している完全マネージド型の継続的デリバリーサービスで、定義したリリースモデルに基づき、コードチェンジがあった場合のフェーズの構築、テスト、デプロイを自動化してくれる優れたツールです。

詳しくは AWS 公式をご覧ください。
https://aws.amazon.com/jp/codepipeline/

# パイプラインを構築する
今回は、 GitHub や Bitbucket などに組み込まれた CI ツールから S3 へ成果物を zip にしたものをアップロードした際にデプロイを行うといったことを想定してパイプラインを作っていきます。

### ソースステージの構築
まずはじめに、「Source」ステージを作成し、その中でアクションを追加します。
アクションプロバイダーは S3 を選択し、CI がアップロードする先のバケットを選択して、成果物のファイル名を指定します。

検出オプションは Amazon CloudWatch Events を選択することで、 S3 にファイルがアップロードされたことを検知してパイプラインが自動で実行されるようになります。

![スクリーンショット 2019-12-02 15.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/654a9c7b-98c9-4d0b-8d2e-e6dc31c853b4.png)

### ビルドステージの構築
ビルドを実行するものがない、 CI でビルドしたものを S3 にアップロードしているなどの場合はこのステージは必要ありませんが、CodePipeline でビルドを実行する場合においてビルドステージを構築する必要があります。

こちらも、「Build」ステージを作成して、その中でアクションを追加していきます。
今回はアクションプロバイダーを CodeBuild にしていますが、 [Jenkins](https://jenkins.io/) を指定することもできます。

CodeBuild にビルドプロジェクトを作成していない場合は、「プロジェクトを作成する」リンクから先にビルドプロジェクトを作成しましょう。

![スクリーンショット 2019-12-02 15.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/a3d9cd8d-c1c3-35e4-326a-5e50fd0044ac.png)


### デプロイステージの構築
ここでは「Deploy」ステージを作成してデプロイ用のアクションを追加します。
アクションプロバイダーも豊富で、 CodeDeploy だけではなく、 S3 だったり CloudFormation だったりを指定することができます。
S3 ホスティングを利用して静的ファイルを配信している場合などはアクションプロバイダーを S3 にしてあげて、「デプロイする前にファイルを抽出する」オプションを有効にすることで該当の S3 バケットへ展開されます。

CodeDeploy で各サーバへデプロイを行うのであれば、先に CodeDeploy のアプリケーションを用意してから設定してあげましょう。

![スクリーンショット 2019-12-02 15.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/64508b4f-93ae-3cc2-cd65-912dfce3903b.png)

### Slack 通知の設定
せっかくパイプラインを構築しても実際に実行されているか不安ですよね。
でもわざわざ AWS のコンパネから確認する訳にもいかないので Slack へ状況を通知したいと思います。

[AWS Chatbot のベータ版](https://aws.amazon.com/jp/chatbot/)が最近リリースされたのでそれを利用して通知するようにしてみましょう。

##### CodePipeline 側の設定
構築したパイプラインの上部から、「通知」→「通知ルールの作成」を選択します。

![スクリーンショット 2019-12-02 15.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/ae158995-6ac7-7ef5-c16d-eb207c159a92.png)

通知ルールを設定する画面に切り替わるので、通知名に適当な名前を入力します。
通知をトリガーするイベントは適宜必要なものを選択しておきましょう。

パイプラインが動作したかどうかだけ分かれば良いのであれば、「Pipeline execution」の項目をチェック。
![スクリーンショット 2019-12-02 16.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/e45fc88c-bcb5-2d34-71c3-bd664a8ba19a.png)

トリガーの設定ができたら SNS トピックを作成して「Amazon SNS トピック ARN」にセットすれば CodePipeline 側の設定は完了です。
![スクリーンショット 2019-12-02 16.08.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/9772dde0-f4ac-264b-7423-2a6b7c5b8eab.png)

##### AWS Chatbot 側の設定
AWS Chatbot の「Configure a chat client」から Slack を選択し、「Configure client」をクリックすると、 Slack へアクセス許可を行う画面に遷移するので許可してあげましょう。

![スクリーンショット 2019-12-02 16.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/d05a8b5f-c0d8-d1c1-3201-2b911217ccae.png)

![スクリーンショット 2019-12-02 16.13.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/b9050383-5930-dec7-5a31-b4dff7c779da.png)

あとはどのチャンネルに通知するか、AWS Chatbot のパーミッション、どの SNS トピックをトリガーにするかなどの簡単な設定をしてあげれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/f4a009eb-95ee-d896-07a2-80447a91fe60.png)

これで CodePipeline のパイプラインが実行、成功、失敗などのアクションを起こすたびに Slack へ通知されるようになります。

<img width="597" alt="スクリーンショット 2019-12-02 16.17.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137467/7e6f1698-3f08-c266-ac02-7d4f6d496850.png">


### デプロイされるか確認する
手動や CI で zip ファイルを S3 にアップロードした際に CodePipeline のパイプラインが動き始めるか確認しましょう。
問題なく設定されていれば新鮮なアプリケーションが各サーバへデプロイされているはずです。

# 終わりに
今回は CodePipeline を利用してアプリケーションをデプロイする方法を紹介しました。

弊社ではこれまで [Capistrano](https://github.com/capistrano/capistrano) などを利用したデプロイが主流だったのですが、最近では各サービスのデプロイで CodePipeline を利用することが増えてきました。

Capistrano 時代はデプロイ用のサーバへ SSH 接続してコマンドを実行していたのに対し、CodePipeline でデプロイを自動化することで心理的な障壁が取り除けたりとみんなハッピーになれたように感じます。

まだ一部 Capistrano で手動デプロイしているところもあるので、今後どんどん自動化していきたいなという気持ちでいっぱいです。

明日は @ryota_hnk の「Rancher on Oracle Cloud」です！
お楽しみに！！