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

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

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

 

AWS CodeDeploy とは

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

 

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

 

AWS CodeDeployの主な特徴

 

  • AWS CodeDeployの主な特徴
  • 簡単にアプリケーションを繰り返しデプロイ
  • Auto Scalingと統合されてトラフィックの急増など定義する条件に応じてEC2 の容量をスケール
  • ローリングおよびブルー/グリーンの更新
  • 停止とロールバックが簡単

 

などなど。。

 

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

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

 

構成

 

  • Deployment Machine – Jenkins
    • デプロイの準備をする場所
  • S3, Github
    • Jenkins で用意したファイルを Uploadする場所です。
  • AWS CodeDeploy
    • デプロイをコントロール
  • Amazon EC2
    • デプロイするEC2ターゲット

 

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 を動かずために何が必要か調べていきましょう。

 

準備するもの

  • Deployment Machine – Jenkins
    • EC2 にインストールするファイル – Jar file, Script Fileなど
    • AppSpec file
  • S3 Bucket
    • 新しく生成しても、既存の特定のディレクトリを使っても良い
    • テスト用bucket名 : codedeploy-test
  • CodeDeployアプリケーション
    • AWS Console から CodeDeployページ行って下のように デプロイ → アプリケーション からアプリケーションを作成
    • テスト用アプリケーション名 : test-deploy

 

 

  • CodeDeploy アプリケーションのデプロイグループ作成
    • アプリケーションにデプロイグループを作成(※)
    • テスト用デプロイグループ名: test-group

 

 

  • Amazon EC2
    • CodeDeploy でデプロイする時には CodeDeploy Agent を実行しておく必要がある(CodeDeploy Agentをインストールする)。
    • CodeDeploy Agentは EC2インスタンスが CodeDeploy デプロイで使用できるようになるソフトウェアパッケージ。AppSpec File の指定に沿って動作を行う。

 

※ … デプロイグループのオプションは色々あります。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はリビジョンといいます)

 

  • コマンドで S3 アップロード(aws deploy command 使用)
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 command 使用)
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 側で代わりにデプロイしてくれるので、あとはゆっくり見守るだけでした。

 

やってみてわかったこと

  • BlueGreen デプロイだと auto-scaling 自体を新しく生成して既存の auto-scaling は削除される
    • BlueGreen デプロイ失敗するとゴミの auto-scaling グループが残ってしまう
  • Autoscaling imageの方に CodeDeploy Agent を Install してなくてハマった
  • IAM 権限まわりで少しハマった。公式 Document を参考して権限付与ちゃんとしましょう
  • BlueGreen デプロイすると AutoScaling Group の名前が変わる

 

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

 

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

 


 

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

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

 

ココネ株式会社 採用情報

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

Category

Tag

%d人のブロガーが「いいね」をつけました。