AWSのCI/CDサービスCodeDeploy、CodePipelineを試してみた


黒川さんの動画でCodeDeploy、CodePipelineを学んだので
活字でもハンズオン出来るように記事として書き起こしてみる。

参照：【はじめてのCI/CD】AWSでやってみるDevOps最初の一歩、CodeDeploy、CodePipelineを使った自動デプロイのハンズオン
https://www.youtube.com/watch?v=8mPm7jolnVk&t=6s


AWSのCodeシリーズの解説：
コードをサーバまで運んでくれるので便利
CodeDeploy、CodePipeline


github→codedeploy→internetgateway→ec2


このサービスを使うには３つの設定が必要。
・AWSのVPC内の設定
・githubクライアント側の設定
・code系の設定


--------------------------------------------------------------------------
##AWSのVPC内の設定
・ルートテーブルにインターネットゲートウェイへのルートテーブルを設定していること
・セキュリティグループでsshインバウンド設定許可がされていること
・NetworkACLはインもアウトも全て許可されていること

VPC設定の解説わからない場合はこちらで学ぼう
https://www.youtube.com/watch?v=aQpMBqn5mRY
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/46dd0847-6301-e5e5-0064-2520f3961887.jpeg)

--------------------------------------------------------------------------
###AWSのVPC内の設定1:
###EC2インスタンス制作手順（作っている人は飛ばしても良い）

ステップ1
・osはamazonlinux2を選択
ステップ2
・インスタンスタイプはt2microを選択

ステップ3
・ネットワーク：あらかじめ作成したインターネットゲートウェイ設定してあるvpcを

・自動割り当てパブリックip：有効を選択


・codedeployのロールをアタッチするためIAM作成
→awscodedeployroleを割り当てる
ロール名：awscodedeployrole
でロール作成

・IAMロール：awscodedeployroleを選択


ステップ4:ストレージの追加
・８Gデフォルトを選択


ステップ5:タグの追加
・キー：「name」を入力
・値：「codedeploydemo」を入力


ステップ6セキュリティグループ設定
・デフォルトのまま

・キーペア→作成したもの使用で→インスタンス作成

--------------------------------------------------------------------------

###AWSのVPC内の設定2:
###codedeployのエージェントをインストール


#作ったインスタンスに接続


#管理者権限で
sudo su -

#公式手順のコマンドをシェルで実行
CodeDeployエージェント実行コマンド
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/instances-ec2-create.html
Amazon Linux および RHEL の場合

#シェル作る
vi codedeploy.sh

```codedeploy.sh
#!/bin/bash
yum -y update
yum install -y ruby
cd /home/ec2-user
curl -O https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
```

//シェルの解説：
yum -y update #yumを最新のパッケージにアップデート
yum install -y ruby#rubyをインストール
カールコマンドでエージェントをダウンロード
aws提供のs3バケットからcodedeployのエージェントをインストールしてる。

リージョン別リソースキットバケット名
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/resource-kit.html#resource-kit-bucket-names
アジアパシフィック (東京)	aws-codedeploy-ap-northeast-1	ap-northeast-1


#シェルに実行権限付与
chmod +x codedeploy.sh

#シェル実行
sh codedeploy.sh


ちなみに、ステップ3:インスタンスの詳細設定で
高度な設定から、シェルスクリプトを貼り付けて起動させることも出来る。

--------------------------------------------------------------------------

###githubクライアントの設定:


以下のリポジトリを例として解説
https://github.com/KouheiKurokawa713/codedeploy


####!codedeployを使用するにはデプロイさせたいファイルと「appspec.yml」が必要
リポジトリの中身として、indexファイルを書き換えることで
index.htmlの背景色が変わりcodedeployが出来たかを確認する実験。


####appspec.ymlについての解説
・codedeployの仕様でappspec.ymlを同期させるディレクトリのルートに配置する必要がある。

・設定ファイル、同期させる先は何か？

```appspec.yml
version: 0.0
os: linux
files:
    - source: /index.html    #同期させる元は何か？
      destination: /var/www/html/    #同期させる先は何か？
      
hooks:    #codedeployが動作する合間に任意のシェルを実行する設定
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root

```
![ymlの説明.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/b27a5798-50e5-d63b-7617-85bc88a4791d.jpeg)


--------------------------------------------------------------------------

###Codedeployの設定:
###Codedeployの設定手順（作っている人は飛ばしても良い）


・awsコンソールからcodedeployメニューを開く→アプリケーションの作成

アプリケーションの作成
-アプリケーション名：test-codedeploy
-コンピューティングプラットフォーム：ec2オンプレミスを選択
![codedeployアプリの作成.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/929d7df3-9b89-8f20-7285-7ee476f5f67e.jpeg)


デプロイグループの作成
-デプロイグループ名の入力：test-deploygroup
-サービスロールの入力：用意されたものを使用→？？？


-デプロイタイプ：インプレースを選択

-EC2インスタンスのタググループ
 -キー:deploy
 -値:01

→デプロイグループを作成


```
??インプレースデプロイとは??
稼働中サーバに対して直接新しいアプリケーションを配置、再起動してしまう方法です。

??ブルーグリーンデプロイとは??
稼働中サーバ（ブルー）とは別のサーバ（グリーン）に対して新しいアプリを展開し動作確認を行います。

-EC2インスタンスのタググループ→タグに含まれるものならまとめてデプロイ可能？
```

・githubトークン名を入力しgithubに接続をクリック

![github接続.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/f9285057-a480-4ff0-aa85-e4a987f0fdf7.jpeg)


githubとcodedeployが紐づいたらリポジトリ名とコミットIDの入力フォームが出る。
-リポジトリ名:アカウント名/リポジトリ名を入力
-コミットID：最新のコミットのハッシュ値を取得して貼り付ける。

任意：

80番ポートを開く→

###パプリックIPを取得して、webブラウザにアクセス：
githubに置いてあったindex.htmlの青い背景ページがデプロイされてることが確認できる。
![青ページ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/4733533f-615d-d634-b4d1-9e4eef4aea03.jpeg)


---------------------------------------------------------------
##codedeployを使ってみよう

・vscodeにて変更したソースをgithubにpush

![黒ページpush.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/504b28a9-14aa-1e55-a56e-b9dfd7a3bb2a.jpeg)

・最新コミットのhash値をgithubから取得し、codedeploy画面に貼り付け


・codedeployを実行


・デプロイ成功を確認後、webにアクセスしソースのデプロイ成功を確認する。


---------------------------------------------------------------

##CodePipelineを設定しよう！


codedeployだけ設定してもソースをpushしてからいちいちhashを貼り付けて、
deployボタンを押す必要があるので面倒くさい。

codepipulineも設定すれば、
pushするだけで、awsに自動でデプロイ出来るようになるぞ！！



###CodePipelineの設定手順:

・awsコンソールからCodePipelineへ移動、CodePipelineの作成をクリック

・パイプラインの設定
-パイプライン名：test-pipelineと入力
-次へ
![パイプライン設定.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/ef435a07-c89a-7cc4-9efc-0040fe5041d1.jpeg)

・ソースステージを追加
-ソースプロパイダ：githubを選択
-githubに接続するをクリック
-リポジトリとブランチを入力
-次へ
![ソースステジ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/1e092c5c-6ced-c0d5-205d-52ae0a96e22a.jpeg)

・ビルドステージを追加する
-ビルドステージをスキップを選択
（コンパイル言語はビルドを挟む(java/c#)インタプリタ言語はビルドはさまない(php/ruby)）

・デプロイステージを追加する
![デプロイステージ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/ea424478-1466-992e-8f3c-18c8f7bfafb9.jpeg)


---------------------------------------------------------------

このままだとCodePipelin権限が足りずに失敗してしまう。
なのでCodePipelinはs3を介してやりとりするのでs3のロールポリシーをアタッチする。

![s3ロール.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/dbfb8aa6-0620-5a1c-7f5c-97dab094f0c5.jpeg)


再度、デプロイを行うと成功する。

![パイプライン成功.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/06029290-df24-2985-80f1-de7c3162bf05.jpeg)
![おわり.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/8b61977d-cd44-2af3-ea4f-6663383a3aa3.jpeg)


--------------------------------------------------------------------------


今回はgithubを介したが、awsだけで完結させたい場合は
「Code Commit」というサービスをつかうこと
![WS000032.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/8f31e07a-de0f-6c8a-8701-e46559e2b6a1.jpeg)