6
3

More than 1 year has passed since last update.

[AWS CodeDeploy]自動デプロイを実装する

Posted at

はじめに

この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、ローカル開発環境からGitHubへgit pushし、mainブランチにマージした際にAWSのCodeDeployが自動デプロイする環境を構築しましたので、備忘録としてまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

自動デプロイ用のS3バケットを作成する

自動デプロイでは、CircleCIでビルドした結果のファイルをS3にアップロードします。
従って、自動デプロイ用のS3バケットを作成します。

1.一般的な設定

・バケット名:
一意な名前を設定してください。

・AWSリージョン:
東京リージョンを指定して下さい。

・オブジェクト所有者:
今回は、ACL無効を選択しています。

スクリーンショット 2022-03-22 17.51.03(2).png

2.バケットのブロックパブリックアクセス設定とバケットのバージョニング

・バケットのブロックパブリックアクセス設定:
パブリックアクセスをすべてブロックはチェックをしたままとします。

詳細設定は特に不要です。

・バケットのバージョニング:
CodeDeployで使用するS3バケットは、バージョニングを有効化しておく必要があります。

バージョニングを有効化にすることで、S3バケット内のオブジェクト(ファイル)を世代管理します。

同じオブジェクト名で上書きしても、古い世代のオブジェクトが別途保持されるようになります。

スクリーンショット 2022-03-22 17.31.28(2).png

3.その他の設定

・デフォルトの暗号化:
無効にするを選択してください。

・詳細設定:
無効にするを選択してください。

スクリーンショット 2022-03-22 17.32.50(2).png

以上でバケットの作成は終了です。

CodeDeploy用のIAMロールの作成

IAMサービスのアクセス管理から、ロールを選択し、ロール作成画面に移動してください。

1.信頼されたエンティティを選択

・信頼されたエンティティタイプ:
今回は、CodeDeployのロールを作成するのでAWSのサービスを選択してください。

・ユースケース:
検索欄からCodeDeployを探し、CodeDeployを選択して次のステップへ進みます。

スクリーンショット 2022-03-22 17.39.19(2).png

許可ポリシー一覧に、AWSCodeDeployRoleが追加されていることを確認してください。

スクリーンショット 2022-03-22 17.40.33(2).png

2.ロールの詳細を確認する

・ロール名:
特定のロール名を入力してください。

・ポリシー名:
AWSCodeDeployRoleが追加されていることを確認してください。

・タグ:
今回はタグの追加は行いません。

スクリーンショット 2022-03-22 17.42.39(2).png

3.追加されたロールを確認する

信頼されたエンティティ欄に、AWSのサービス: codedeployが表示されていればロールの作成は成功です。

スクリーンショット 2022-03-22 17.43.27(2).png

CodeDeployのアプリケーションとデプロイグループを作成

AWSのデプロイ自動化サービスであるCodeDeployの「アプリケーション」と「デプロイグループ」を作成します。

1.アプリケーションとデプロイグループについて

・アプリケーション:
複数のデプロイグループを束ねる存在として、CodeDeployではアプリケーションという概念が存在します。

・デプロイグループ:
デプロイグループとは、デプロイ方法に関する設定のことを指します。
今回は、1つのデプロイグループを作成します。

複数のデプロイグループを用意して、デプロイ方法に関する設定を複数個用意して使い分けることなども可能です。

2.アプリケーションの作成

CodeDeployサービスを選択後、アプリケーション作成画面に移動します。

・アプリケーション名:
100文字以内で特定のアプリケーション名を入力してください。

・コンピューティングプラットフォーム:
今回は、Amazon EC2にアプリケーションをデプロイするので、コンピューティングプラットフォームはEC2/オンプレミスを選択してください。

スクリーンショット 2022-03-22 22.14.33(2).png

アプリケーションを作成後、下のような画面が表示されアプリケーションの作成が成功しています。

スクリーンショット 2022-03-22 22.17.11(2).png

3.デプロイグループの作成

次に、デプロイグループの作成を実行します。

・デプロイグループ名:
特定のデプロイグループ名を入力してください。

・サービスロール:
自動デプロイを実装する際に作成したIAMロールを指定します。

・デプロイタイプ:
インプレースを選択してください。
インプレースでは、起動中のEC2インスタンスに対してデプロイを行います。

スクリーンショット 2022-03-22 22.21.55(2).png

・環境設定:
環境設定では、このデプロイに追加するAmazon EC2 Auto Scaling グループAmazon EC2 インスタンス、およびオンプレミスインスタンスの任意の組み合わせを選択します。

今回は、Amazon EC2 インスタンスを選択します。

タググループでは、デプロイ対象のEC2インスタンスを、タグを使って指定することが可能です。

今回対象となるEC2インスタンスにはNameタグを付けており特定の値が存在します。
従って、キーName値 - オプショナルデプロイ対象となるEC2インスタンス名を入力しています。

スクリーンショット 2022-03-22 22.30.20(2).png

・AWS Systems Managerを使用したエージェント設定:
AWS Systems Managerを使用して、CodeDeploy エージェントのインストールを設定し、更新をスケジュールできます。
更新の期間はデフォルトで14日間となっています。

注意点
CodeDeployで使用するには、Amazon EC2 およびオンプレミスインスタンスにCodeDeployエージェントがインストールされている必要があります。

AWS Systems Managerの詳細は、「AWS Systems Manager とは」をご確認ください。


・デプロイ設定:
デフォルトのCodeDeployDefault.AllAtOnceを選択してください。

CodeDeployDefault.AllAtOnceの場合、以下のように作用します。

インプレースデプロイの場合:
一度に可能な限り多くのインスタンスへアプリケーションリビジョンをデプロイするよう試みます。アプリケーションリビジョンが 1 つ以上のインスタンスにデプロイされる場合、デプロイ全体のステータスは Succeeded として表示されます。アプリケーションリビジョンがいずれのインスタンスにもデプロイされない場合、デプロイ全体のステータスは Failed として表示されます。
引用:CodeDeploy でデプロイ設定を使用する


・Load balancer:
ロードバランシングは無効の状態にしてください。

ロードバランシングとは、複数のEC2インスタンスがあり、それらをロードバランサー(負荷分散装置)で接続している場合に使用できるデプロイ方法です。
デプロイを開始するEC2インスタンスをロードバランサーから切り離し、リクエストを受け付けないようにします。
その間にデプロイを行い、デプロイの完了後、再度ロードバランサーに組み入れリクエストの受け付けを再開します。
これらを繰り返すことでサービスを停止させずにデプロイを実行することができます。

スクリーンショット 2022-03-22 22.43.45(2).png

アプリケーションとデプロイグループに関する詳細は、「EC2/オンプレミスコンピューティングプラットフォームのデプロイを作成する」をご確認ください。

EC2用のIAMロールの作成

自動デプロイでは、S3に保存されたビルド結果のファイルをEC2が取得します。
従って、EC2がS3からS3オブジェクトを取得できる権限を持っている必要があります。

下記では、デプロイ用のS3からファイルを取得可能な権限を持つIAMロールを作成し、EC2への割り当てを行なっています。

1.IAMロールの作成

・信頼されたエンティティを選択:
タイプの選択でAWSのサービスを指定します。

・ユースケース:
ユースケースではEC2を選択してください。

EC2用IAMロール作成.png

2.ポリシーの追加

今回は何も選択せずに次のステップへ進んでください。

スクリーンショット 2022-03-23 11.31.41(2).png

3.詳細の確認

詳細確認画面では、ロール名のみ入力してロールの作成を実行します。タグの追加等は行いません。

・ロール名:
特定の名前を入力してください。

スクリーンショット 2022-03-23 11.33.01(2).png

以上で、EC2用のIAMロールの作成は完了です。

EC2用のIAMロールにインラインポリシーの追加

1.インラインポリシーの追加の選択

EC2用のIAMロールの詳細画面に移動し、アクセス許可を追加メニューからインラインポリシーを作成を選択してください。

インラインポリシーの追加.png

2.JSONを利用してインラインポリシーを作成する

~各項目の説明~

・Version:
2012-10-17はポリシー言語の現行バージョンであり、常にVersion要素を含め、2012-10-17を設定する必要があります
このようにしない場合、このバージョンで導入されたポリシー変数などの機能は使用できません。

・Effect:
Effect 要素は必須であり、ステートメントの結果を許可または明示的な拒否のどちらにするかを指定します。
Effectの有効値は、AllowDenyです。

・Action:
Action要素では、許可または拒否される特定のアクションを記述します。

・Resource:
Resource要素は、ステートメントで取り扱う一連のオブジェクトをARNを使用して指定します。

リソース ARN の一部にワイルドカードを使用することができます。
ARNセグメント (コロンで区切られている部分) でワイルドカード文字 (* と ?) を使用でき、アスタリスク (*) は 0 個以上の文字の任意の組み合わせを表し、疑問符 (?) は任意の 1 文字を表します。

例)以下の例では、特定の Amazon S3 バケット内のすべての項目を示しています。
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"

スクリーンショット 2022-03-23 11.37.23(2).png

下記のコードをご利用ください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::CodeDeploy用のS3バケット名",
                "arn:aws:s3:::CodeDeploy用のS3バケット名/*"
            ]
        }
    ]
}

3.インラインポリシー名を入力し作成を実行する

ポリシーの確認画面で、S3サービスが許可されていることを確認した後に特定の名前を入力してポリシーの作成を実行します。

スクリーンショット 2022-03-23 11.38.26(2).png

IAMロール画面で、インラインポリシー(特定の名前)が表示されていればインラインポリシーの追加は完了です。

スクリーンショット 2022-03-23 11.39.11(2).png

4.IAMロールをEC2へアタッチする

実行中のEC2インスタンスを選択し、アクション->セキュリティ->IAMロールの変更の順で選択してIAMロールの変更画面に移動してください。

スクリーンショット 2022-03-23 11.40.51(2).png

IAMロールの変更画面の、IAMロールを選択メニューバーをクリックすると先ほど作成したEC2用のIAMロールが表示されるので選択して保存を実行します。

スクリーンショット 2022-03-23 11.41.10(2).png

以上で、EC2へのIAMロールの割り当ては完了です。

CodeDeployエージェントのインストール

CodeDeployを使ってEC2にデプロイを行うためには、EC2にCodeDeployエージェントをインストールする必要があります。

1.EC2へsshログイン後、Rubyをインストールする

まずは下記コマンドを実行してEC2へsshログインしてください。

ssh -i ~/.ssh/xxx-xxx-xxx.pem ec2-user@パブリックIPアドレス

sshログイン後、下記コマンドを実行してRubyをインストールしてください。

$ sudo yum install ruby -y

// 実行結果
完了しました!と表示されれば成功です

2.インストーラーのダウンロード

/home/ec2-userディレクトリにいる状態で、下記コマンドを実行してインストーラーをダウンロードしてください。

$ wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install

//実行結果
2022-03-23 07:25:09 (30.7 MB/s) - `install' へ保存完了 [17482/17482]
上記のような結果が表示されていれば成功です。

3.CodeDeployエージェントのインストール

下記のコマンドを実行してください。ただし実行結果は何も表示されません。

$ chmod +x ./install

上記コマンドを実行後、次に下記のコマンドを実行してください。

$ sudo ./install auto

// 実行結果
完了しました!
I, [2022-03-23T07:27:17.811937 #9225]  INFO -- : Update check complete.
I, [2022-03-23T07:27:17.812057 #9225]  INFO -- : Stopping updater.

上記のように表示されていればインストールは成功です。

4.CodeDeployエージェントの実行状態を確認

CodeDeployエージェントを使ってデプロイを行うためには、CodeDeployエージェントを起動させておく必要があります

CodeDeployエージェントはインストール後に自動的に起動しますので、起動状態を下記のコマンドで確認してください。

$ sudo service codedeploy-agent status

// 実行結果
The AWS CodeDeploy agent is running as PID 9309
上記のように表示されていればCodeDeployは実行中の状態であり問題ありません

CodeDeployエージェントに関する詳細は、CodeDeploy エージェントのインストールをご確認下さい。

CircleCI用のIAMユーザー作成

今回の自動デプロイ実装では、CircleCIで以下を実行する必要があります。

  • デプロイ用のS3バケットにビルド結果をアップロードする
  • CodeDeployにデプロイ開始を指示する

従って、これらを実行可能な権限を持つIAMユーザーを作成します。

1.IAMユーザー詳細の設定

・ユーザー名:
特定のユーザー名を入力してください。

・AWSアクセスの権限を選択:
今回は、アクセスキーIDとシークレットアクセスキーが必要なのでアクセスキー・プログラムによるアクセスを選択します。

circleci用のIAMユーザー作成.png

2.アクセス許可の設定

既存のポリシーを直接アタッチを選択後、AWSCodeDeployDeployerAccessという管理ポリシーを選択してください。

スクリーンショット 2022-03-23 16.50.24(2).png

3.ユーザーの詳細を確認

最後に確認画面でユーザー詳細を確認して間違いがなければユーザーを作成してください。

※タグの追加は行っていません。
スクリーンショット 2022-03-23 16.51.26(2).png

作成後、下のような画面でアクセスキーIDやシークレットアクセスキーが表示されていればIAMユーザーの作成は成功です。

重要
.csvのダウンロードを実行してファイルを保存してください。

スクリーンショット 2022-03-23 17.03.49(2).png

CircleCIへ環境変数を登録する

先ほど作成したIAMユーザーのアクセスキーIDシークレットアクセスキーを発行し、S3バケット名も含めてCircleCIの環境変数に登録します。
環境変数に登録することで、CircleCIではそれら環境変数を使ってAWS CLI(ターミナルのコマンドで操作)にてCircleCIで実行させたい2つの処理を実行することが可能となります。

1.Project Settingsの選択

CircleCIのPipelines画面の右上にあるProject Settingsを選択してください。

環境変数の登録.png

2.Environment Variablesの選択

Project Settings画面でEnvironment Variables(環境変数)を選択してください。

スクリーンショット 2022-03-23 17.00.39(2).png

3. 環境変数の登録

Add Environment Variablesを選択して環境変数を登録します。

選択後、下のような画面が表示されるので、アクセスキーIDシークレットアクセスキーデプロイ用のS3バケット名を登録します。

Name Value
AWS_ACCESS_KEY_ID CircleCi用IAMユーザーのアクセスキーID
AWS_SECRET_ACCESS_KEY CircleCi用IAMユーザーのシークレットアクセスキー
AWS_S3_BUCKET_NAME デプロイ用のS3バケット名

スクリーンショット 2022-03-23 17.42.56(2).png

登録後、下のような画面で登録した環境変数が表示されていれば大丈夫です。

スクリーンショット 2022-03-23 17.05.36(2).png

CircleCI用のIAMユーザーにインラインポリシーを追加

CircleCI用のIAMユーザーに対して、デプロイ用S3への書き込みを可能とするインラインポリシーを追加します。

1.IAMユーザーの詳細画面からインラインポリシーを追加する

該当するIAMユーザーの詳細画面で、インラインポリシーの追加を選択してください。

インラインポリシーの追加.png

2.JSONを利用してポリシーを作成する

JSONタブを選択した上で、下記のように入力し、ポリシーの確認を押してください。

ポリシー要素の詳細は、IAM JSON ポリシー要素のリファレンスをご確認ください。

スクリーンショット 2022-03-23 17.10.19(2).png

下記のコードをご利用ください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::CodeDeploy用のS3バケット名/*"
        }
    ]
}

3.作成したインラインポリシーの確認

確認画面で、許可されているサービス欄にS3があることを確認してください。

確認後、特定の名前を入力してポリシーの作成を実行します。

スクリーンショット 2022-03-23 17.10.53(2).png

実行後、IAMユーザー詳細画面でインラインポリシーが追加されていれば完了です。

スクリーンショット 2022-03-23 17.11.46(2).png

AppSpec Fileとシェルスクリプトの作成

次に、CodeDeployのデプロイ時の処理内容を定義するAppSpec Fileと、AppSpec Fileから使用されるシェルスクリプトを作成します。

ローカル環境のディレクトリ配下にppspec.yml関連するシェルスクリプトを作成していきます。

1.appspec.ymlの作成

ローカル環境に存在するデプロイ対象のディレクトリのトップにappspec.ymlというファイル名を作成します。
作成後、下記のようにコードを追記してください。

デプロイ対象のディレクトリ/appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /home/実行ユーザー名/特定のディレクトリ名

permissions:
  - object: /home/実行ユーザー名/特定のディレクトリ名
    owner: 実行ユーザー名
    group: 実行ユーザー名

hooks:
  AfterInstall:
    - location: ./scripts/after_install.sh
      timeout: 60
      runas: 実行ユーザー名

~項目の説明~

・version:
AppSpec Fileのバージョンを指定します。今回は0.0固定です。

・os:
デプロイ先のEC2インスタンスのOSを、linuxwindowsを指定します。

・files:
filesでは、デプロイ元デプロイ先のパスを指定します。

  1. source
    デプロイ元をsourceで指定します。
    sourceはファイルを参照し、指定されたファイルのみがインスタンスにコピーされます。
    /を指定することで、全てのファイルがデプロイ対象となります。

  2. destination
    デプロイ先をdestinationで指定します。
    destinationは、ファイルをコピーするインスタンス上の場所を識別します。
    今回は、EC2のデプロイ対象となるディレクトリを指定します。

・permissions:
permissionsでは、デプロイ先にコピーしたファイルの権限(パーミッション)をどのように変更するかを指定します。

  1. object
    objectには、権限を変更する対象のディレクトリまたはファイルを指定します。(必須)
  2. owner
    ownerには所有者を指定します。
  3. group
    groupにはグループを指定します。

・hooks:
hooksは、CodeDeployによるデプロイ処理の過程で、特定のタイミングで何かしらの処理を実行したい場合に使用します

今回のデプロイ条件

  • インプレースデプロイ(起動中のEC2インスタンスに対してデプロイを行う)
  • ロードバランサーを使用しない

このような条件の場合、デプロイ処理は下記のような順序で進んでいきます。

  1. ApplicationStop
  2. DownloadBundle(デプロイ対象のファイルをEC2内の一時的な保存場所に置く。hooks利用不可。)
  3. BeforeInstall
  4. Install(EC2内の一時的な保存場所からファイルをデプロイ先のパスに配置する。hooks利用不可。)
  5. AfterInstall
  6. ApplicationStart
  7. ValidateService

今回のhooksでは、デプロイ先のパスに最新のファイルが配置される4.Installの次の5.AfterInstallで、シェルスクリプトを実行する指示をしています。

hooksの詳細は、AppSpec の「hooks」セクションをご確認ください。

  1. location
    locationには、実行したいシェルスクリプトのパスを指定します。

  2. timeout
    timeoutに秒数を指定すると、実行するスクリプトの処理秒数が指定秒数を超えた場合にCodeDeployではデプロイ失敗と見なされるようになります。

  3. runas
    runasでは、スクリプトを実行するユーザー名を指定します。

AppSepc Fileの詳細は、CodeDeploy AppSpec ファイルのリファレンスをご確認ください。

シェルスクリプトの作成

AppSpec FileのAfterInstallイベントで使用されていたシェルスクリプトを作成します。

デプロイ対象となるディレクトリ配下にscriptsディレクトリを作成し、after_install.shを作成してください。
作成後、下記のようにコードを追記してください。

/特定のディレクトリ名/scripts/after_install.sh
#!/bin/bash

set -eux

cd ~/特定のディレクトリ名
php artisan migrate --force
php artisan config:cache

このシェルスクリプトは、実行ユーザーとして起動されるので/home/実行ユーザー名/特定のディレクトリに移動して、php artisanから始まる2つのコマンドを実行するように指定します

注意点
ディレクトリの指定を間違えると、CodeDeploy側でNo such file or directoryといったエラーが発生するので要注意です。

シェルスクリプトの権限の変更

$ ls -l scripts
// 実行結果
-rw-r--r-- 1 root root 89  3月 25 12:11 after_install.sh

上記のように、-rw-r--r--となっていたら、実行権限であるxが無いのでスクリプトとして実行できません。

実行権限を追加するため、下記コマンドを実行してください。

$ chmod +x scripts/after_install.sh // 権限を追加する

$ ls -l scripts

-rwxr-xr-x 1 root root 89  3月 25 12:11 after_install.sh

権限を追加後、-rwxr-xr-x のようにxが追加されていれば問題ありません。

CircleCIのdeployジョブの編集

ローカル開発環境の/.circleci/config.ymlに、下記のようなdeployジョブを追加します。

/.circleci/config.php
# 略
  deploy:
    docker:
      - image: circleci/php:7.4-node-browsers

    environment:
      AWS_DEFAULT_REGION: ap-northeast-1

    steps:
      - checkout
      - run: sudo composer self-update --1
      - restore_cache:
          key: composer-no-dev-v1-{{ checksum "composer.lock" }}
      - run:
          working_directory: 特定のディレクトリ名
          command: composer install -n --no-dev --prefer-dist
      - save_cache:
          key: composer-no-dev-v1-{{ checksum "composer.lock" }}
          paths:
            - vendor
      - restore_cache:
          key: npm-v1-{{ checksum "package-lock.json" }}
      - run:
          working_directory: 特定のディレクトリ名
          name: npm ci
          command: |
            if [ ! -d node_modules ]; then
              npm ci
            fi
      - save_cache:
          key: npm-v1-{{ checksum "package-lock.json" }}
          paths:
            - node_modules
      - run:
        working_directory: 特定のディレクトリ名
        command: npm run prod
      - run:
          working_directory: 特定のディレクトリ名
          name: archive artifacts
          command: zip -ryq ファイル名.zip .
      - aws-cli/install
      - run:
          working_directory: 特定のディレクトリ名
          name: upload artifacts to s3
          command: aws s3 cp ファイル名(上記コマンドで作成したファイルを指定).zip s3://${AWS_S3_BUCKET_NAME}
      - run:
          working_directory: 特定のディレクトリ名
          name: deploy to prod
          command: |
            aws deploy create-deployment \
            --application-name CodeDeployのアプリケーション名 \
            --deployment-group-name CodeDeployのデプロイグループ名 \
            --s3-location bucket=${AWS_S3_BUCKET_NAME},key=ファイル名.zip,bundleType=zip

orbs:
  aws-cli: circleci/aws-cli@1.0.0

workflows:
  version: 2
  build_deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only:
                - main

・各項目の補足

1.PHP関連パッケージのインストール

.php
- restore_cache:
          key: composer-no-dev-v1-{{ checksum "composer.lock" }}
      - run:
          working_directory: 特定のディレクトリ名
          command: composer install -n --no-dev --prefer-dist
      - save_cache:
          key: composer-no-dev-v1-{{ checksum "composer.lock" }}
          paths:
            - vendor

上記の箇所では、PHP関連パッケージのインストールを実行しています。

注意点

  • 開発環境用のパッケージは不要なため、--no-devオプションを付けています。
  • buildジョブでのキーと異なるキー名を付けてください。

2.JavaScript関連パッケージのインストール

.php
 - restore_cache:
          key: npm-v1-{{ checksum "package-lock.json" }}
      - run:
          working_directory: 特定のディレクトリ名
          name: npm ci
          command: |
            if [ ! -d node_modules ]; then
              npm ci
            fi
      - save_cache:
          key: npm-v1-{{ checksum "package-lock.json" }}
          paths:
            - node_modules

上記の箇所では、JavaScript関連パッケージのインストールを実行しています。

基本的には、bildジョブと同じステップ内容です。

3.JavaScriptのトランスパイル

.php
      - run: npm run prod

上記の箇所では、JavaScriptのトランスパイルを実行しています。

本番環境向けのためnpm run prodを実行するようにしています。


4.ビルド後のファイルをzipファイル化する

.php
- run:
          working_directory: 特定のディレクトリ名
          name: archive artifacts
          command: zip -ryq ファイル名.zip .

上記の箇所では、ビルド後のファイルをzipファイル化しています。

CodeDeployでデプロイするファイルは、zip, tar, tar.gzのいずれかの形式のファイルである必要があります

3つのオプションは下記のような内容となっています。

  1. rオプション ・・・下の階層のディレクトリも含めてzipファイル化します。
  2. yオプション ・・・シンボリックリンクをリンク先の実体のファイルとしてzipファイル化するのではなく、シンボリックリンクのままzipファイル化します。
  3. qオプション ・・・動作中のメッセージを表示させないようにします。

5.S3へファイルをアップロード

.yml
      - run:
          name: upload artifacts to s3
          command: aws s3 cp laravel-ci.zip s3://${AWS_S3_BUCKET_NAME}

上記の箇所では、AWS CLIを使ってS3にファイルをアップロードしています。

コマンドの詳細は、AWS CLI での高レベル (S3) コマンドの使用をご確認ください。


6.CodeDeployのデプロイメントの作成

.php
- run:
          working_directory: 特定のディレクトリ名
          name: deploy to prod
          command: |
            aws deploy create-deployment \
            --application-name CodeDeployのアプリケーション名 \
            --deployment-group-name CodeDeployのデプロイグループ名 \
            --s3-location bucket=${AWS_S3_BUCKET_NAME},key=ファイル名.zip,bundleType=zip

上記の箇所では、AWS CLIを使ってCodeDeployでのデプロイ処理を開始させています。

コマンドの説明

・ aws deploy create-deployment
デプロイメントの作成を行なっています。

・ --application-name
CodeDeployのアプリケーション名を指定します。

・ --deployment-group-name
CodeDeployのデプロイグループ名を指定します。

・ --s3-location bucket=${AWS_S3_BUCKET_NAME},key=ファイル名.zip,bundleType=zip
--s3-locationという必須オプションにbucket=${AWS_S3_BUCKET_NAME},key=laravel-ci.zip,bundleType=zipという引数を渡しています。

bukcetには、デプロイ元のファイルが保存されたS3バケット名(CircleCIに登録済の環境変数を使用する)を指定します。

keyには、デプロイ元のオブジェクト名(先ほど作成したzipファイル名)を指定します。

bundleTypeには、デプロイ元のオブジェクトがどのような形式のファイルかを指定します。


7.AWS CLIインストール(CircleCI Orbの使用)

.yml
- aws-cli/install
orbs:
  aws-cli: circleci/aws-cli@1.0.0

上記のステップでは、AWS CLIというAWSをコマンドで操作可能なツールのインストールを行なっています。

orbsの箇所に記述されているcircleci/aws-cli@1.0.0は、Orbと呼ばれるCircleCI専用のパッケージです。
circleci/aws-cli@1.0.0というCircleCI公式のOrbを、aws-cliという名前で使用することを明記しています。

AWS CLIを利用する際の注意点
AWS CLIを利用する場合、下記の3つの環境変数を設定しておく必要があります。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYは、CircleCIのプロジェクト環境変数に登録します。
AWS_DEFAULT_REGIONはconfig.ymlのenvironment:で設定します。

orbsに関する詳細は、「circleci/aws-cli@1.0.0」をご確認ください。

8.各ジョブの開始条件を定義

.php
workflows:
  version: 2
  build_deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only:
                - main

~各項目の説明~

・workflows
各ジョブの開始条件を定義しています。

・version
バージョン指定では、必ず2を指定します。

・build_deploy
ワークフローの名前を指しています。(自由に定義可能)
今回は、buildジョブとdeployジョブで構成されるワークフローなのでbuild_deployという名前にしています。

・requires
特定のジョブを開始する際に、正常に終了している必要のあるジョブを指定します。
今回は、deployジョブを開始する前にbuildジョブを終了している必要があるため、buildジョブを指定しています。
これにより、buildジョブが正常終了してから、deployジョブが開始するようになります

※buildジョブ内でテストを行なってからdeployジョブを開始するように設定しています。

・filters
filetersbranchesonlyと指定することで、特定のブランチへのプッシュの時のみ、ジョブが動作するように設定することができます。
今回は、mainブランチを指定することで、mainブランチにpush時(mainブランチにdevelopブランチをマージする)のみdeployジョブが開始されるようになっています

deployジョブの実行結果を確認

上記の流れで設定することで、自動デプロイの実装が可能となります。

実装後、CircleCIのdeployジョブを実行し、CodeDeployによるデプロイ結果を確認してみます。

1.deployジョブの実行

  1. ローカル開発環境のブランチ上で、コードを修正し、GitHubにpushしてください。
  2. GitHub上でプルリクエストを立て、developブランチにマージし、ローカル開発環境でorigin developをpullしてください。
  3. GitHub上でmainブランチにdevelopブランチをマージし、ローカル開発環境でorigin mainをpullしてください。

2.CircleCIのdeployジョブの確認

プルリクエストをマージしたら、CircleCIの画面でdeployジョブの実行結果を確認してください。
下記のように、deployジョブの実行が終了していれば成功です。

スクリーンショット 2022-03-27 12.10.18(2).png

3.CodeDeployの結果を確認

CodeDeployのデプロイメント画面で、実行中もしくは実行が終了したデプロイメント(デプロイ処理)を確認します。
下記のように、ステータスが成功になっていれば自動デプロイが完了しています。

デプロイメントの詳細の確認する際は、デプロイIDをクリックすることで詳細画面に移動できます。

スクリーンショット 2022-03-27 12.13.49(2).png

まとめ

長くなりましたが、以上で自動デプロイの実装は完了です。

今回、自動デプロイを実装することで、CircleCIでのブランチの扱い方や特定のジョブの設定、CircleCIとCodeDeployの関係性を深掘りすることができたと思います。

AppSepc Fileに関しては、まだまだ知識不足な点が多いため今後も継続して学習を進めていきたいと思います。

最後になりますが、もしエラーが発生した場合はコメントにてご報告して下さると非常に助かります。
私自身も、自動デプロイを実装するにあたり、数多くのエラーに悩まされたので少しぐらいは解決策を提示できると思います。
(後日、時間があれば実装の際に発生したエラーとその解決策も記載しておきます)

参考文献

CodeDeploy を使用してデプロイを作成する
CodeDeploy でデプロイ設定を使用する
AWS Systems Managerを使用して CodeDeploy エージェントをインストールする
AWS Systems Manager とは
IAM JSON ポリシー要素のリファレンス
Amazon Linux または RHEL 用の CodeDeploy エージェントをインストールする
CodeDeploy AppSpec ファイルのリファレンス
AWS CLI での高レベル (S3) コマンドの使用

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3