AWS CI/CDハンズオン

# AWS CI/CDハンズオン
今回は細かな用語の説明などは飛ばして、基本的にCI/CDを体感するためのとりあえず手を動かすという内容となっておりますので、15分程度で実践することができると思います。

## 用語説明
### 継続的インテグレーション（CI）とは
開発者が自分のコード変更を定期的にセントラルリポジトリにマージし、その後に自動化されたビルドとテストを実行するDevOpsソフトウェア開発の手法のことです。
メリットとして、テストが頻繁に行われる。それによって、バグの発見にかかる時間が削減されます。また、機械的なチェックなどを自動化することができるので、開発者はアプリケーションの本質的なことに集中できるのです。

### 継続的デリバリ（CD）とは
ソフトウェア開発手法の一つで、コード変更が発生すると、自動的に実稼働環境へのリリース準備が実行されるというものです。継続的デリバリーは継続的インテグレーションを拡張したものです。
メリットとして、デプロイまでのリリースが自動化されることです。それによって、コードの変更を素早くリリース可能となります。

### 登場人物
#### CodePipeline
マネージドな継続的デリバリサービスです。
<img width="200 alt="codepipeline-icon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/c92afa21-4afb-efa5-3df3-97f54db9a8de.png">

AWS環境にデプロイするパイプラインを容易に構築できます。
#### CodeBuild
マネージドなビルドを行うサービスです。
<img width="200 alt="codebuild-icon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/0337e02d-1692-d404-55de-fdf19ca85f8e.png">

#### CodeDeploy
マネージドな自動デプロイサービスです。
<img width="200 alt="codedeploy-icon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/89c8b77f-06ce-cc83-4d1a-4179288fa57d.png">


## 全体の構成
『Githubのmasterブランチへのコミットをトリガーにソースコードを取得（CodePipelineでの処理を開始）→CodeBuildでのビルド開始→CodeDeployのデプロイ開始』という流れとなっております。
![スクリーンショット 2020-02-16 2.10.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/afad9b0f-db2d-8205-f25b-0472e9507e60.png)

## 実践
### Githubリポジトリの準備
デプロイするソースコード自体はなんでも良いのですが、今回は[Golangのソースコード](https://github.com/tatsuyaHello/ci-cd-handson-pub)を用意しておきました。こちらのソースコードを使用して頂いても、独自のソースコードを使用して頂いても構いません。（独自ソースコードや異なる言語で作成する場合は、`buildspec.yml`ファイルを修正する必要があります。）

### デプロイ対象となるEC2やVPCの準備
今回、EC2やVPCはハンズオンのメインではないので、`cloudformation.yaml`というファイルを作成しておきました。こちらはAWSの ***infrastructure as code***にあたるもので、簡単に環境を構築できるようにしておきました。以下の手順に従ってCloudFormationを流してください。

1. AWSマネジメントコンソールにログインし（***東京リージョン***）、EC2サービスを選択する。
2. 左側の一覧から、キーペアを選択する。

![スクリーンショット 2020-02-16 1.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/4c404d17-c3db-72ca-8188-e17921f29df0.png)
3. キーペアの作成から、`Name: HandsonSampleKey`, `FileFormat: pem`で作成する(CloudFormationの記述と結びついているので、違う名前にしたければ、CloudFormationで`HandsonSampleKey`となっている点を任意の名前に変更する)。
![スクリーンショット 2020-02-16 1.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/a5f21a85-62a7-b382-bb33-8a71ca0b3353.png)
4. CloudFormationサービスを選択する。
5. スタックの作成→新しいリソースを使用(標準)を選択する。
6. 以下の画像のように選択をし、[Golangのソースコード](https://github.com/tatsuyaHello/ci-cd-handson-pub)のリポジトリに含まれる`cloudformation.yaml`ファイルを選択する。
![スクリーンショット 2020-02-16 0.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/8467584a-bae8-ba96-4003-5e593ed5ceeb.png)
7. 以下の画像のように`スタックの名前: Handson`と入力し、次へ進む。
![スクリーンショット 2020-02-16 0.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/37679be7-4226-3bf7-f69a-5ffedfb28486.png)
8. スタックオプションの設定とレビューは特に指定しなくて良いので、レビューまで進む。
9. 最後に以下の画像のようにチェックボックスのチェックを行い、スタックの作成を行う。
![スクリーンショット 2020-02-16 0.58.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/11deb33d-a8e3-6773-c196-e985fd938c46.png)
10. 以下の画像のようにCREATE_COMPLETEとなれば終了である。
![スクリーンショット 2020-02-16 1.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/bb99c65c-06e0-7feb-f369-809e17d028a4.png)
11. EC2のIPv4パブリックIPにアクセスし、Nginxが起動しているか確認する。
![スクリーンショット 2020-02-16 1.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/80f44d48-6281-733f-46ef-f23953968435.png)
![スクリーンショット 2020-02-16 1.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/b4a79f87-e698-109c-7d69-a9eb53362e27.png)



### 今回のハンズオンのメイン
#### CodeDeploy作成
1. CodeDeployサービスを選択し、アプリケーションの作成を選択する。
2. 以下の画像のように入力し、作成を選択する。

![スクリーンショット 2020-02-16 1.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/e99fc385-e20d-7b10-71d2-df973e174395.png)
3. 成功画面が表示されると、そのままデプロイグループの作成を選択する。
![スクリーンショット 2020-02-16 1.11.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/96fc8624-9ee2-7291-aabc-1b9b1bf4259d.png)
4. 以下の画像のように入力し、作成を選択する。
![スクリーンショット 2020-02-16 1.12.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/b2966f5f-2797-06cb-85d5-4152522178ad.png)
![スクリーンショット 2020-02-16 1.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/e2b79493-2e89-2b66-7fa8-48c0f3ce50b9.png)
![スクリーンショット 2020-02-16 1.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/ec5f8d93-0687-d664-d09f-632e82b87b6a.png)

#### CodePipelineの作成
1. CodePipelineサービスを選択し、パイプラインの作成を選択する。
2. 以下の画像のように入力し、次にを選択する。

![スクリーンショット 2020-02-16 1.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/42d8c70d-06c3-3984-9409-0d8de64e68db.png)
3. ソースプロバイダとして以下の画像のようにソースコード引っ張ってきたい場所を選択する。(リポジトリやブランチは自分のものを選択してください。この時、リポジトリやブランチに選択肢が表示されるまで少し時間がかかると思います。)
![スクリーンショット 2020-02-16 1.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/b6148c7f-c38e-ceee-04d0-c1cc1b520fd7.png)
4. CodeBuildの設定を行います。以下の画像のように選択し、プロジェクトを作成するを選択します。
![スクリーンショット 2020-02-16 1.32.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/1ce9a257-ff21-91a7-ca4a-ea093f44dedf.png)
5. 以下の画像のように入力・選択を行い、CodePipelineに進むを選択する。
![スクリーンショット 2020-02-16 1.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/f36a8ccb-3840-80e2-d810-fed1905e9a51.png)
![スクリーンショット 2020-02-16 1.33.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/928ac2ce-2cc6-4b1f-5df8-ec63919fc4d0.png)
![スクリーンショット 2020-02-16 1.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/417c95e0-556e-f130-4d60-2a5f258b4cbd.png)
6. デプロイステージの追加では、前項で作成したCodeDeployを使用します。以下の画像のように入力・選択を行う。
![スクリーンショット 2020-02-16 1.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/2608dd49-e111-ad88-83fa-d3953c83b6f5.png)
7. 以上で全ての設定が終了したので、作成ボタンを押します。
8. 正常に終了していれば、以下の画像のようにCodePipelineが稼働します。
![スクリーンショット 2020-02-16 1.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/8c9d0758-9a78-1fce-f157-d4fafff86ac3.png)
9. CodePipelineが全て終了後（５分程度）、EC2のエンドポイント（IP）に、`IPアドレス:8080/ping/json`とアクセスすると、以下の画像のようにレスポンスが返ってくると成功です。

![スクリーンショット 2020-02-16 1.49.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/3b21b147-f695-fb59-af54-dc2b57ed2c4a.png)

### まとめ
今回は、とりあえず手を動かしてCI/CDを体感したい人向けに、細かな用語等は説明しませんでしたが、少しでも作り込みたい(***appspec.yml***や***buildspec.yml***など)となった時に、必ず細かな知識等も必要になってきますので、そこは別記事等で学ぶことをお勧めします。