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

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


AWSのVPC内の設定

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

VPC設定の解説わからない場合はこちらで学ぼう
https://www.youtube.com/watch?v=aQpMBqn5mRY


AWSのVPC内の設定1:

EC2インスタンス制作手順(作っている人は飛ばしても良い)

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

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

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

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

・IAMロール:awscodedeployroleを選択

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

ステップ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


Codedeployの設定:

Codedeployの設定手順(作っている人は飛ばしても良い)

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

アプリケーションの作成
-アプリケーション名:test-codedeploy
-コンピューティングプラットフォーム:ec2オンプレミスを選択

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

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

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

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

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

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

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

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

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

任意:

80番ポートを開く→

パプリックIPを取得して、webブラウザにアクセス:

githubに置いてあったindex.htmlの青い背景ページがデプロイされてることが確認できる。


codedeployを使ってみよう

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

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

・codedeployを実行

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


CodePipelineを設定しよう!

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

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

CodePipelineの設定手順:

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

・パイプラインの設定
-パイプライン名:test-pipelineと入力
-次へ

・ソースステージを追加
-ソースプロパイダ:githubを選択
-githubに接続するをクリック
-リポジトリとブランチを入力
-次へ

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

・デプロイステージを追加する


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

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



今回はgithubを介したが、awsだけで完結させたい場合は
「Code Commit」というサービスをつかうこと