AWS CodeDeployを使ってでデプロイを自動化してみた

Sep 1, 2015   #aws  #codedeploy 

はじめに

こんにちは、インフラエンジニア見習いのえのかわです。 今回は、AWS CodeDeployを使ってデプロイを自動化してみたのでログを残しておきます。 CodeDeployアプリケーションの作成は省略します。 下記のURLがとても参考になりました!

イメージ

図にするとこのような感じです。間違いがあったらご指摘ください。

  1. クライアントPCからプロジェクトを圧縮してS3にアップロード
  2. クライアントからCodeDeployのAPIを叩いてEC2(CodeDeploy Agent)にメタデータを渡す
  3. CodeDeploy AgentがS3にポーリングする
  4. S3から圧縮されたファイルをダウンロードして展開する

AppSpec.ymlの作成

appspec.ymlは以下のような形です。AppSpecについては、クラスメソッドさんの記事が大変参考になりました。

version: 0.0
os: linux
files:
  - source: /
    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

CodeDeployでプロジェクトをデプロイするには

@ryuzeeさんのブログにも紹介されている通り、最終的には以下のコマンドを打たなければデプロイができません。(ポチポチでデプロイできるのかな?)

deploy pushコマンドでプロジェクトのファイルをzipにしてS3にアップロードします。

$ aws deploy push \
>  --application-name CodeDeployTest \
>  --s3-location s3://enokawa-test-bucket/app.zip \
>  --source ./ \
>  --region ap-northeast-1
To deploy with this revision, run:
aws deploy create-deployment --application-name CodeDeployTest --s3-location bucket=enokawa-test-bucket,key=app.zip,bundleType=zip,eTag="XXXXXXXXXXXXXXXXXXXXXXXXX" --deployment-group-name <deployment-group-name> --deployment-config-name <deployment-config-name> --description <description>

deploy create-deploymentコマンドでDeploymentGroupのEC2にデプロイする。

$ aws deploy create-deployment \
>   --application-name CodeDeployTest \
>   --s3-location bucket=enokawa-test-bucket,key=key=app.zip,bundleType=zip,eTag="XXXXXXXXXXXXXXXXXXXXXXXXX" \
>   --deployment-group-name CodeDeployTest \
>   --region ap-northeast-1
{
    "deploymentId": "d-XXXXXXXXX"
}

シェルスクリプトの作成

毎回このコマンドを打つのは面倒なのでシェルスクリプトにしてみました。 例外処理などは書いていないです。ツッコミなどある方はgistに直接コメントするか、Twitterでメンション下さると嬉しいです!

デプロイの流れ

以下の流れでデプロイができたら理想的だなと思いました。

  1. ファイルを修正する
  2. ローカルで正しく修正されているかを確認する
  3. Gitでコミット/プッシュする
  4. deploy.sh実行
  5. 反映されているか確認

おわりに

AWS CodeDeployを用いることで、今までのデプロイ作業が少し楽になるかもしれません。Githubとの連携も可能らしいので、今後試してみたいと思います。