Posted on Nov 13
こんにちは、Cloud Automatorの柳瀬です。
前回の記事でCodeDeployを使うまでの準備が整ったので、今回はリポジトリを用意してEC2インスタンスにデプロイをしてみたいと思います。
デプロイするサンプルとして、GitHubにリポジトリを用意しました。
scriptsディレクトリにはには後述するCodeDeployのライフサイクルで実行したいスクリプトを配置し、srcディレクトリには実際にデプロイするhtmlファイルをまとめています。README.mdは説明不要かと思いますが、ここで重要になってくるのがappspec.ymlです。
$ tree
.
├── README.md
├── appspec.yml
├── scripts
│ ├── httpd_start.sh
│ └── install.sh
└── src
├── error.html
└── index.html
2 directories, 6 files
appspec.ymlの記載方法は公式ドキュメントで紹介されていますが、アプリケーションのソースコードをどこに配置するか、どのような権限で付与するか、CodeDeployのライフサイクルでどのような事を実行するかを定義する中心部分です。
versionセクションには執筆時点では0.0を記載するようになっており、osセクションにはlinuxもしくはwindowsと指定します。sourceセクションでデプロイするアプリケーションの場所を指定し、hooksセクションではライフサイクルイベントで実行されるスクリプトを指定します。hooksセクションを上手に使うとサービスのダウンタイムを最小限にしてデプロイが出来そうです。
今回用意したappspec.ymlは以下のようになっており、アプリケーションのデプロイ前にinstall.shとhttpd_start.shを実行します。
リポジトリがGitHub上に用意出来たら、CodeDeployの管理単位であるApplicationとDeployment Groupを作成します。
Management ConsoleでCodeDeployにアクセスしたら下記画像のように表示されるので、Get Started Nowをクリックします
Custom DeploymentをチェックしてSkip Walkthroughをクリックします
Application NameとDeployment Groupに任意の名前をつけます
次にこのDeployment Groupでデプロイ対象とするEC2インスタンスをタグで指定します
Deployment Configurationでデプロイを実行するルールを、Service Role ARNで前回作ったOpsWorksのIAM Roleを指定してApplicationを作成します
いよいよGitHub上に配置されたリポジトリと連携してデプロイをします
先ほど作成したDeployment Groupを展開し、Deploy New Revisionをクリックします
Revision TypeでMy application is stored in GitHubにチェックします
Connect to Githubをクリックし、GitHubにログインをします
Repository Nameとデプロイ対象のCommit IDを指定して、Deploy Nowをクリックします
デプロイが実行され、成功したらSucceededと表示されます
以下のようにテストページが表示されることを確認して下さい
GitHubのPublicなリポジトリで動作確認をしましたが、実際の運用を考えるとPrivateなリポジトリやBitbucket、その他Gitサーバへの対応が気になりました。実運用を想定すると、AppSpec Fileに定義するhooksセクションで定義する内容をきちんと設計した方が良さそうです。今回の構成はDeployment Groupが1つですが、いくつかのレイヤーを持ってるアプリケーションの場合はDeployment Groupを使い分けるイメージでしょうか。
CodeDeployはOpsWorksと比較すると対象としているレイヤーが違うようですし、タグでデプロイ対象を決めているので、OpsWorkで構成管理したStackにデプロイということも出来そうですね。
同じタイミングで発表された、AWS CodeCommitやAWS CodePipelineとの連携も気になるので、引き続き試してみたいと思います。