こんにちは、技術1課の多田です。
引き続き、AWS CodeDeploy(以下、CodeDeploy)と仲良くなりたいと思います。
前回は、CodeDeployの概要と、SampleDeploymentのデプロイを行いましたが、
今回は既存のEC2に対してアプリケーションのデプロイを行うCustomDeploymentに触れます。
それに併せて、必要な知識や技術について追っていければと考えております。
尚、過去記事は以下です。
- 【Code3兄弟シリーズ】CodeCommit « サーバーワークス エンジニアブログ
- 【Code3兄弟シリーズ】CodeDeploy~SampleDeployment編~ « サーバーワークス エンジニアブログ
以下、目次です。
- CodeDeploy Agentについて
- AppSpecファイルについて
- CustomDeploymentの実践
- まとめ
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に指示します。
0、 デプロイ用のバケットの準備
事前準備として今回のデプロイ用のS3バケットを作成します。
今回は、東京リージョンに「20160719-codedeplybucket」と言うバケットを作成しました。
1、デプロイ先のEC2の作成
EC2はIAMロールでS3のオブジェクトをGetとListできる権限を作成する時に付与してください。
今回は検証用途のため、「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のバケットでも確認してみます。
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枚目の画像にもあるように、すべての処理が成功しているのを確認できました。
5、デプロイしたコンテンツにアクセスする
デプロイしたコンテンツにアクセスしてみます。
確認用のコンテンツにアクセスができましたので、対象のインスタンスにデプロイしたことが確認できました。
まとめ
CustomDeploymentの実践は、いかがでしたでしょうか。
アプリケーションのソースコードをアップロードすれば、あとはCodeDeployが対象のサーバーへデプロイを行ってくれのは便利ですね。
次回は、いよいよCode3兄弟最後のサービス、AWS CodePipelineと仲良くなります。