AWS再入門 AWS CodeDeploy 編
はじめに
こんにちは、川原です。
当エントリはDevelopers.IOで弊社AWSチームによる『AWS サービス別 再入門アドベントカレンダー 2015』の14日目のエントリです。昨日13日目のエントリは都元の『AWS Elastic Beanstalk』でした。 このアドベントカレンダーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
本日14日目のテーマは『AWS CodeDeploy』です。
目次
- サービスの基本的な説明
- デプロイ先サーバーの選択方法
- デプロイ方法の選択
- AppSpecファイル(appspec.yml)によるライフサイクルイベントの制御
- CodeDeployと連携するサービス
- サービス利用のユースケース
- デプロイ処理の起動&管理自動化
- Windowsカスタムメトリックス設定処理の自動化
- あわせて読みたい
- 公式情報
- Developers.IO関連エントリ
- さいごに
サービスの基本的な説明
CodeDeployとは、ざっくり言ってしまいますと、アプリケーションを構成している「ファイル群」をステージング環境や本番環境といった「グルーピングされたサーバー群」に定められた手順で自動配置するサービスです。
以下のような特徴があります。
- デプロイ対象ファイルの取得元としては、S3とgithubの2つのいずれかを指定
- デプロイ先のサーバー群をグルーピングし、そのグループ単位でデプロイ指示が可能
- EC2だけでなく、オンプレ環境のサーバーへのデプロイも可能
- ローリングデプロイなどのデプロイ方法を指定可能
- AppSpecファイル(デプロイの詳細を定義したファイル:appspec.yml)により、デプロイ前後に自分で作成したスクリプト処理を挟み込んで実行することが可能
- デプロイ時の履歴情報(いつ、どこにデプロイした、デプロイが成功した/失敗した、失敗時のエラーログ)を後から参照可能
デプロイ先サーバーの選択方法
デプロイ先のサーバーは下記3つの定義の組み合わせによって決まります。タグの場合であれば、タグの"キー名"と"値"を指定するとそれに合致するEC2インスタンスがデプロイ先の対象となります。
- タグが付与されたEC2(タグのキー名と値を指定)
- AutoScaleグループ
- オンプレミス環境のサーバー
EC2にデプロイする場合は、だいたい以下のような作業が必要になります。詳細は公式ドキュメントのこのあたりを参照ください。なお、AutoScaleグループのEC2についてはタグの付与は不要です。
- EC2にアタッチしているIAM Roleに対して適切にポリシーを設定する。
- CodeDeployエージェントをEC2にインストールする
- EC2にタグを付与する
オンプレミス環境のサーバーにデプロイする場合は事前に準備が必要になります。枝葉の準備作業を取り除きますと、だいたい以下のような作業が必要になります。詳細は公式ドキュメントのこのあたりを参照ください。
- AWS CLIをオンプレミス環境サーバーにインストールする
- CodeDeployエージェントをオンプレミス環境サーバーにインストールする
- オンプレミス環境サーバーをCodeDeployに登録する
- 登録したオンプレミス環境サーバーに対し(CodeDeploy上の)タグを付与する
デプロイ方法の選択
CodeDeployではデプロイするサーバーが複数存在した場合のデプロイ方法を選択することができます。デフォルトでは下記スライドにある3つから選択します。AWS CLI等を使用すると、この3つ以外のデプロイ方法を定義(カスタマイズ)可能です。なお、マネジメントコンソールからはこのカスタマイズは行えないようです1。
AppSpecファイル(appspec.yml)によるライフサイクルイベントの制御
AppSpecとはデプロイ処理においてどのファイル(ディレクトリ)をどこに配置するかを定義し、また、ファイル配置の前後に行われるライフサイクルイベントにおいてどのような処理(スクリプト)を実行するかを定義しており、CodeDeployの処理の中核を担う重要なファイルです。
ライフサイクルイベントとは、CodeDeployのデプロイ処理の最中に行われるいくつかのイベント(≒処理)です。
ライフサイクルイベントは下図の流れですすみます。中央にあるInstall
が実際にファイルをコピーするイベントになります。黄色の5つのイベントではユーザーが指定したスクリプトを実行させることができます。各イベントの詳細な説明については公式ドキュメントの「Q: デプロイのライフサイクルイベントとは何ですか?」をご参照ください。
AppSpecはYAML形式で記載します。以下は、公式ドキュメントに記載されているAppSpecファイルの例です。
version: 0.0 os: linux files: # You can specify one or more mappings in the files section. – source: / destination: /var/www/html/WordPress hooks: # The lifecycle hooks sections allows you to specify deployment scripts. ApplicationStop: # Step 1: Stop Apache and MySQL if running. – location: helper_scripts/stop_server.sh BeforeInstall: # Step 2: Install Apache and MySQL. # You can specify one or more scripts per deployment lifecycle event. – location: deploy_hooks/puppet-apply-apache.sh – location: deploy_hooks/puppet-apply-mysql.sh AfterInstall: # Step 3: Set permissions. – location: deploy_hooks/change_permissions.sh timeout: 30 runas: root # Step 4: Start the server. – location: helper_scripts/start_server.sh timeout: 30 runas: root
files:
部分にはデプロイするファイル・ディレクトリのコピー元(source:
)、コピー先(destination:
)を記載します。
hooks:
以下にはライフサイクルイベント(ApplicationStop:
、BeforeInstall:
など) 毎に、実行する処理を記載していきます。
AppSpecファイルの詳細については以下をご参照ください。
CodeDeployと連携するサービス
公式ドキュメントのService and Product Integrations with AWS CodeDeployにはCodeDeployと連携するサービスとその連携内容、連携に使用するスクリプトへのリンクがあります。自分が使っているサービスの有無とその連携内容を確認しておくとよいと思います。 以下に上記ページに記載されている連携サービスの一覧を示します。
- AWS Services
- Auto Scaling
- AWS CloudTrail
- AWS CodePipeline
- Elastic Load Balancing
- Ansible
- Atlassian – Bamboo & Bitbucket
- Chef
- Circle CI
- CloudBees
- CodeShip
- GitHub
- Jenkins
- Puppet Labs
- SaltStack
- Solano Labs
- Travis CI
サービス利用のユースケース
本サービスは文字通りデプロイのためのサービスです。そのため、ユースケースとしては基本的にはアプリケーションのデプロイになります。 ここでは弊社ブロクで紹介している王道のユースケースと、応用的なユースケースを紹介します。
デプロイ処理の起動&管理自動化
AWS CodeDeploy + Travis CI でデプロイを自動化する
こちらはCIツールであるTravis CIと連動させてデプロイのCI(Continuous Integration:継続的インテグレーション)を行うといういわば王道的なユースケースを紹介したブログです。 デプロイの中身の処理はCodeDepolyで自動化を行い、CodeDepolyの起動と実行管理をTravis CIで自動化するというものです。
Windowsカスタムメトリックス設定処理の自動化
AWS CodeDeployでWindowsのCloudWatchカスタムメトリクス設定を自動化する
こちらのブログは応用例の記事になります。 CodeDeployのエージェントプログラムをファイル配置処理に活用し、通常だと自動化のハードルが少々高いWindowsのカスタムメトリックスの設定処理(パフォーマンスモニター使用版の設定処理)の自動化に成功しています。
あわせて読みたい
公式情報
- AWS CodeDeploy Documentation from AWS公式サイト
- AWS CodeDeployがアジア・パシフィック(東京)で利用可能になりました from Amazon Web Services ブログ
- AWS Summit AWS Elastic Beanstalk, AWS OpsWorks, AWS CodeDeploy, AWS CloudFormation を使った自動デプロイ from AWS Summit Tokyo 2015
Developers.IO関連エントリ
紹介・入門エントリ
- [AWS新サービス] デプロイ管理サービス「AWS CodeDeploy」「AWS CodeCommit」「AWS CodePipeline」 #reinvent
- AWS CodeDeploy の AppSpec を読み解く
- 【速報】ついにAWS CodeDeployがEclipseで!AWS Toolkit for Eclipseに新しいプラグインが出ました
やってみた系
次のステップに進むためのエントリ
- LambdaでCodeDeployの自動デプロイ機能を実装する
- AWS CodeDeployでAuto Scaling Lifecycleを手軽に利用する #cmdevio
- CodeDeploy Agentから知るCodeDeployの処理の流れ
- CodeDeployによるバージョン管理とステージング
さいごに
以上、AWS サービス別 再入門アドベントカレンダー 14日目のエントリ『CodeDeploy』編でした。 CodeDeployは一見すると地味ですが、使いこなすと継続的なサービス提供を強力にサポートできると思います。皆さん、使いこなしていきましょう。 明日(12/15)は千葉淳のAmazon DynamoDB編です。お楽しみに!