🛫

CodeDeploy + Github(WordPress)でデプロイする

2021/12/09に公開

CodeDeployでGithubのリポジトリをデプロイしようとしたら、結構詰まったのでメモ。
不具合などを見つけ次第、随時更新します。

やりたかったこと

  • ec2内にあるwordpressに、githubからデプロイしたい
  • できればpushしたら自動でデプロイして欲しい(へ)

前提

基本的にやり方は公式ドキュメントに、wordpressの場合のデプロイ方法が記載されています。

このドキュメントでは/tmp以下にwordpressディレクトリをコピーし、それをS3に上げるやり方が書かれています。しかし私がやりたかったのはgithubからのデプロイだったため、そのあたりは不要です。できなくはないのですが、コストを少しでも抑えたかったので、安いと言われるS3も節約したかった…。
よって、こちらのCodeDeployとGithub連携の公式ドキュメントも併用して参考にします。

またCodeDeployをEC2で使用するには、EC2にCodeDeploy Agentを入れる必要があります。
今回は公式で推奨されているSystemsManagerを使用したインストール方法ではなく、従来のS3から直接ダウンロードする方式をとっています。


やり方

1. IAMにてロールの作成

まずはEC2とCodeDeployにつけるサービスロールを作成します。

【EC2につけるポリシー】
AmazonEC2RoleforAWSCodeDeploy

【CodeDeployにつけるポリシー】
AWSCodeDeployRole

2. EC2にロールを付与する

ロールを作成し終わったら、EC2にロールを付与します。
EC2のコンソールから対象のインスタンスを選択 > ロールの変更 > 作成したロールを選択

ロール変更ボタンの場所

3. CodeDeploy Agentのインストール

EC2とCodeDeployを連携させるために、CodeDeploy Agentをインストールします。
EC2コンソール上で対象のインスタンスにログイン or SSHにてログインした後、以下のコマンドを入力します。

$ sudo yum update
$ sudo yum install ruby
$ sudo yum install wget
$ wget https://[bucket-name].s3.[region-identifier].amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto   // 最新バージョンをインストール

コード内の [bucket-name][region-identifier] は、対象のEC2があるリージョンによって異なります。入る値については公式ドキュメントから確認できます。

インストールが終わったらCodeDeploy Agentが動作しているか確認します。
以下のようにでれば完了です。

$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 111111

4. CodeDeploy前準備

CodeDeployの設定を行う前に、紐付けたいgithubリポジトリに appspec.ymlファイルを作成する必要があります。配置する場所は、必ずルート直下にしてください。(しないとデプロイ時にエラーが起きます)

appspec.yml
version: 0.0
os: linux
files:
  - source: wordpress/
    destination: /var/www/wordpress

コードの意味は以下です

  • version: 作成したappspec.yml自体のバージョン。作成したばかりなので0.0
  • os: 使用しているOSによりますが、Amazon Linuxならlinuxと入力します
  • source: githubリポジトリのデプロイ対象ファイル or ディレクトリ
  • destination: EC2内のデプロイ先のファイル or ディレクトリ

5. CodeDeploy設定

アプリケーション作成

CodeDeployコンソールを開き、アプリケーションを作成します。

設定は以下のようにします。
アプリケーション名: 任意
コンピューティングプラットフォーム: EC2/オンプレミス


デプロイグループ作成

作成できたら、デプロイグループを作成。

【入力項目】
デプロイグループ名: 任意
サービスロール: 1で作成した、CodeDeploy用のロールを選択

デプロイタイプ: ここではインプレース
環境設定: EC2インスタンスを選択、タググループは対象のEC2を選択

AWS Systems Manager を使用したエージェント設定: 既にCodeDeploy Agentはインストール済みなので「なし」
デプロイ設定: CodeDeployDefault.AllAtOnece

Load balancer: EC2に設定している場合、対象のLoad balancerを選択

全て終了したら、デプロイグループを作成します。

デプロイ作成

デプロイを作成することで、ようやくデプロイが始まります。

【入力項目】
デプロイグループ: 先程作成したデプロイグループを選択
リビジョンタイプ: githubを選択。GitHubトークン名は、githubから取得します。

初めての場合のgithubのトークン取得は、以下を参考にしてください↓
github Docs

github連携が完了したら、以下の入力を行います。
リポジトリ名: 対象のリポジトリを入力します。形式は account名/repository名
コミット ID: デプロイしたい時点のコミットIDを入力。コミットIDは省略せず(×7文字)入力します。

追加のデプロイ動作設定: コンテンツの上書きを選択。既にあるファイルを上書きする際は、これを選択。
ロールバック設定の上書き: デプロイが失敗したときにロールバックするを選択。ロールバックしないと失敗した時に大変です。。

これで設定は完了です。デプロイを作成します。

デプロイ

成功すると全てのライフサイクルで成功ステータスになります。

失敗する場合は以下のコマンドでログを見ることができます。

less /var/log/aws/codedeploy-agent/codedeploy-agent.log

おまけ:デプロイ失敗集

結構デプロイが失敗して、詰まりました。。。

  1. The overall deployment failed because too many individual instances failed deployment...
    以下のエラーが発生。ログを確認してもそれっぽいエラーが見られなかったので、下のview eventからデプロイサイクルを見ます。そこから詳細がみれるので、解決の糸口が見つかるかもしれません。
The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems. (Error code: HEALTH_CONSTRAINTS
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/error-codes.html?icmpid=docs_acd_console#ecode_health_constraints



2. The CodeDeploy agent did not find an AppSpec file within the unpacked revision directory at revision-relative path "appspec.yml".

AppSpec作ったのに読み込まれていない模様…。特に理由がないのなら、これはEC2再起動で治る可能性が高いです。
詳しくはこちらのQiitaの記事



3. AllowTraficがいつになっても終わらない
これはEC2のヘルスチェックがfaildになっている可能性があります。
私の場合、ドキュメントルートがindex.phpではなく、デフォルトの / のままだったのが原因でした。修正したら、webサーバー(今回はApache)を再起動すれば解決です。

再起動させるコマンド
service httpd restart


+α: pushされたらデプロイする

CodePipelineを使用することで、
" mainブランチにpushされたら、自動デプロイさせる "
を実現できます。

やり方

  1. CodePipelineにアクセスし、パイプライン名を決めます。(東京リージョンの場合)

  2. githubのリポジトリと連携させる
    連携が完了したら、リポジトリとデプロイさせるブランチを選択します。

  3. buildを設定
    今回はビルドをパイプラインに入れたくないので、スキップします。

  4. デプロイ設定
    ここでは先ほど設定したCodeDeployの「アプリケーション名」と「デプロイグループ」を選択します。

  5. レビュー(確認画面)&パイプライン作成
    設定が完了し、問題なければパイプラインを作成します。
    問題なくチェックが通れば完了です🎉

【参考記事】
https://blog2.logical-dice.com/posts/2019/02/28/aws-code-deploy/
https://qiita.com/hibriiiiidge/items/5e1dddaff40f22e57341
CodeDeploy Agent関係
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-cli.html
https://dev.classmethod.jp/articles/codedeploy-agent-install-for-amazon-linux/
https://qiita.com/maruuuuu/items/7e8a158c7143bb06f77d

Discussion