サイトアイコン ENSAPIA engineering テックブログ

AWS コードデプロイ(Code Deploy)を利用してデプロイ自動化してみた

こんにちは。ポケコロツインでサーバ開発を担当しています SM です。

過去に新規プロジェクト立ち上げの時に AWS CodeDeploy を利用してデプロイを自動化してみたので、まとめてみました。

 

AWS CodeDeploy とは

AWS CodeDeploy は、Amazon EC2、AWS Fargate、AWS Lambda、オンプレミスで実行されるサーバーなど、さまざまなコンピューティングサービスへのソフトウェアのデプロイを自動化する、フルマネージド型のサービスです。

 

引用: AWS CodeDeploy(コードデプロイを自動化してアプリのアップタイムを管理)| AWS

 

AWS CodeDeployの主な特徴

 

 

などなど。。

 

CodeDeploy を利用すると簡単にデプロイができて管理しやすいということで使ってみました。ココネではデプロイは Jenkins だけで行うケースが多かったのですが、CodeDeploy を使ってみたら色んなオプションもあって設定だけで実現できたし、Jenkins でやっていたことが結構なくなってシンプルになりました。

では、本格的に CodeDeploy について調べていきましょう。

 

構成

 

 

AppSpec file

CodeDeploy にはデプロイアクションを定義するファイルがあります。AppSpec fileです。デプロイ作業のメインファイルと言います。コントロールタワーみたいな存在です。

EC2内の CodeDeploy Agent がこのファイル定義に沿ってデプロイします。

また、ライフルサイクルイベント というものがあって、イベントごとに実行するscriptファイルを定義します。

AppSpec file 定義例)

 

version: 0.0 # version
os: linux
files:
  - source: /
    destination: /home/ec2-user/ap
hooks:                                         # ライフルサイクルイベントによる処理を定義できる。
  ApplicationStop:                             # アプリケーションを停止するためのイベントです。
    - location: /script/application_stop.sh    # scriptを指定 - APサーバ停止
      timeout: 180                             # timeout時間過ぎると失敗になります。
      runas: ec2-user                          # scriptを実行するユーザーです。
  BeforeInstall:                               # S3のファイルをEC2に配置する前のイベントです。
    - location: /script/before_install.sh      # 既存ファイル削除
      timeout: 30
  AfterInstall:                                # S3のファイルをEC2に配置した後のイベントです。
    - location: /script/after_install.sh       # それぞれのパスにファイル移動
      timeout: 30
  ApplicationStart:                            # アプリケーションを開始するためのイベントです。
    - location: /script/application_start.sh   # APサーバが起動
      timeout: 60
      runas: ec2-user
  ValidateService:                             # デプロイ作業が終わったか確認するためのイベントです。
    - location: /script/validate_service.sh    # APサーバが起動したかをチェック
      timeout: 180
      runas: ec2-user

 

AppSpec File の詳しい内容はこちら(CodeDeploy AppSpec ファイルのリファレンス)

 

ライフサイクルイベント

デプロイ時に発生するイベントです。イベントは下のようなフローで発生されます。

Inplace デプロイと BlueGreen デプロイの場合は少し差があるので、注意が必要です。

 

 

AppSpec File は CodeDeploy Agent と一緒にEC2側でデプロイを実現していますね。

では、実際に CodeDeploy を動かずために何が必要か調べていきましょう。

 

準備するもの

 

 

 

 

 

※ … デプロイグループのオプションは色々あります。inplace, Blue/Green 設定、トラフィックの再ルーティング, Load balancer,トリガー(SNS), CloudWatch, ロールバックなどなどを設定できます。
詳細設定はこちら(CodeDeploy を使用したデプロイグループの作成)を参考にしてください。

 

これで CodeDeploy を使う準備ができました。

 

CodeDeploy のデプロイ作業の流れ

1. Jenkinsでデプロイ準備、開始

a. デプロイするコンテンツを作成(jar file, script file)
b. AppSpec file
c. アーカイブファイル(zip)にして S3 に Upload (zip fileはリビジョンといいます)

 

aws deploy push --application-name test-deploy --s3-location s3://codedeploy-test/deploy/alpha/revision-1.zip --description test-description --source ./ap

./ap には jar file, script file, AppSpec fileを置いておく。全部をアーカイブするため。

 

aws deploy create-deployment --application-name test-deploy --deployment-group-name test-group --s3-location bucket=codedeploy-test,key=deploy/alpha/revision-1.zip,bundleType=zip

 

2. デプロイ作業 – CodeDeploy と EC2 CodeDeploy Agent が働く

2. 1. AppSpec fileに定義に従って動作
2. 2. EC2 CodeDeploy Agentが S3 バケットからリビジョンファイル取得
2. 3. ZIPファイルを解凍
2. 4. ライフサイクルイベントに合わせてScriptファイルを実行させてapplicationを起動させる

これでデプロイは終了します。

 

まとめ

最後にもう一回まとめると、下記の 4 ステップだけでデプロイを行うことができます。

 

  1. AWS Console から CodeDeploy のアプリケーション、デプロイグループを作成して
  2. Jenkinsでデプロイするファイル(jar file, script file, AppSepc file)を用意して
  3. S3 にアップロードするコマンドでアーカイブファイルを S3 にあげて
  4. デプロイ開始するコマンドでデプロイ開始!

 

あとは CodeDeploy 側で代わりにデプロイしてくれるので、あとはゆっくり見守るだけでした。

 

やってみてわかったこと

 

個人的な結論を話すと最初の設定に少し手間取りますが、AWS を使うのであれば、様々オプションがある CodeDeploy が便利なのでおすすめです。

 

以上、ありがとうございました。

 


 

ココネでは一緒に働く仲間を募集中です。

ご興味のある方は、以下のリンクから是非ご応募ください。

 

ココネ株式会社 採用情報

サーバーサイドエンジニア(シニア)

モバイルバージョンを終了