概要
AWS CodeDeployを初めて触ったので体験記的に残しておく。
今回はGithubで管理されているlaravelのコード郡をEC2にデプロイする。WebサーバーはApacheを使っている。
当該のEC2は下記の方法(一部PHPのバージョンなどは異なる)で構築し、手動git pullでコードの取得しEC2のパブリックDNSでブラウザからwelcome画面が開くことを確認できている。
前提
先に下記の記事で構築したCodePiplineに、本記事で作成するCodeDeployを紐づけて動作確認を行っている。
またCode三兄弟と言われるAWSリソースのざっくりとした役割分担を下記に簡単にまとめた。
基本的な設定項目
先に決定しておいたほうが良い内容を下記に記載しておく。
項目 | 制約や選択や内容 | 備考 |
---|---|---|
アプリケーション名 | 100文字以下で日本語不可 | CodeDepoloyのアプリケーション名 アプリケーション名とはデプロイ動作をグルーピングする最も外側の概念 |
コンピューティングプラットフォーム | 「EC2/オンプレミス」 or 「AWS Lambda」 or 「Amazon ECS」から選択 | デプロイ対象のリソースを選択 |
デプロイグループ名 | 100文字以下で日本語不可 | デプロイアプリケーションに所属する具体的なデプロイ動作の設定の名前 |
サービスロール名(CodeDeploy割当) | 64文字以下で日本語不可 +=,.@-_ などの特殊文字使用可 |
|
サービスロール説明(CodeDeploy割当) | 1000文字以下で日本語不可 +=,.@-_ などの特殊文字使用可 |
|
サービスロール名(EC2割当) | 64文字以下で日本語不可 +=,.@-_ などの特殊文字使用可 |
EC2にロール未設定の場合 |
サービスロール説明(EC2割当) | 1000文字以下で日本語不可 +=,.@-_ などの特殊文字使用可 |
EC2にロール未設定の場合 |
デプロイタイプ | 「インプレース」 or 「Blue/Green」 | デプロイ方法の選択 |
デプロイ設定 | 「CodeDeployDefault.OneAtATime」 or 「CodeDeployDefault.HalfAtATime」 or 「CodeDeployDefault.AllAtOnce」 もしくは自分で設定 |
「CodeDeployDefault.OneAtATime」→すべてのインスタンスを一括デプロイ 「CodeDeployDefault.HalfAtATime」→すべてのインスタンスを半分半分にデプロイ 「CodeDeployDefault.AllAtOnce」→一つのインスタンスのみデプロイ |
デプロイ先EC2のインスタンス名 | CodeDeployがデプロイする先のインスタンス指定で使用 | |
アクション名 | 100文字以下で日本語不可 | CodePiplineと紐付ける際のデプロイアクション名 |
流れ
- デプロイグループに割り当てるサービスロールの作成
- EC2に割り当てるサービスロールの作成
- CodeDeployアプリケーションの作成
- デプロイメントグループの作成
- CodeDeployエージェントをEC2にインストール
- AppSpecファイルの作成
- CodePiplineとの紐づけ
詳細
-
デプロイグループに割り当てるサービスロールの作成
- IAMを開き、左サイドバーの「ロール」をクリックする。
- ロールを作成をクリックする。
- AWSのサービスを選択し、「サービスまたはユースケース」で「CodeDeploy」を選択する。
- 「ユースケース」で「CodeDeploy」を選択する。
- 追加ポリシーを確認して問題なければ「次へ」をクリックする。
-
EC2に割り当てるサービスロールの作成
-
IAMを開き、左サイドバーの「ロール」をクリックする。
-
ロールを作成をクリックする。
-
AWSのサービスを選択し、「サービスまたはユースケース」で「EC2」を選択する。
-
「ユースケース」で「EC2」を選択する。
-
「許可を追加」にて
AWSCodeDeployRole
とAmazonS3ReadOnlyAccess
を検索し、付与する。 -
追加ポリシーを確認して問題なければ「次へ」をクリックする。
-
ロール名を
ec2-code-deploy
としてロールを作成する。 -
EC2の画面に移動し、デプロイ先インスタンスの詳細ページを開く。
-
「アクション」をクリックし「セキュリティ」→「IAMロールを変更」をクリックする。
-
先に追加した
ec2-code-deploy
のロールを割り当ててIAMロールの更新を行う。
-
-
CodeDeployアプリケーションの作成
- CodeDeployのサイドバーで「アプリケーション」をクリックする。
- アプリケーションの作成をクリックする。
- 下記の情報を入力・選択する。
- アプリケーション名
- コンピューティングプラットフォーム
-
デプロイメントグループの作成
- サイドメニューで「デプロイ」の「アプリケーション」をクリックし、先に作成したCodeDeployのアプリケーション名をクリックする。
- 「デプロイグループの作成」をクリックする。
- 各種情報を入力し、保存する。
-
CodeDeployエージェントをEC2にインストール
-
EC2インスタンスにssh接続する。
-
下記を実行してCodeDeployエージェントをEC2にインストールする。(東京リージョンの場合)
sudo yum update sudo yum install ruby sudo yum install wget cd /home/ec2-user wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install chmod +x ./install sudo ./install auto
-
下記を実行してインストールできて動作しているか確認する。
sudo service codedeploy-agent status
-
下記のようにでたらインストール完了となる。
The AWS CodeDeploy agent is running as PID
-
CodeDeployエージェントインストール後にEC2などのIAMいじった場合下記コマンドを実行してCodeDeployエージェントの再起動を都度実施する必要がある。
sudo service codedeploy-agent restart
-
-
AppSpecファイルの作成
- 実際にデプロイするときの動作を示すファイルを作成・記載していく。(Githubのリポジトリルートのappspec.ymlを特に設定せずともCodeDeployは勝手に見に行く。)
- appspec.ymlについてはこちらでちょっとだけ詳しく記載している。
- Githudで管理されているルートディレクトリに下記のファイルとディレクトリを追加する。
appspec.yml
scripts/
- 更に上記で追加した
scripts/
ディレクトリに下記のスクリプトファイルを追加する。scripts/application_stop.sh
scripts/before_install.sh
scripts/after_install.sh
scripts/application_start.sh
scripts/validate_service.sh
- それぞれ下記のように記載する。
-
appspec.yml
appspec.ymlversion: 0.0 os: linux files: - source: ./ destination: /var/www/html/test file_exists_behavior: OVERWRITE hooks: ApplicationStop: - location: scripts/application_stop.sh timeout: 60 runas: root BeforeInstall: - location: scripts/before_install.sh timeout: 60 runas: root AfterInstall: - location: scripts/after_install.sh timeout: 60 runas: root ApplicationStart: - location: scripts/application_start.sh timeout: 60 runas: root ValidateService: - location: scripts/validate_service.sh timeout: 60 runas: root
-
scripts/application_stop.sh
scripts/application_stop.sh#!/bin/bash # Apacheサーバーの停止コマンド sudo systemctl stop httpd
-
scripts/before_install.sh
scripts/before_install.sh#!/bin/bash # 既存のキャッシュや一時ファイルのクリーンアップ rm -rf /var/www/html/test/bootstrap/cache/*.php # 設定ファイルのバックアップ cp /var/www/html/test/.env /var/www/html/test/.env.backup
-
scripts/after_install.sh
scripts/after_install.sh#!/bin/bash # Laravelアプリケーションのディレクトリに移動 cd /var/www/html/test # Composerを使用して依存関係をインストール composer install --no-interaction --prefer-dist --optimize-autoloader # マイグレーション php artisan migrate --force # キャッシュのクリア php artisan cache:clear
-
scripts/application_start.sh
scripts/application_start.sh#!/bin/bash # Apacheサーバーの起動 sudo systemctl start httpd
-
scripts/validate_service.sh
scripts/validate_service.sh#!/bin/bash # ヘルスチェック系の処理
-
-
CodePiplineとの紐づけ
- こちらの記事で作成したCodePiplineの詳細ページを開く。
- 「編集する」をクリックする。
- 「編集する: Deploy」の「ステージを編集する」をクリックする。
- すでに設定されているS3のデプロイシーケンスを削除する。
- 「+アクションの追加」をクリックし、任意のアクション名を入力し、「アクションプロバイダー」のプルダウンで「AWS CodeDeploy」を選択する。
- 入力項目が増えるはずなのでそれぞれ入力・選択する。
- 「リージョン」 → アジアパシフィック(東京)
- 「入力アーティファクト」 → SourceArtifact
- 「アプリケーション名」 → 今回追加したCodeDeployのアプリケーション名
- 「デプロイグループ」 → 今回追加したデプロイグループ
- それぞれ入力できたら「完了」を押下して登録する。
-
動作確認
-
CodePiplineで監視しているリモートリポジトリに紐づくローカルリポジトリにて下記を実行し、空コミットの作成とpushを行う。(筆者の場合masterブランチが監視対象)
git commit -m '空コミット' --allow-empty git push origin master
-
CodePiplineが起動し、CodeDeployが無事に正常完了するかを監視する。
-
エラー終了する場合、下記の方法でログを確認する事ができる。
-
☆リンク☆
参考文献