はじめに
性別・年齢・国境などの制約がなく誰もが利用でき、「 誰かに何かを届ける」「 自身の思いを伝える」ことができる技術として、インターネットやWebは必要不可欠なものといってよいでしょう。あるCMで「誰もがクリエーターである」といっておりましたが、まさしくそのとおりですね。
近年、スマートフォンやタブレットなどのモバイル端末な普及や、街中のディスプレイ広告に代表されるように、伝わる側、利用する側の環境は劇的に多様化してきています。また、爆発的なアクセスが発生してサーバーがダウンするということも発生しています。
クラウド技術は、これらの変化に対応するうえで、重要なものと言えます。
Movable Typeは、個人のブログから企業のWebサイトまで、さまざまな環境でご利用いただいているパブリッシングプラットフォームです。利用者にとって最適な環境を選択していただけるように、マルチプラットフォームに対応することは、Movable Typeの特長のひとつです。Windows AzureやSQL Azureに対応することは、6年前からSQL SeverやActive DirectoryをサポートしているMovable Typeにとって、「 対応するか否か」ではなく「いつ対応するか」ということが課題でした。現在、年内のリリースを目標に開発を進めていますが、2011年にマイクロソフト主催の開発合宿に参加することは、Windows Azure/SQL Azureに対応するための良いきっかけでした。
Windows Azure対応は難しくない
さて、既存のWebアプリをWindows Azure対応していくには、以下を検討していかなければいけません。これらについて、実際に感じたことをご紹介していきたいと思います。
(1)Windows Azureの開発・デプロイスタイルを理解すること
(2)さまざまなミドルウェアを含めたインストーラ
(3)タイムゾーン
(4)メール送信
(5)SQL Azure対応
(6)データの永続化
開発・デプロイスタイル
Window Azureに対応する上で、「 開発・デプロイのスタイルの違い」は最初に理解しなければいけないことです。ローカル環境のVisual Studioでアプリ開発・テストをし、パッケージを作成してからデプロイするというスタイルは、Movable Typeのそれとは異なるものです。開発合宿では、このスタイルの違いを理解し、インストールができるようにすることにフォーカスしていきました。
Windows Azure対応のアプリをデプロイする上で、ServiceConfiguration.cscfgとServiceDefinition.csdefのファイルが重要であること、加えてVisual Studioがこれらのファイルを簡単に生成することができることを理解することが最初のステップと言えます。
Windows Azure スタートアップタスクを利用することでインストールが可能に
Movable TypeをVMロールで構築している方々もいらっしゃいますが、クラウドならではの機能を利用するにはWebロールでの利用が必要です。また、Movable TypeをWindows環境で利用するためには、ActiveState社のActivePerlを事前にインストールしておく必要があります。
WebプラットフォームインストーラーやPHPベースのオープンソースソフトウェアでのインストール方法を参考に、スタートアップタスクを利用することでインストールできるようになりました。もし、PHPからSQL Azureに接続するのであったら、PHP向けのドライバを常に最新版を利用するようにしておくことが必要です(最初、古いものを使っていて苦労してしまいました) 。
以下は、現在のスタートアップタスクで利用しているPowerShellスクリプトの一部です。
# Package Name
$pack = 'http://downloads.activestate.com/ActivePerl/releases/5.12.4.1205/ActivePerl-5.12.4.1205-MSWin32-x64-294981.msi'
# Download ActivePerl package
$webClient = new-object System.Net.WebClient
$webClient.DownloadFile($pack, "perl.msi")
# Install ActivePerl
$install_dir = Get-Content Env:PERL_PATH
$params = "/qn /i perl.msi TARGETDIR=$install_dir"
$proct = [System.Diagnostics.Process]::Start( "msiexec", $params )
$proc.WaitForExit()
#Done
タイムゾーンは固定
PaaSであるWindows Azureは、OSやIISといったミドルウェアの保守を、サービス提供者側であるマイクロソフトに任せられることが特長の1つです。その反面、制約事項があり、代表的なものが「タイムゾーンがUTCになること」です。そのため、タイムゾーンに対応しておくことは重要です。Movable Typeは、全世界で利用されていることもあり、最初からタイムゾーンに対応しており、問題はありませんでした。
SMTPAuth対応は必須のメール送信
Movable Typeのメール送信は、ローカルホスト上のメール送信機能や同じネットワーク内のメールサーバを利用することを前提としており、Windows Azure環境ではそのまま使えません。現在、SMTPAuth対応を進めており、基本的な動作ができることは確認しています。今後はSSL/TLSといったセキュリティ面を強化していくことになるでしょう。
SQL Azure対応
Movable TypeはData::ObjectDriverというO/Rマッパを利用して、さまざまなデータベースエンジンに対応しています。SQL AzureとSQL Serverは、非常に高い親和性がありますが、varcharやtextといった文字型においてNプレフィックスをつけておかなければいけません。現在の開発版では対応しています。
データの永続化
Movable Typeにとって一番大きい課題が、データ永続化に関するものとといえます。Movable Typeは、CMSとしてHTMLコンテンツを出力するので、これらのコンテンツがインスタンスのメンテナンス時に消失したら困ります。また、増大するトラフィックに対応するために、フロントエンドを多重化したいといった場合にも対応できなければいけません。
Movable Typeは、HTMLコンテンツを出力する際に、OSのファイルシステムをそのまま利用します。現在の開発版では、Azure Driveを利用して対応しています。Azure Driveはデータを永続化でき、複数のインスタンスからのリードアクセスは問題ありません。しかし、書き込みは特定の1つのインスタンスからしかできないという制約があります。
現在、これを解決すべくBLOBストレージを利用すべく開発を進めています。
Windows Azure 対応の現状
先日開催されたWindows Developer Daysのブレークアウトセッションでも、実際に動作している環境をご覧いただいておりますように、基本動作は問題なく動作するようになっています。パフォーマンスチェックを厳密にしたわけではありませんが、オンプレミスな環境(Windows Server 2008 R2+SQL Server 2008 R2)よりもレスポンスが良いように見受けられます。これは本当に驚くべきことでした。Webサーバとして最適化されたWebロールを利用することは、とてもメリットがあることだと思います。これで日本(東京)にリージョンができたらどんなことになるだろうかと、今からワクワクする自分がいます。
Windows Azure対応について着実に進んでいる。キャプチャは、Windows Azureで動いているcloudapp.netで稼働しているMovable Type 5.2開発版
Azure Driveを利用することから、複数のインスタンスにMovable Typeをインストールできなかったり、メール送信にSSL/TLSが利用できないという制約があることから、Releaseしていませんが、動画配信サービスとの連携に代表されるように、他のクラウドサービスにはない魅力があるWindows Azure環境にしっかり対応していきたいと思います。