CodeDeployでGitHubのソースをEC2にデプロイするまとめ

AWSが用意してくれているドキュメントがところどころ分かりにくかったのでざっくりとまとめ。コンソールの操作です。

# 用意するもの
- EC2インスタンス
- GitHubにレポジトリ

# インスタンスにタグをつける
デプロイ先のEC2インスタンスをタグで管理します。デプロイ実行するときに、ここでつけるタグを指定することでデプロイ先を選択することになります。

EC2コンソールの左メニューから「インスタンス」>「アクション」>「インスタンスの設定」>「タグの追加/編集」
![codedeploy1.png](https://qiita-image-store.s3.amazonaws.com/0/24741/e81e472a-f825-1d14-0ae2-37204722b23b.png)

適当にキーと値を設定します。インスタンスを管理しやすい形でWEBサーバーとかAPサーバーとかで設定するのもよし、新機能検証やパフォーマンステストなどの目的別に設定するのもよし。スクショは今回のインスタンスでLINEのAPIをテストしたかったのでPurpose=LineTestなるタグを設定してますが、まあなんでもOK。
![codedeploy2.png](https://qiita-image-store.s3.amazonaws.com/0/24741/71e4002e-4b0a-7349-e539-09ef079be43d.png)

# ロールを割り当て
IAMコンソールからからAmazonS3ReadOnlyAccessとAWSCodeDeployRoleを追加
![codedeploy3.png](https://qiita-image-store.s3.amazonaws.com/0/24741/f62adb99-470c-7084-2096-19886ef9b7d3.png)

## AmazonS3ReadOnlyAccess
CodeDeployエージェントをEC2インスタンスにインストールするときS3バケットからパッケージを持ってくるのでこのロールが必要。「AWSサービス」>「EC2」>「EC2」を選んで次のステップをポチ。
![スクリーンショット 2018-02-03 10.png](https://qiita-image-store.s3.amazonaws.com/0/24741/7d913942-e461-978c-9caf-21c0e56c1a46.png)

次のページでAmazonS3ReadOnlyAccessを選んで適当にロール名を入れてロールを作成。

## AWSCodeDeployRole
CodeDeployの実行ロールを作成。②のところでEC2を選んでもCodeDeployのロールが作成できたんですが、EC2ではデプロイできませんでした。②のところではCodeDeployを選択します。
![スクリーンショット 2018-02-04 9.png](https://qiita-image-store.s3.amazonaws.com/0/24741/d94e28ab-dba4-21e3-9c99-22e89247962b.png)

次の画面でははそのまま「次のステップ」、その次の画面でロール名をつけてロールを作成。

# CodeDeployの設定
CodeDeployエージェントをEC2インスタンスにインストールし、CodeDeployコンソールからデプロイするアプリケーションを作成します。

## EC2インスタンスにCodeDeployエージェントをインストール
```
# この辺はすでにインストールされてるかと思いますが
sudo yum update
sudo yum install ruby
sudo yum install wget

# ディレクトリはどこでもいいとは思いますがドキュメントに沿って
cd /home/ec2-user

# CodeDeployエージェント
wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

# 実行
sudo service codedeploy-agent start
```
[こちらのドキュメント](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html)には`wget https://bucket-name.s3.amazonaws.com/latest/install`と書いており、下の方にbucket-nameを該当リージョンに変更するようにとありますので、東京の場合は`aws-codedeploy-ap-northeast-1`に書き換えます。

## appspec.ymlをプッシュ
レポジトリのルート（README.mdと同じディレクトリ）にappspec.ymlという名前のファイルをプッシュします。このファイルの内容に従ってEC2内でデプロイされるようです。中身はこんな感じ。

```
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/go/src/line_test
```

今回はレポジトリのルートをEC2上の`/home/ec2-user/go/src/line_test`にデプロイします。
詳しくは[ClassMethodさんの記事](https://dev.classmethod.jp/cloud/aws/code-deploy-appspec/)が参考になるかと。

## アプリケーションを作成
CodeDeployのコンソールから「アプリケーションの作成」をクリックし作成画面に移動。

![FireShot Capture 1 - AWS CodeDeploy_ - https___ap-northeast-1.png](https://qiita-image-store.s3.amazonaws.com/0/24741/f9d0b0ab-0c53-4277-7fe0-d09630b2ec74.png)
アプリケーション名、デプロイグループ名は適当に。
環境設定のタグのところで前述したタグを設定する。
詳細設定のサービスロールでAWSCodeDeployRoleのロールを選択し「アプリケーションの作成」を押して作成完了。

## デプロイ実行
いよいよ最後になります。CodeDeployのメニューから「デプロイ」を選択、デプロイ画面で「デプロイの作成」から作成画面に移ります。

![FireShot Capture 2 - AWS CodeDeploy_ - https___ap-northeast-1.png](https://qiita-image-store.s3.amazonaws.com/0/24741/c7d1f8c3-d1a5-e883-67bb-99a947649012.png)
アプリケーション名とデプロイグループはアプリケーションの作成で設定した名前を選択。
リポジトリタイプはGitHubを選択しGitHubアカウントとレポジトリ名、それからデプロイしたいコミットのハッシュを入力し「デプロイ」をクリック。
これでGitHubからソースのデプロイが完了。

# まとめ
この程度ならEC2インスタンスから`git pull`すればできちゃいますが、複数のインスタンスを管理するとなるとCodeDeployを使うメリットは大きいです。今回は基本的な設定をまとめてみましたが、デプロイの自動タスク化なんかもできて便利そうです。その辺も今後触ってみて、またまとめておきたいと思います。