AWS再入門 AWS CodeDeploy 編

2015.12.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、川原です。

当エントリはDevelopers.IOで弊社AWSチームによる『AWS サービス別 再入門アドベントカレンダー 2015』の14日目のエントリです。昨日13日目のエントリは都元の『AWS Elastic Beanstalk』でした。 このアドベントカレンダーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

本日14日目のテーマは『AWS CodeDeploy』です。

目次

サービスの基本的な説明

CodeDeployとは、ざっくり言ってしまいますと、アプリケーションを構成している「ファイル群」をステージング環境や本番環境といった「グルーピングされたサーバー群」定められた手順で自動配置するサービスです。

以下のような特徴があります。

  • デプロイ対象ファイルの取得元としては、S3とgithubの2つのいずれかを指定
  • デプロイ先のサーバー群をグルーピングし、そのグループ単位でデプロイ指示が可能
  • EC2だけでなく、オンプレ環境のサーバーへのデプロイも可能
  • ローリングデプロイなどのデプロイ方法を指定可能
  • AppSpecファイル(デプロイの詳細を定義したファイル:appspec.yml)により、デプロイ前後に自分で作成したスクリプト処理を挟み込んで実行することが可能
  • デプロイ時の履歴情報(いつ、どこにデプロイした、デプロイが成功した/失敗した、失敗時のエラーログ)を後から参照可能

デプロイ先サーバーの選択方法

デプロイ先のサーバーは下記3つの定義の組み合わせによって決まります。タグの場合であれば、タグの"キー名"と"値"を指定するとそれに合致するEC2インスタンスがデプロイ先の対象となります。

  • タグが付与されたEC2(タグのキー名と値を指定)
  • AutoScaleグループ
  • オンプレミス環境のサーバー

スクリーンショット_2015-12-13_19_29_55

EC2にデプロイする場合は、だいたい以下のような作業が必要になります。詳細は公式ドキュメントのこのあたりを参照ください。なお、AutoScaleグループのEC2についてはタグの付与は不要です。

  1. EC2にアタッチしているIAM Roleに対して適切にポリシーを設定する。
  2. CodeDeployエージェントをEC2にインストールする
  3. EC2にタグを付与する

オンプレミス環境のサーバーにデプロイする場合は事前に準備が必要になります。枝葉の準備作業を取り除きますと、だいたい以下のような作業が必要になります。詳細は公式ドキュメントのこのあたりを参照ください。

  1. AWS CLIをオンプレミス環境サーバーにインストールする
  2. CodeDeployエージェントをオンプレミス環境サーバーにインストールする
  3. オンプレミス環境サーバーをCodeDeployに登録する
  4. 登録したオンプレミス環境サーバーに対し(CodeDeploy上の)タグを付与する

デプロイ方法の選択

CodeDeployではデプロイするサーバーが複数存在した場合のデプロイ方法を選択することができます。デフォルトでは下記スライドにある3つから選択します。AWS CLI等を使用すると、この3つ以外のデプロイ方法を定義(カスタマイズ)可能です。なお、マネジメントコンソールからはこのカスタマイズは行えないようです1

AppSpecファイル(appspec.yml)によるライフサイクルイベントの制御

AppSpecとはデプロイ処理においてどのファイル(ディレクトリ)をどこに配置するかを定義し、また、ファイル配置の前後に行われるライフサイクルイベントにおいてどのような処理(スクリプト)を実行するかを定義しており、CodeDeployの処理の中核を担う重要なファイルです。

ライフサイクルイベントとは、CodeDeployのデプロイ処理の最中に行われるいくつかのイベント(≒処理)です。 ライフサイクルイベントは下図の流れですすみます。中央にあるInstallが実際にファイルをコピーするイベントになります。黄色の5つのイベントではユーザーが指定したスクリプトを実行させることができます。各イベントの詳細な説明については公式ドキュメントの「Q: デプロイのライフサイクルイベントとは何ですか?」をご参照ください。

CodeDeploy LifeCycle

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のカスタムメトリックスの設定処理(パフォーマンスモニター使用版の設定処理)の自動化に成功しています。

あわせて読みたい

公式情報

Developers.IO関連エントリ

紹介・入門エントリ

やってみた系

次のステップに進むためのエントリ

さいごに

以上、AWS サービス別 再入門アドベントカレンダー 14日目のエントリ『CodeDeploy』編でした。 CodeDeployは一見すると地味ですが、使いこなすと継続的なサービス提供を強力にサポートできると思います。皆さん、使いこなしていきましょう。 明日(12/15)は千葉淳のAmazon DynamoDB編です。お楽しみに!


  1. 公式ドキュメントに以下の記載がありました。"You can use the AWS CLI, the AWS CodeDeploy APIs, or an AWS CloudFormation template to create deployment configurations. You cannot use the AWS CodeDeploy console."