CodeDeploy + Github(WordPress)でデプロイする
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
ファイルを作成する必要があります。配置する場所は、必ずルート直下にしてください。(しないとデプロイ時にエラーが起きます)
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
おまけ:デプロイ失敗集
結構デプロイが失敗して、詰まりました。。。
- 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されたら、自動デプロイさせる "
を実現できます。
やり方
-
CodePipelineにアクセスし、パイプライン名を決めます。(東京リージョンの場合)
-
githubのリポジトリと連携させる
連携が完了したら、リポジトリとデプロイさせるブランチを選択します。
-
buildを設定
今回はビルドをパイプラインに入れたくないので、スキップします。
-
デプロイ設定
ここでは先ほど設定したCodeDeployの「アプリケーション名」と「デプロイグループ」を選択します。 -
レビュー(確認画面)&パイプライン作成
設定が完了し、問題なければパイプラインを作成します。
問題なくチェックが通れば完了です🎉
【参考記事】
CodeDeploy Agent関係
Discussion