【Code3兄弟シリーズ】CodeDeploy~CustomDeployment編~

記事タイトルとURLをコピーする

こんにちは、技術1課の多田です。

引き続き、AWS CodeDeploy(以下、CodeDeploy)と仲良くなりたいと思います。
前回は、CodeDeployの概要と、SampleDeploymentのデプロイを行いましたが、
今回は既存のEC2に対してアプリケーションのデプロイを行うCustomDeploymentに触れます。
それに併せて、必要な知識や技術について追っていければと考えております。

尚、過去記事は以下です。

以下、目次です。

  1. CodeDeploy Agentについて
  2. AppSpecファイルについて
  3. CustomDeploymentの実践
  4. まとめ

CodeDeploy Agentについて

CodeDeployを使ってアプリケーションをデプロイするためには、エージェントが必要になります。
エージェントに対応しているOSは次の通りです。

EC2

  • Amazon Linux 2014.09.1, 2015.03, 2016.03.0, 2016.03.1
  • Ubuntu Server 14.04 LTS
  • Windows Server 2008 R2 and Windows Server 2012R2
  • Red Hat Enterprise Linux 7.x

オンプレミス

  • Ubuntu Server 14.04 LTS
  • Windows Server 2008 R2 and Windows Server 2012 R2
  • Red Hat Enterprise Linux (RHEL) 7.x


東京リージョンのAmazon Linuxインスタンスには、以下のコマンドを実行することでエージェントを導入できました。
公式でこちらにCodeDeply Agent導入の方法が記載されております。

$ sudo yum update
$ wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
$ cd /home/ec2-user
$ chmod +x ./install
$ sudo ./install auto

AppSpecファイルについて

AppSpec ファイルとは、CodeDeployがコピーするファイル及び実行するスクリプトを指定する、YAML形式の設定ファイルです。
AppSpec ファイルは、ファイルセクションとフックセクションの2つのセクションで構成されいますが、こちらは次のライフサイクルイベントの説明内で触れます。

ライフサイクルイベント

デプロイのライフサイクルイベントとは、予め定義された幾つかの段階のことを指します。
これにより、デプロイの中でコードを実行することが可能になっているのですが、現在サポートされているのは以下のものになります。

イベント名 説明
ApplicationStop デプロイの最初ライフルサイクルイベントで、リビジョンのダウンロード前から開始する
DownloadBundle エージェントがインスタンスの一時的なロケーションに、リビジョンファイルをコピーする
BeforeInstall ファイルの暗号化や現在のモジュールのバージョンのバックアップ作成等、Installタスク前に使う
Install エージェントが最終的な送信先フォルダにリビジョンをコピーする
AfterInstall アプリケーションの設定又はファイルの許可の変更に使用する
ApplicationStart ApplicationStopで停止したサービスを再起動するために使用する
ValidateService デプロイが正常に完了したことを検証する

例として、SampleDeploymentのappspec.ymlを使ってどんな処理を行っているかを見ていきたいと思います。

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

version

AppSpecファイルのバージョン指定のセクションです。必須のパラメーターになります。

os

デプロイするインスタンスのOSをしているするセクションです。必須のパラメーターになります。
Amazon Linux、Ubuntu Server、RHELの場合は、linuxと指定します。
Windows Serverの場合は、windowsと指定します。

files

ライフサイクルイベントの「Install」イベントの時に、インスタンスにコピーするファイル名を指定するセクションです。
sourceでは、ファイルまたはディレクトリをアプリケーションのファイル群(リビジョン)のルートディレクトリから相対パスで指定します。
destinationでは、sourceに指定したファイルまたはディレクトリを展開するティレクトリを絶対パスで指定します。
上記では、「/var/www/html」ディレクトリにリビジョンの「index.html」をデプロイしています。

permissions

上記のソース内にはないですが、permissionsセクションでは、インスタンスにfilesセクションで指定したアプリケーション群に権限を設定します。
このセクションは、Amazon Linux、Ubuntu Server、RHELインスタンスのみで使用でき、オプションで指定する箇所になります。

hooks

hooksセクションでは、ライフサイクルイベントで実行するスクリプトを指定します。
locationでは、リビジョン内にある、実行するスクリプトのパスを指定します。
timeoutでは、スクリプト実行時のタイムアウト時間を秒単位で指定します。指定時間を超過した場合、処理が失敗として中断されます。
runasでは、スクリプトの実行ユーザーを指定します。このオプションは、Amazon Linux または Ubuntu Server のみ指定可能です。

上記のソースでは、BeforeInstallイベントで「scripts/install_dependencies」、「scripts/start_server」の順番でrootユーザーで実行します。
スクリプト内では、Apahceのインストールと起動を行っています。
その後、ApplicationStopイベントで「scripts/stop_server」をrootユーザーで実行します。
スクリプト内では、httpdプロセスがある場合、Apacheの停止を行っています。

 

CustomDeploymentの実践

これより、Custom Deploymentを行います。
今回のアプリケーションのデプロイイメージは次の通りです。
AWS CLIでS3バケットにソースをアップロードし、EC2へソースファイルをダウンロードさせるようCodeDeployに指示します。

codedeploy-1

 

0、 デプロイ用のバケットの準備

事前準備として今回のデプロイ用のS3バケットを作成します。
今回は、東京リージョンに「20160719-codedeplybucket」と言うバケットを作成しました。

1、デプロイ先のEC2の作成

EC2はIAMロールでS3のオブジェクトをGetListできる権限を作成する時に付与してください。
今回は検証用途のため、「AmazonS3FullAccess」ロールをアタッチしています。
また、CodeDepoy Agentを導入してください。EC2を構築してからでも良いですが、UserDataとして導入するのが手っ取り早いと思います。

#!/bin/bash
sudo yum update
wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

サーバーが起動後、CodeDeploy Agentが導入されているかを確認します。

$ rpm -qa | grep codedeploy
codedeploy-agent-1.0-1.998.noarch

また、サービスが起動しているかと、自動起動設定の確認を行います。

$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 2525

$ chkconfig --list codedeploy-agent
codedeploy-agent    0:off    1:off    2:on    3:on    4:on    5:on    6:off

サービス起動と、自動起動設定も実施できていることを確認できました。

2、CodeDeployのCustom Deploymentの定義を設定

以下のようにCodeDployの定義を行いました。

  • アプリケーション名:CustomDeployment
  • デプロイグループ:CustomDeploymentGroup
  • デプロイ設定:CodeDeployDefault.OneAtATime
  • デプロイ対象インスタンス(1台):Amazon Linux(Amazon Linux AMI 2016.03.3 x86_64 HVM GP2)

また、上記の設定に加え、インスタンスに対するアクセス権限をCodeDeployに付与しておく必要があります。
今回は、次のような定義を行いました。

管理ポリシーには、「AWSCodeDeployRole」をアタッチしています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "autoscaling:CompleteLifecycleAction",
        "autoscaling:DeleteLifecycleHook",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeLifecycleHooks",
        "autoscaling:PutLifecycleHook",
        "autoscaling:RecordLifecycleActionHeartbeat",
        "ec2:DescribeInstances",
        "ec2:DescribeInstanceStatus",
        "tag:GetTags",
        "tag:GetResources",
        "sns:Publish"
      ],
      "Resource": "*"
    }
  ]
}

信頼関係として、次の定義を行っています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "codedeploy.ap-northeast-1.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3、S3にアプリケーションのファイルをアップロードする

CodeDeployでEC2にダウンロードするファイルをS3にアップロードします。尚、appspec.ymlは、Sample Deploymentと同じものを使用しています。
今回は、AWS CLIを使います。Amazon Linuxには標準で導入されているので、aws configureで設定後、そのまま利用します。
以下のコマンドを実行することで、S3にアプリケーションのファイルをアップロードできます。

$ aws deploy push --application-name CustomDeployment 
--s3-location s3://20160719-codedeplybucket/CustomDeploymentApp.zip 
--source /home/ec2-user/CustomDeploymentApp/

S3のバケットでも確認してみます。

codedeploy-2

S3にアップロードが完了すると、以下のようなデプロイ用のコマンドが出力されます。
自分がデプロイするためのコマンドに適宜修正して、EC2にデプロイします。

To deploy with this revision, run:
aws deploy create-deployment --application-name CustomDeployment --s3-location bucket=20160719-codedeplybucket,key=CustomDeploymentApp.zip,bundleType=zip,eTag=f16df4045b5249a1abc5fe67df24d4ee --deployment-group-name <deployment-group-name> --deployment-config-name <deployment-config-name> --description <description>

CodeDeployへ指示が成功すると以下のように、「deploymentId」が発行されますので、AWS マネジメントコンソール上にて状況確認を行います。

{
    "deploymentId": "d-HPU4DB22G"
}

4、CustomDeploymentが実施されているかの確認

AWS マネジメントコンソールにてCodeDeploymentのデプロイ状況を確認します。
deploymentIdをAWS マネジメントコンソールより確認すると、デプロイの詳細が確認できます。
これらのページのデプロイの進行状況が確認できます。
2枚目の画像にもあるように、すべての処理が成功しているのを確認できました。 codedeploy-4 codedeploy-5

5、デプロイしたコンテンツにアクセスする

デプロイしたコンテンツにアクセスしてみます。
確認用のコンテンツにアクセスができましたので、対象のインスタンスにデプロイしたことが確認できました。

codedeploy-6

 

まとめ

CustomDeploymentの実践は、いかがでしたでしょうか。
アプリケーションのソースコードをアップロードすれば、あとはCodeDeployが対象のサーバーへデプロイを行ってくれのは便利ですね。
次回は、いよいよCode3兄弟最後のサービス、AWS CodePipelineと仲良くなります。