【CI/CD for EC2(Auto Scaling)】Blue/Greenデプロイをやってみた

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回は、CodePiplineを使い、EC2(AutoScaling)にBlue/Greenデプロイを行い、 Apacheのコンテンツ(index.html)を更新してみたため、ブログに記載いたします。

概要図

※番号はパイプライン処理の流れを記載しております。

ポイント

  • ALBとEC2にdefaultのSGを付与しておりますが、本来はカスタムしたSGを設定することをお勧めいたします。
  • 今回はビルド処理が不要なため、CodeBuildは省いております。
  • CodeDeployを使ってEC2にアプリをデプロイする場合、CodeDeploy AgentをEC2に導入する必要があります。
  • AutoScaling構成では、CodeDeploy Agentを事前に導入したカスタムAMIを利用するパターンと、ユーザーデータを使いEC2の初回起動時にCodeDeploy Agentを導入するパターンの2パータンあります[※1]。今回は後者の方法で実施いたします。

※1 https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/integrations-aws-auto-scaling.html

作業の流れ

  • ①IAMロールの作成
  • ②起動テンプレートの作成
  • ③AutoScalingの作成
  • ④CodeCommitの作成
  • ⑤CodeDeployの作成
  • ⑥CodePiplineの作成
  • ⑦動作確認

①IAMロールの作成

EC2,CodeDeployで利用するIAMロールを作成いたします。

①-① EC2のIAMロール

AmazonS3FullAccessのポリシーをアタッチしたIAMロールを作成します。

信頼関係は以下の通りです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "ec2.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

①-② CodeDeployのIAMロール

AWSCodeDeployRoleというマネージドポリシーをアタッチしたIAMロールを作成します。

信頼関係は以下の通りです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "codedeploy.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

②起動テンプレートの作成

②-①起動テンプレートの画面を開きます。

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LaunchTemplates:

②-②起動テンプレートを作成を押下します。

②-③起動テンプレート名を任意の名前で設定します。

※起動テンプレートは単体でも利用できるのですが、単体利用とAutoScalingで利用する場合で必須になる項目が異なるため、ガイダンスにチェックを付けると良いです。

②-④使用するAMI(今回はAmazon Linux2の最新)および任意でタイプのインスタンスタイプを設定します。

②-⑤高度な詳細まで進み、IAMインスタンスプロファイルに①で作成したEC2用のIAMロールを設定します。

②-⑥ユーザーデータの設定を行い、起動テンプレートを作成を押下します。

#!/bin/bash

### CodeDeploy導入の事前準備
sudo yum install ruby -y
sudo yum install wget -y

### CodeDeployインストーラーのダウンロード
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install

### CodeDeployのインストール
chmod +x ./install
sudo ./install auto

### httpdのインストールおよび起動
sudo yum install httpd -y
systemctl start httpd

参考: Amazon Linux または RHEL 用の CodeDeploy エージェントをインストールする - AWS CodeDeploy

③Auto Scalingの作成

③-① Auto Scalingの画面を開きます。

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#AutoScalingGroups:

③-② Auto Scalingグループを作成するを押下します。

③-③ Auto Scalingグループ名および起動テンプレートを設定します。

③-④ VPCとサブネットを設定します。

③-⑤新しくALBをInternet-fancingで作成します。

③-⑥ 適切なサブネットおよびターゲットを作成するを設定し、後はデフォルトでAutoScalingグループを作成します。

③-⑦ 作成されたALBのSGを追加します。

デフォルトでは、defaultのSGしか付与されていないため、以下のように必要なアクセス許可ルールを設定したSGを追加します。

③-⑧ ALBのFQDNにアクセスできるか確認します。

以下の画面が表示されればOKです!

④コンテンツ(index.html)およびappspec.ymlの作成

  • index.html
  • appspec.yml

④-① コンテンツの作成

index.htmlという名前でファイルを作成します。

  • index.htmlの中身
<!DOCTYPE html>

<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Hello</title>
</head>
<body>
  Hello World!!
</body>
</html>

④-②appspec.ymlの作成

appspec.ymlは、CodeDeployがEC2にデプロイする際の定義書になります。 今回は、index.htmlをApacheのドキュメントルートである/var/www/htmlに配置するという定義書になります。

  • appspec.yml
version: 0.0
os: linux
files:
  - source: index.html
    destination: /var/www/html

⑤CodeCommitの作成

⑤-① リポジトリを作成する画面を開きます。

https://ap-northeast-1.console.aws.amazon.com/codesuite/codecommit/repository/create?region=ap-northeast-1

⑤-② 任意の名前でリポジトリを作成します。

⑤-③ リポジトリを押下するとCodeCommitへの接続方法が記載されているため、任意の方法で接続します。

私は、HTTPS (GRC)という接続方法で接続しました。クレデンシャルの設定とgit-remote-codecommitが導入されていれば以下のコマンドでクローン可能です。

[master] #  git clone codecommit::ap-northeast-1://fk-test-repository
Cloning into 'fk-test-repository'...
warning: You appear to have cloned an empty repository.
[master] #

⑤-④ コンテンツおよびappspec.ymlをアップロードします。

[master] #  pwd
/fk-test-repository
[master] #  ls -lrt
total 8
-rw-r--r-- 1 root root  84 Jul 29 07:06 appspec.yml
-rw-r--r-- 1 root root 136 Jul 29 07:06 index.html
[master] #  git add appspec.yml index.html
[master] #  git commit -m "First Commit"
[master (root-commit) 398befa] First Commit
 2 files changed, 16 insertions(+)
 create mode 100644 appspec.yml
 create mode 100644 index.html
[master] #  git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 450 bytes | 225.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To codecommit::ap-northeast-1://fk-test-repository
 * [new branch]      master -> master
[master] #

⑥CodeDeployの作成

⑥-① アプリケーションを作成する画面を開きます。

https://ap-northeast-1.console.aws.amazon.com/codesuite/codedeploy/application/new?region=ap-northeast-1

⑥-②アプリケーション名を任意の名前で、コンピューティングプラットフォームをEC2/オンプレミスで作成します。

⑥-③デプロイグループの作成を押下します。

⑥-④ デプロイグループ名および①で作成したCodeDeploy用のサービスロールを設定します。

⑥-⑤ デプロイタイプをBlue/Green、環境設定をAuto Scalingグループの自動コピー、作成したAuto Scaling グループを設定します。

⑥-⑥ターゲットグループを設定し、デプロイグループを作成します。

⑦CodePiplineの作成

⑦-① パイプライン作成の画面を開きます。

https://ap-northeast-1.console.aws.amazon.com/codesuite/codepipeline/pipeline/new?region=ap-northeast-1

⑦-② 任意の名前でパイプライン名を設定します。

⑦-③ 作成したリポジトリ名を指定及びブランチ名を設定します。

⑦-④ ビルドステージはビルドしないため、スキップします。

⑦-⑤ アプリケーション名およびデプロイグループを設定し、パイプラインを作成します。

⑧動作確認

⑧-①パイプラインを作成したと同時にBlue/Greenがデプロイされるため、しばらくしてからALBにアクセスします。

以下の画面が表示されればOKです!!

補足

Auto Scalingグループを見てみるとCodeDeployにより新しいAuto Scalingグループが作成されていることが分かります。

また今回は、Blueの環境を1時間後に置換するというデフォルトのデプロイ設定にしておりますが、Greenの環境の確認が完了したら、 デプロイの画面から終了を押すことで強制的にステップ4に以降し、既存のAuto Scaling グループを削除することも可能です。

Auto Scalingグループを確認すると削除中になっていることが分かります。

終わりに

今回は、CodePiplineを使い、EC2(AutoScaling)にBlue/Greenデプロイを行う方法を記載いたしました。

どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。