のぐそんブログ

暗いおじさんがシコシコ書くブログです。

CodeDeployと CodePipelineを使ってEC2に自動デプロイのメモ

自動でEC2にソースをデプロイにチャレンジです。
次回やるときの為ののメモです。

自動デプロイの流れ

違うかもしれませんが、やりたいことはこんなイメージです。

  1. githubにpush
  2. CodePipelineをが起動
  3. 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 : ユーザー
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

イベントフック

デプロイは アプリケーションの停止 アプリケーションファイルのダウンロード アプリケーションファイルのインストール アプリケーションの起動 という順で実行され、 次のデプロイライフサイクル図において、オレンジ背景の箇所が実際にフック処理を割り込めるイベントです。

f:id:nogson2:20201029202126p:plain

参考:CodeDeployのApplicationStopイベントフックはどう実行される?

※ ApplicationStopは2回目のデプロイ移行実行される

CodeDeployの設定

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

CodeDeploy > アプリケーション > 「アプリケーションの作成」ボタンを押す。

アプリケーション名を入力して、コンピューティングプラットフォームに「EC2/オンプレミス」を選択。

f:id:nogson2:20201029202105p:plain

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

f:id:nogson2:20201029223758p:plain f:id:nogson2:20201029223906p:plain

githubを接続

CodeDeploy > アプリケーション > codedeploy-test > codedeploy-group-test > 「デプロイ作成」を押す。

必要項目を入力する。

f:id:nogson2:20201029234233p:plain

デプロイする。

f:id:nogson2:20201029234616p:plain

CodePipelineの設定

CodePipeline > パイプライン > 「パイプラインを作成する」ボタンを押す。

パイプラインの設定

「パイプライン名」を入力。

ソースステージを追加する

ソースプロバイダーに「Github」。 リポジトリ、ブランチに対象のものを設定。

ビルドステージを追加する

Dockerイメージを作成する必要がある場合や、javaなどのコンパイル言語の場合に利用します。
phpやrubyのソースを配置するだけであれば、ビルドが必要ないのでスキップします、

デプロイステージを追加する

デプロイプロバイダーはCodeDeployを選択。
その他の項目もCodeDeployで作成したものを設定する。

パイプラインを作成

codepipelineが作成されて、デプロイが実行されます。

f:id:nogson2:20201030230541p:plain

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

f:id:nogson2:20201030231050p:plain

S3への権限を追加する。

f:id:nogson2:20201030232013p:plain