OpsWorksとChef on Windowsをつかうと、構成タスクの確実な自動化によってWindowsの利用を最適化してインスタンスのコンプライアンスを強化することができます。インスタンス構成の自動化はコードレビューや継続的インテグレーションのようなソフトウェアエンジニアリングのベストプラクティスを可能にし、手動による構成より小さく迅速なデリバリを可能にします。インスタンス構成を自動化することにより、ゴールデンイメージや手動による変更への依存をへらすことができます。またOpsWorksにはユーザー管理や追加マシンの起動によるインフラストラクチャのスケーリングなど管理作業を容易にしてくれる機能があります。
この記事では、OpsWorksをつかったインスタンスのカスタマイズとWindows上のアプリデプロイのやり方を紹介します。OpsWorksを使用するといかにアプリケーション管理が容易になるかをしめすために、Node.JSアプリをMicrosoft Internet Information Server (IIS)にデプロイしてみます。cookbooksとappのソースコードはGitHub上のAmazon Web Services - Lab repositoryから参照することができます。
この例のためには、OpsWorksがどのようにレシピとライフサイクルイベントを使用するのかを理解する必要があります。よくくわしい情報は、What is AWS OpsWorks?を参照してください。
スタックとインスタンスの作成
はじめに、OpsWorksコンソールでスタックを作成します。https://console.aws.amazon.com/opsworks/home?#/stack/newのAdd Stackページにいきます。

Nameには、Node.JS Windows Demo
と入力します。Default operating systemで、Microsoft Windows Server 2012 R2 Base
を選択します。
つぎに、cookbook sourceを構成します。Advancedを選択してConfiguration Managementセクションを表示します。Use custom Chef cookbooksを有効にして、Repository typeとしてGitバージョン管理システムを選択し、Repository URLでhttps://github.com/awslabs/opsworks-windows-demo-cookbooks.git
と入力します。いま構成したcookbooksにはNode.JSアプリのインストール方法が記述されています。

Add Stackを選択してスタックを作成します。
Layerセクションで、Add a Layerを選択します。NameとShort Nameは好きなようにつけることができます。Security Groupでは、AWS-OpsWorks-Web-Serverを追加のSecurity Groupとして選択します。これはHTTPトラフィックが許可されブラウザのデモアプリから接続できることを保証します。この例では、RDPアクセスを必要としないので安全にこの警告を無視できます。Add Layerを選択します。

このレイヤーにインスタンスを追加する前に、ライフサイクルイベントにChefのコードをひもづける必要があります。そのためには、レイヤーのレシピを編集します。Layersのページで、more layersからRecipesを選択します。Layers more layersページで、Editを選択します。ライフサイクルイベントをセットアップするために、webserver_nodejs::setupを選択して、デプロイイベントではwebserver_nodejs::deployを選択します。

Saveを選択して変更を確認します。
これでインスタンスを追加する準備ができました。InstancesのページにスイッチしてInstancesを選択して、さらにAdd an Instanceを選択します。OpsWorksはレイヤー名をもとにしてHostnameをサジェストします:この例では、webserver-node1
になります。Add Instanceを選択して確認をします。

まだインスタンスをスタートしないようにしてください。はじめにデプロイしたいアプリについてOpwWoksに通知する必要があります。これはインスタンスがスタートしたときにアプリがデプロイされることを保証します。(インスタンスがブート中にセットアップイベントを実行するとき、OpsWorksは自動的にアプリをデプロイします。あとから、任意の実行中インスタンスに新規または既存のアプリをデプロイできます。)
Appの作成
左側のペインで、Appsを選択してAppsページにスイッチし、そしてAdd an appを選択します。アプリに名前をつけ、Repository typeとしてGitを選択し、Repository URLにhttps://github.com/awslabs/opsworks-windows-demo-nodejs.git
と入力します。デモアプリは環境変数をサポートしているので、APP_ADMIN_EMAILキーをつかってデモアプリのフロントページに表示されるメールアドレスを設定することができます。任意の値を使用します。

Appを保存するために、Add Appを選択します。Instancesページにもどります。さあ、インスタンスをスタートしましょう。

OpsWorksがセットアップの進行状況が"requested"から"pending"に切り替わり、そして"booting"になるのをレポートします。インスタンスが"booting"になると、それはAmazon EC2上で稼働します。OpsWorksエージェントがインストールされて最初のライフサイクルイベントがピックアップされると、ステータスが"running_setup"に変更されます。OpsWorksがライフサイクルイベントのセットアップを処理した後、インスタンスを"online"にします。インスタンスがオンライン状態になったとき、OpsWorksはライフサイクルイベントを構成してスタック内のすべてのインスタンスに新規インスタンスについて通知します。
新規インスタンスのブートは数分ほどかかり、全体の時間はインスタンスサイズとChefレシピによります。待っている間に、コーヒーか紅茶でも飲みましょう。そして、Chefが実行するコードとopsworks-windows-example-cookbooksの全体的な構造をみていきましょう。
Cookbook Deep Dive - セットアップイベント
レイヤー設定を選択したときセットアップイベントがひもづけられるwebserver_nodejs::setup
レシピをみていきましょう:
# Recipes to install software on initial boot
include_recipe "opsworks_iis"
include_recipe "opsworks_nodejs"
include_recipe "opsworks_iisnode"
このレシピは単にほかのレシピをインクルードしています。みてわかるように、ChefはIIS、Node.JS、そしてIIS-to-Node.JSブリッジのiisnodeをインストールします。opsworks_nodejs
cookbookをくわしくみていくと、どのようにアプリをインストールするのか学ぶことができます。Chef cookbookの全体的なフォルダ構造は以下の通りです:
opsworks_nodejs
├── README.md
├── attributes
│ └── default.rb
├── definitions
│ └── opsworks_nodejs_npm.rb
├── metadata.rb
└── recipes
└── default.rb
opsworks_nodejs
cookbookはattributeを使用してcookbookを使用した時に上書きできる設定を定義します。これによりあたらしいバージョンのNode.JSまたはnpm、node packageをアップデートすることが容易になり、attributeを異なる値に設定するだけですみます。
opsworks_nodejs/attributes/default.rb
のファイルは以下ののバージョン属性を定義します:
default["opsworks_nodejs"]["node_version"] = "0.12.7"
default["opsworks_nodejs"]["npm_version"] = "2.13.0"
opsworks_nodejs
cookbookのデフォルトレシピはnode_version
とnpm_version
を使用します。node_version
をダウンロードURL生成の一部として、またnpm_version
をバッチコードの中で使用しています。
version = node["opsworks_nodejs"]["node_version"]
download_file = "node-v#{version}-x86.msi"
download_path = ::File.join(Chef::Config["file_cache_path"], download_file)
remote_file download_path do
source "https://nodejs.org/dist/v#{version}/#{download_file}"
retries 2
end
windows_package "nodejs" do
source download_path
end
batch "install npm version #{node['opsworks_nodejs']['npm_version']}" do
code "\"%programfiles(x86)%\\nodejs\\npm\" -g install [email protected]#{node['opsworks_nodejs']['npm_version']}"
end
このcookbookはNode.JSを2ステップでインストールします。はじめに、Chefのremote_fileリソースをつかって公式のNode.JSウェブサイトからインストールパッケージをダウンロードしてローカルディスクに保存します。このcookbookはまたretries
属性をセットしてリトライを有効にするため、このコードは短期のネットワーク障害に対してより回復力があります。
cookbookがファイルを保存したあと、windows_packageリソースがMSIをインストールします。そして、cookbookはbatchリソースをつかってリクエストされたnpmのバージョンをインストールします。
Chefリソースには挙動を微調整するための多くの属性が提供されています。よりくわしい情報は、Chef Resources Referenceを参照してください。
Cookbook Deep Dive - デプロイイベント
すでに述べたとおり、OpsWorksはChefレシピの実行またはリソースを事前に用意しません。それによってどのようにアプリをデプロイするのかについてきめ細かいコントロールと完全な柔軟性を得られます。しかしながら、GitからアプリをチェックアウトしたりAmazon S3からダウンロードするような共通のタスクがいくつかあります。共通のタスクを容易に実行できるように、これらのステップを制御するためのカスタムChefリソースとcookbookのサンプルがopsworks_scm_checkout
として提供されています。
Setupレシピにあるように、OpsWorksはwebserver_nodejs::deploy
レシピをほかのレシピをインクルードするためだけに使用しています。opsworks_app_nodejs
のデフォルトレシピが大変な作業を担当します。
レシピのスリムダウンしたバージョンは以下のようになっています。
apps = search(:aws_opsworks_app, "deploy:true")
apps.each do |app|
opsworks_scm_checkout app["shortname"] do
...
end
directory app_deploy do
...
end
# Copy app to deployment directory
batch "copy #{app["shortname"]}" do
code "Robocopy.exe ..."
end
# Run 'npm install'
opsworks_nodejs_npm app["shortname"] do
cwd app_deploy
end
template "#{app['shortname']}/web.config" do
...
variables({ :environment => app["environment"]})
end
powershell_script "register #{app["shortname"]}" do
...
end
end
コードをレビューすることによってどうやって自分でcookbookのデプロイを書くのかの理解に役立ちますので、ウォークスルーしていきましょう。はじめに、Chefのsearchをつかってデプロイするアプリについての情報を取得します。AWS OpsWorks User Guideにはすべての公開された属性がリストされています。
それぞれのアプリで、Chefは以下のステップを実行します:
・ opsworks_scm_checkout
リソースをつかってアプリをローカルファイルシステムにチェックアウトします。
・ ターゲットディレクトリを作成してそのディレクトリにアプリをコピーします。変更のあったファイルだけをコピーするために、Robocopyを使用します。
・ npm installを実行して、すべての必要なサードパーティのライブラリをダウンロードします。それはopsworks_nodejs
cookbookで定義されているopsworks_nodejs_npm
カスタムリソースを使用して実行されます。
・ OpsWorksの環境変数を利用してweb.config
ファイルがテンプレートから生成されます。このファイルはIIS-to-Node.JSインテグレーションを構成します。
・ Windows PowerShellがIISサイトを登録してアプリをオンラインにします。
Node.JSデモアプリのチェックアウト
ブートしたインスタンスがもうオンラインになっているころです:

デモアプリにアクセスするためには、Public IPから、IPアドレスをクリックします。アプリでほかのビジターが参照可能なコメントをのこすことができます。
ページは静的ではありませんが、ホスト名、リクエスト元のブラウザ、システム時間、そして使用されているNode.JSバージョンに関する情報をふくんでいることに注意してください。ページの底部に、アプリがピックアップされたときに構成したAPP_ADMIN_EMAIL環境変数が表示されています。

アプリにコメントをのこして、Sendを選択します。これはデモ用途だけのミニマムなアプリのため、コメントはプレーンJSONファイルとしてインスタンスに保存されます。
OpsWorksのカスタマイズの詳細を知るためには、Layer overviewページからホスト名を選択します。Instance detailページの底部に、インスタンスが受け取った最新の30コマンドがわかります。対応するChefのログを表示するためには、showを選択します。

結論
Windows上のChef12でOpsWorksをつかうと、Windows Server 2012 R2インスタンスのカスタマイズとアプリの管理のための信頼できるフレームワークが入手できます。open source community cookbooksの使用や自分のcookbookを作成ができます。ChefはPowerShellをサポートしているためWindowsの自動化が再利用できます。ユーザー管理、権限、テンポラリRDPアクセスなどのOpsWorksのビルトインの運用ツールは日々の運用管理に役立ちます。
この例はどのようにしてIISを使用したNode.JSアプリをデプロイするかについて紹介しました。Node.JSのインストールに使用されているopsworks_nodejs
やopsworks_app_nodejs
などの例にふくまれている典型的なcookbookを参照することで、どのようにして自分のcookbookを書くのかについて学習することができます。
(翻訳はSA渡邉が担当しました。原文はUsing AWS OpsWorks to Customize and Automate App Deployment on Windows)