Windows Azure Web Sitesの魅力を120%引き出す

このPostはWindows Azure Advent Calendar 2013の22日目です。

皆様はWindows Azure Webサイトを活用してますか? Windows Azure Webサイトはとってもステキなプラットフォームです。とりあえず先日の帝国兵さんのPostしばやん先生のBlogでも見て魅了されるべきです。ただ、普通に使っていてはその魅力は100%どまりです。

んふふふ・・・へただなぁカイジくん。へたっぴさ! Webサイトの解放のさせ方が下手!

カイジくんが本当に欲しいのは、これ・・・!

Kudu!

これを使ってHackしてさ、さらにクールなWebサイトをやりたい、、、だろ…?

とかなんとか、そういうわけでWindows Azure Webサイトをもっともっと面白おかしく使うためのエッセンスとして、今回はKuduを丸裸にしたいと思います。

「ヌーディスト・クードゥーゥゥゥゥ!!!」 みそ先生から圧力もとい電波を受けました。

Kuduって何?

Kudu (カタカナ発音だとクードゥー)はWindows Azure Webサイトのバックグラウンドで使われているGitのデプロイエンジンです。デプロイエンジンだけかと思いきや、関連して(るんだかしてないんだかなのも含めて)たくさんの機能が提供されています。

まぁ細かい話はドキュメントを見て頂くとして、ちょっと詳しく見ていきたいと思います。

機能

基本的な機能としてはデプロイ関連の機能があります。

  • Gitを使用したWebサイトへの発行
    • Azure Webサイト上にはGitがインストールされてるのですが、こちらのGitリポジトリを使ってAzure Webサイトへデプロイするための仕組みです。公式ドキュメントがあるので細かい話はこちらを参照ください。
  • デプロイフック
    • Azure Webサイト上のGitにPushされた後、通常はKuduがWebサイトへデプロイを行いますが、デプロイ処理をカスタマイズすることができます。
  • デプロイ後フック
    • デプロイが完了した際にカスタムのスクリプトを実行することができます。
  • Webフック
    • デプロイ完了後にコールバックを受け取って何かしら処理を行いたい場合などに使うWebフックです。IDやステータスなどを登録したコールバックURLにPostしてくれます。
    • 例えばZapierを使ってデプロイ後にメールを送るとか。
  • Azure Site Extensions
    • Webサイトの仕組みをちょっと拡張して、Webサイトとは異なる(scmなサイトで動作する)アプリケーションを動かしちゃう仕組みです。
    • ちなみにVisual Studio Online ”Monaco”もSiteExtensionsとして動いてます。(Monacoの主要な機能はAzure Webサイト上のファイル・コードの編集、Gitの操作、ビルドなどですが、ベースのコマンドなどは既にAzure Webサイト上にあるわけで、Webのフロントエンドの部分をSiteExtensionsとして提供している感じでしょうか)

また、Webサイトへの発行に伴い、付随する機能も多数用意されています。

  • REST API
    • Kuduはサービスとしての口をREST APIで提供しています。
    • scm
      • Kuduで管理しているリポジトリ情報を取得します。Cleanや削除もできます。
    • Command
      • Kudu上のコマンドラインでコマンドを実行して結果を受け取ることができます。
      • ストリームバージョンもあります(まだAlpha版)
      • Web UIとして提供されているDebug Consoleを使うのが簡単です。
      • Kudu console
      • image※上半分はVFSの情報を含むディレクトリ・ファイル一覧です。編集・追加・削除などできます。
    • Deployment
      • デプロイされた情報や過去のデプロイに戻したり削除したりログを見ることができます。
    • SSHKey
      • PEM形式の秘密鍵を設定することができます。他のGitリポジトリなどと連携するのに必要です。
    • Environment
      • Kuduのバージョンを取得することができます。
    • Settings
      • Kudu関連の設定を取得したり変更することができます。
    • Diagnostics
    • Log Stream
      • ログのストリームを取得します。Visual Studioなどを使ってWebサイトのログをストリームで見ることができますが、こちらを基にしていると思います。またアプリケーションだけでなくデプロイ状況やIISログも見れますよ。
      • Diagnostic Log Stream
    • VFS
      • Webサイト上の仮想なファイルシステムの一覧を見たり追加・削除などが行えます。
  • Web UI
    • REST APIやデバッグコンソールを使うことができる簡単なUIです。
    • WebサイトのURLにscmをつければ見れるので、こちらを見たことがある人のほうが多いかと思います。
    • image
    • https://.scm.azurewebsites.net
  • Web Jobs
    • 開発中。Kudu上でWebアプリケーションとは別にプロセスを実行させることができます。

Kuduのバージョン情報

Kuduのバージョンについてはこちらに履歴があります。

image

S25が現在のバージョンですね。予定されている機能や、それがAzure上で稼働しているかどうかすぐにわかります。便利!

image

ちなみにAzure Webサイト上のKuduでみれるBuild番号のマイナーバージョンが対応するっぽいです。今はS25。たぶん。S24の時が

image

なので。

履歴みてたら怪しげな機能とかありますがとりあえず置いときます。

アーキテクチャ

Kuduはちょっと特殊でWindows Azure Webサイトの裏側といってもいいようなサービスなのですが、Kuduそのものは各利用者のWindows Azure Webサイト上で動作しています。

KuduはAzure Webサイトのバディみたいな存在で、違いがあるとすればWebサイトのファイルへのアクセスが行えるというところでしょうか。(発行などを行う必要があるので)

セキュリティモデル

Kuduは実際のWindows Azure Webサイトと同じサンドボックス内での実行となります。なので特殊なケースであるWebサイトの発行を除けばユーザー権限は基本同じですが、OS部分やユーザーコード以外の部分へのアクセスは制限されています。

※ユーザー権限上であればMSBuildの実行などは許可されてます。

またKuduのサイトの動作(これはMonacoなども同じですが)に関するクォータ(CPU制限やメモリなど)はAzure Webサイトと同じで共有しています。なのであまりこちらでCPUやメモリを食ってしまうと本番のAzure Webサイトの動作に影響がでます。

認証モデル

認証はAzure Webサイトの発行に使用する資格情報を使ったBasic認証となります。このあたりは先日の帝国兵さんのPostに詳しく記載されてます。

image

プロセスモデル

KuduのサービスサイトはAzure Webサイトと共有して同じサンドボックス上で実行されますが、プロセスそのものは別物です。

※細かい話は原典を参照ください。

使ってみる

では早速使ってみましょう。Kuduにアクセスするには最初に管理ポータルのWebサイトのダッシュボード画面から「デプロイ資格情報のリセット」なりで資格情報をちゃんと設定しておきましょう。ここのID/PassがKuduへアクセスする際に必要になります。

Kuduへのリンクは現状無いので、手打ちになります。

  • https://.scm.azurewebsites.net/

HTTPSで、サイト名に続けてscmをはさんだものになります。アクセスすると資格情報を聞かれるので先ほど設定したものを使用します。無事アクセスできると以下のような画面が表示されます。

image

REST APIは各REST APIのGETを叩いて応答を見ることができます。基本的には情報の参照がメインです。(JSONで返ってくるのでViewerを入れるか参照できるブラウザで見るのがいいでしょう)

上部メニューのEnvironmentではAzure Webサイト上の各環境変数などが参照できます。

image

結構細かくみれます。IISの起動時のコマンドラインなども見れますね。

Debug Consoleではコマンドラインの実行やファイルシステムへのアクセスが可能です。

image

上部のファイルシステムのフォルダはリンクになっているので、クリックしてフォルダ階層をたどることができます。(連動してコンソールのカレントフォルダも移動します)

ちなみに上部のファイルシステムにファイルをドラッグ&ドロップするとアップロードできます。便利!

基本的にサイトの発行やリポジトリ管理に必要なコマンド、環境があるのでgitやnpm、NuGet/MSBuildなど動かすことができます。

image

このあたりの土台があるので、Visual Studio Online “Monaco”を使ってコーディングしてビルドしたり、Gitで管理することができるわけですね。

Diagnostic DumpメニューではWebサイト上のデプロイログやIISログなどZipでまとめたものをダウンロードすることができます。

image

Log Streamメニューはそのままログのストリームを開くことができます。

さて、ここまでが普通のKuduのお話です。正直ここまでの機能で十分Azure Webサイトを100%以上活用できることでしょう。

しかしながら今日の本題はここからがメインとなります。そう、Kuduを拡張してもっと便利に自分好みのAzure Webサイトにする第一歩を踏み出す、というのがこの投稿の最終目標となります。

Site Extensions を使って拡張する

KuduにはSite Extensionsという機能があります。これはAzure Webサイト上のKuduが簡単に機能拡張を行えるようにする為のもので、Kudu(とVisual Studio Online “Monaco”、MSDeploy)もPre-InstallのSite Extensionsとして動いています。

image

SiteExtensionsは対象となるWebアプリケーション一式と、ApplicationHostを書き換えるためのapplicationHost.xdtファイルが要となります。

Azure Webサイト起動時にSiteExtensionsフォルダを参照して、applicationHost.xdtファイルの内容に従ってApplicationHost.configを変換して仮想アプリケーションを追加したりしてくれるわけですね。

例:MonacoのapplicationHost.xdt

<?xml version="1.0"?>

<!-- For more information on using Web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.applicationHost>
    <sites>
      <site name="%XDT_SCMSITENAME%" xdt:Locator="Match(name)">
        <application path="/Dev" xdt:Locator="Match(path)" xdt:Transform="Remove" />
        <application path="/Dev" applicationPool="%XDT_APPPOOLNAME%" xdt:Transform="Insert">
          <virtualDirectory path="/" physicalPath="%XDT_EXTENSIONPATH%" />
        </application>
      </site>
    </sites>
  </system.applicationHost>
</configuration>

Monacoは/Devで動作するように定義されています。実際にSCMのURLに/Devつけてアクセスしてみましょう。

例: https://.scm.azurewebsites.net/Dev

image

ちゃんとMonacoが起動しましたね。(※Visual Studio Onlineを有効にしている場合です)

こんな感じでSiteExtensionsは動作します。あ、追加されるWebアプリケーションはKuduと同じサンドボックスになります。なのでユーザー領域へのファイルアクセスなどは可能ですが制限は同じ、となります。

さてさて、これはPre-Installの話です。我々が弄れる領域じゃありません。でも安心してください。Kuduを作ってる人達はそんなHENTAIもといマニアのためにPrivate SiteExtensionsを用意してくれています!

Private SiteExtensionsを使うためのフォルダ階層は以下のようになります。

image

ユーザー領域のTopにSiteExtensionsフォルダを作成し、その配下にアプリ用のフォルダを置いていきます。

ではさっそくPrivate SiteExtensionsを試してみましょう。

とりあえず空のWebアプリケーションを作ります。普通にアプリケーションを弄った後は、アプリケーションのルートにapplicationHost.xdtファイルを追加して以下のように記述します。

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.applicationHost>
    <sites>
      <site name="%XDT_SCMSITENAME%" xdt:Locator="Match(name)">
        <application path="/test" xdt:Locator="Match(path)" xdt:Transform="Remove" />
        <application path="/test" applicationPool="%XDT_APPPOOLNAME%" xdt:Transform="Insert">
          <virtualDirectory path="/" physicalPath="%XDT_EXTENSIONPATH%" />
        </application>
      </site>
    </sites>
  </system.applicationHost>
</configuration>

後はこのWebアプリケーションをビルドして、KuduのSiteExtensionsフォルダ以下にアップロードします。ちなみにUnzipコマンドが使えるのでZipに固めてKudu Consoleで操作するのが楽かもです。

だいたい以下のような感じになればOKです。

image

さて、これでファイルの準備はできました。次にAzure WebサイトにPrivate SiteExtensionsを使えるように構成を追加します。

管理ポータルの構成タブで以下のように WEBSITE_PRIVATE_EXTENSIONS=1を設定します。

image

設定後は読み込ませるためにWebサイトを再起動しておいてください。

では.xdtで指定した仮想アプリケーションのURLを指定してアクセスしてみます。

image

https://.scm.azurewebsites.net/test

どうですか? .xdtファイルや設定が問題なければちゃんと見えるはずです!ちなみにSCM配下(Kudu配下)で動作しているので、認証は発行用の資格情報をきかれるようになっています。

後は自分で好きなように(主に管理用の)アプリケーションをAzure Webサイトで動かすことができますね!やったー!

ログ見るも良し、PHPMyAdmin動かすも良し、です。そんな感じでいろいろ遊べます。細かいことはこちらを参照。

ささ、これで満足ですか?いやいやこんなものじゃマダマダ満足されないはず!

自分でSiteExtensionsも触れるとなったら、次はやっぱりKuduそのもののカスタマイズですよね!

Kuduのカスタマイズ

KuduはGitHubにソースも公開されてるオープンソースなプロジェクトです。Apache License 2.0。いえあ。というわけで、さくっとGitHubを見てgit cloneしてきましょう!※Zipダウンロードでもいいわけですが。

とりあえず何となくビルドするだけなら.sln開いてビルドするぐらいで済むのですが、綺麗に(テストも含めて)ビルドしようと思うと環境作るのがちょっと面倒です。

とりあえず、Git for Windows / Node.js (npmがいる) / xUnit / Mercurial (hg.exeがいる)をインストールしてパスを通しておきましょう。

ソースのルートフォルダにbuild.cmdがあるので、そいつを実行すれば一通りビルドとテストが走ります。問題なければartifactsフォルダに結果が吐き出されます。

さてさて、ソースの細かい話はおいておいて、KuduのWeb UIな部分は Kudu.Services.Web が行っています。今回はこれをカスタマイズしてみましょう。

特に意識しなくても普通にASP.NETなWebアプリケーションなのでガスガス修正してみましょう。修正が終わったら、build.cmdでビルドしましょう。(別に普通のビルドで手動でUpでも構いませんが)

build.cmdでビルドすれば artifacts\Release\zip フォルダにKudu.zip と DeployPrivateKudu.cmd ができていると思います。

image

このZipはKudu.Services.Webの出力をまとめたものですが、この中にSiteExtensions用のapplicationHost.xdtも含まれてます。いたせりつくせりですね。

で、DeployPrivateKudu.cmdに発行先のURLを指定して実行すれば自動的にSiteExtensionsを追加してくれます。(無い場合は先述の方法でSiteExtensionsに登録しましょう)

DeployPrivateKudu.cmd" "https://<ID>:<Pass>@<SiteName>.scm.azurewebsites.net/deploy"

Kuduの発行用REST API (/deploy)を指定すればいいわけですが、Basic認証がかかっているので https:// id : pass @URL という形式で直接ID/Passを指定しています。

問題なくデプロイが完了すると、Azure Webサイト上のSiteExtensionsは以下のようになっていると思います。

image

SiteExtensionsフォルダ以下にKuduができました!スルーしてますが、実はapplicationHost.xdtではルート(/)を書き換えるように指定しています。つまりKudu自身を上書きした感じですね!

早速更新されたかどうかをAzure Webサイト再起動して確認してみましょう。(WEBSITE_PRIVATE_EXTENSIONSも忘れずに!)

image

image

URLに注目ですよ!ちゃんとKuduなURLでカスタマイズしたアプリケーションに差し替わってます!

これでKuduも思いのままですね!

というように素晴らしいKuduの世界を見てきました。あとNuGetなどには上がっていませんが(主にテスト用クライアントな気がするけど)KuduのREST APIにアクセスするためのクライアントモジュールもGitHubに公開されているので、そちらも使ってみましょう。

使い方は簡単です。Kudu.Clientのアセンブリを参照するだけで使えます。

例えばこんな風に

image

Kudu.Client.Command.RemoteCommandExecutorを生成すれば簡単にKudu Consoleのようなことができます。

image

簡単ですね!これでAzureの管理ポータルやSCMのサイト行かなくてもいろいろ情報取得したりデプロイを操作することができます。 Management Libraryと組み合わせると尚良し!ですね。

ちなみに本家のドキュメント漁ると、というかちゃんと見ればローカル環境でもKuduを動かすこともできます。設定の仕方が結構面倒くさいかもしれませんが、オレオレAzure Webサイトとかもできますね!(え、それはAzure Packでいいじゃないかって?それはそれでいいですが。まぁ中でKudu動いてると思いますしおすし)

まとめ

Kuduイイネ!みなさんも一緒にAzureやKuduをもっと極めていきましょう!あとほとんどOSSになってたりするので、積極的に参加していきたいですね!(本家のProjectKuduのほうは他にも面白そうなProjectあったりしますよ)

というわけでAzureアドベントカレンダー22日は終わりです。明日は @ksasakims さんです!

コメントを残す