CodeDeployと CodePipelineを使ってEC2に自動デプロイのメモ
2020/10/30
自動でEC2にソースをデプロイにチャレンジです。
次回やるときの為ののメモです。
自動デプロイの流れ
違うかもしれませんが、やりたいことはこんなイメージです。
- githubにpush
- CodePipelineをが起動
- codeDeployがEC2にpush
EC2の設定
CodeDeploy エージェントをインストールする
そのままではCodeDeployからEC2が操作できないのでAgentを追加する必要がある。
Amazon Linux 用または RHEL 用の CodeDeploy エージェントをインストールする - AWS CodeDeploy
$ 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
$ wget https://{bucket-name}.s3.{region-identifier}.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
サービスが正しく実行されているかは以下のコマンドで確認。
$ sudo service codedeploy-agent status
実行されていない場合、デプロイ時に以下のようなエラーが発生する。
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.
クライアント側の設定
CodeDeployにはappspec.yml
が必要で、同期させるファイルのルートに配置する必要がある。
version: 0.0
os: linux
files:
- source: /index.html
destination: /var/www/html/
hooks:
BeforeInstall:
- location: scripts/install_dependencies
timeout: 300
runas: root
- location: scripts/start_server
timeout: 300
runas: root
ApplicationStop:
- location: scripts/stop_server
timeout: 300
runas: root
- files
- source : 同期元
- destination : 同期先
- hooks
- BeforeInstall(例) : イベント名
- location : イベントで実行するファイル(場所)
- timeout : 実行時間
- runas : ユーザー
- BeforeInstall(例) : イベント名
scripts/install_dependencies
apacheをインストールする。
#!/bin/bash
yum install -y httpd
scripts/start_server
apacheを起動する。
#!/bin/bash
service httpd start
scripts/stop_server
apacheを停止する。
#!/bin/bash
isExistApp=`pgrep httpd`
if [[ -n $isExistApp ]]; then
service httpd stop
fi
イベントフック
デプロイは
-アプリケーションの停止
-アプリケーションファイルのダウンロード
-アプリケーションファイルのインストール
-アプリケーションの起動
という順で実行され、 次のデプロイライフサイクル図において、オレンジ背景の箇所が実際にフック処理を割り込めるイベントです。

※ ApplicationStopは2回目のデプロイ移行実行される
CodeDeployの設定
アプリケーションとデプロイグループを作成
CodeDeploy > アプリケーション > 「アプリケーションの作成」ボタンを押す。
アプリケーション名を入力して、コンピューティングプラットフォームに「EC2/オンプレミス」を選択。

デプロイグループを作成する。


githubを接続
CodeDeploy > アプリケーション > codedeploy-test > codedeploy-group-test > 「デプロイ作成」を押す。
必要項目を入力する。

デプロイする。

CodePipelineの設定
CodePipeline > パイプライン > 「パイプラインを作成する」ボタンを押す。
パイプラインの設定
「パイプライン名」を入力。
ソースステージを追加する
ソースプロバイダーに「Github」。 リポジトリ、ブランチに対象のものを設定。
ビルドステージを追加する
Dockerイメージを作成する必要がある場合や、javaなどのコンパイル言語の場合に利用します。
phpやrubyのソースを配置するだけであれば、ビルドが必要ないのでスキップします、
デプロイステージを追加する
デプロイプロバイダーはCodeDeployを選択。
その他の項目もCodeDeployで作成したものを設定する。
パイプラインを作成
codepipelineが作成されて、デプロイが実行されます。

CodePipelineを利用する場合はEC2にS3にアクセスする権限を与える必要があります。
権限がない場合は以下のようなエラーが発生します。

S3への権限を追加する。
