• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
PHP on Windows Azure Training
 

PHP on Windows Azure Training

on

  • 2,546 views

 

Statistics

Views

Total Views
2,546
Views on SlideShare
2,542
Embed Views
4

Actions

Likes
4
Downloads
15
Comments
0

2 Embeds 4

https://twitter.com 3
http://www.techno-officer.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • NOTE: Add spectrum (arrow) that shows the “PaaS Continuum”We’re going to talk about a new sevice. You think about WAWS as the highest level service, abstracts away .. .. .. even web server.Reducing complexity, reducing management overhead.Add animation to build out each part -> final click reviels the cloud box at the bottom.

PHP on Windows Azure Training PHP on Windows Azure Training Presentation Transcript

  • PHP onWindows Azure training ver.20121127-1.3.3 日本マイクロソフト株式会社 株式会社pnop
  • 本ドキュメントに含まれる情報は、情報としての利用のみを目的としています。ドキュメントの内容は発行時点におけるMicrosoft Corporation (以下、"Microsoft")の見解を反映したものです。Microsoftは、本ドキュメントの正確性または目的への適合性について、いかなる保証または表明も行いません。また、本ドキュメントの使用に起因するいかなる状況についても責任を負いません。この状況には、過失(人体の負傷または死亡を除く)、あらゆる破損または損失(業務上の損失、収益または利益などの結果的な損失を無制限に含む) などが含まれます。本ドキュメントには技術的に不正確な記述や表記の誤りが含まれる場合があります。本ドキュメントは市場状況などの変化により、内容が最新のものではない場合があります。Microsoft は、本ドキュメントの内容を常に更新したり最新の情報を反映したりすることについて一切の義務を負わず、これらを行わないことによる責任を問われないものとします。マイクロソフトは、本ドキュメントに記載されている内容に関して、特許、特許出願、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、本ドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権に関する権利をお客様に許諾するものではありません。 Microsoft、Windows、Windows Azureは、Microsoft Corporation の商標または登録商標です。その他すべての商標は、その所有者に帰属します。Copyright © 2012 Microsoft Corporation. All rights reserved. 2
  • About me © 2011 Microsoft Corporation All Rights Reserved. Windows Azure Database Find me kuniteru.asami
  • Agenda (1)1. Windows Azure概要・アーキテクチャ2. クラウドサービスへのデプロイ環境3. クラウドサービスのプロジェクトファイル構成4. クラウドサービスへのデプロイ5. Demo - クラウドサービスプロジェクト作成からデプロイ6. クラウドサービスへのPHP環境の構築7. Azure Storageを利用する8. Azure Blobを利用する9. Azure Tableを利用する10. SQL Databaseを利用する 4
  • Agenda (2)11. Framework、テンプレートエンジン12. セッション変数 $_SESSION13. IISの設定14. クラウドサービスのアプリケーションの更新方法15. データのバックアップ16. memcached互換 Caching17. 事例18. PHP on Azure べし・べからず19. Appendix20. Q & A 5
  • #1Windows Azure概要・アーキテク チャー 6
  • Windows Azure Fabric SQL Database Computing Controller Cloud Services Caching Database Load WebSites Data Sync Balancer Virtual Machine Windows Linux Business Analytics CDN Blob Drive Table Queue Storage Networking Mobile Services Hadoop/HPC Vitrual Network Connect Traffic Manager Media Services Store 7
  • Computing(1) Firewall Rules Virtual Network O/S O/S Virtualization Virtualization Virtualization Hardware Hardware Hardware
  • Computing(2) 9
  • Webサイト(Websites)(1)• 環境構築が超簡単• git pushやftpsで、アプリケーションをデプロイできる• GALLERYからいくつかのオープンソースWebアプリケーション を選択してインストールできる • Drupal、Joomla!、WordPress• WebMatrixを利用してオープンソースWebアプリケーションを構 築できる • 65のWebアプリケーションがある(.NET及び同アプリ言語違いを含む、 2012/06/30現在)• SQL DatabaseやMySQLの環境構築もワンストップでできる
  • Webサイト(2)• 運用コストが低い • OSパッチ適用などはサービスが停止しないまま自動で実施される• 無料で利用することもできる• 制限が多い • 1サイトに10インスタンスまで • Webサーバーしか作れない• 3種類のサーバータイプから選択できる• 共有サーバー(無料) • 独自ドメインが利用できない• 共有サーバー• VM占有
  • 仮想マシン(Virtual Machines)• なんでもできる • MySQLや他のアプリケーションの構築が簡単• Linuxを選択できる • もちろんWindows Serverも• 永続的なローカルディスクを持つ• メンテナンスコストが高い • OSパッチなどは自身で管理する必要がある• PHPのランタイムは自分でインストールする必要がある
  • クラウドサービス(Cloud Services) (1)• 運用コストが低い • OSパッチ適用などはサービスが停止しないまま自動で実施するこ ともできる• Memcached互換サーバーの構築が簡単• イレギュラーなことをやろうとすると環境構築が難しい • MySQLなどの構築もできるがバックアップなどの運用も考えると 大変な場合も• PHPのランタイムは自分でセットアップする必要がある
  • クラウドサービス(2)• Hosted Serviceには以下の種類のRoleのインスタンス(仮想サーバー)群が 含まれる 各ロールの中には複数のゲストOSが稼働することができる • Web Role 主にWebサーバーになる • Worker Role 主にバックグラウンドでサービスを受け持つサーバーになる • VM Role(過去のもの) アプリケーションを組み込んだOSイメージごとアップロードして稼働させる カスタマイズが容易だがメンテナンス性が低い• インスタンスサイズはExtraLarge, Large, Medium, Small, ExtraSmallがある• 負荷に応じてRole内で稼働させるインスタンスの台数を増減することが容易• メンテナンスなどによりインスタンスがリフレッシュ(再起動)すると、OS やIISなどの設定や、ローカルディスクに保存していたファイルが初期状態に 戻る。そのため、永続化したい設定やデータは、Azure StorageやSQL Databaseに格納する必要がある。 14
  • Azure Storage以下のコンポーネントを持つ• Azure Blob • ファイルを格納するストレージ• Azure Drive • インスタンスにマウントできるディスクイメージファイル • Azure Blobに格納される• Azure Table • Key Value Store• Azure Queue • インスタンス間のデータの受け渡しをする • 格納したデータを他のインスタンスが参照するとそのデータはなくな るここに格納されたデータは、同一データセンター内で3重化されて保持し、さらに他のリージョンのデータセンターにもコピーを保持する。 15
  • SQL DatabaseSQL ServerをベースにWindows Azureに最適化されたリレーショナルデータベース• マスタサーバーに加えて、自動で2つのスレーブサーバーにデータ のコピーを保持する• マスタサーバーの障害時には、スレーブサーバーの内の一つがマ スタに昇格することで、停止時間を最小限に抑える• データベースレベルでのバックアップは自動でとられている (ユーザーが任意にリカバリすることはできない) → ユーザーの操作ミスなどによるデータ損失にはユーザーが責任 を 持つことになる• 以前はSQL Azureと呼ばれていた 16
  • Load Balancer• ロードバランサは自動で構成される• 60秒間、通信がない接続は強制切断される• セッションアフィニティをサポートしない (Webサイト除く) • セッション変数を利用するには工夫が必要な場合もある(後述) 17
  • CDN• Azure BlobとクラウドサービスのWebRoleをサポートする Contents Delivery Network• 日本国内にもノードがあるため、ユーザーに対する静的ファイル (画像、動画、html、JavaScript、cssなど)のレスポンスを向上 する• 大量の同時アクセスがあっても、CDNで捌ければコンピュートイ ンスタンスに負荷を肩代わりしてくれる 18
  • データセンター• 北ヨーロッ パ (ダブリ アメリカ合衆国 ン) 北 東アジア (シカゴ) (香港) アメリカ合衆国 西 アメリカ合衆国 西ヨーロッパ (非公開) 東 (アムステルダ 東南アジア (非公開) ム) (シンガポー ル) アメリカ合衆国中 央CDNノードは以下の24か所に存在する (サン・アントニ US EMEA Asia-Pacific/Rest of World オ) • Ashburn, VA • Amsterdam, NL • Hong Kong, HK • Bay Area, CA • Doha, QT • São Paulo, BR • Chicago, IL • Dublin, IE • Seoul, KR • San Antonio, TX • London, GB • Singapore, SG • Los Angeles, CA • Moscow, RU • Sydney, AU • Miami, FL • Paris, FR • Taipei, TW • Newark, NJ • Stockholm, SE • Tokyo, JP • Seattle, WA • Vienna, AT • Zurich, CH 19
  • #2クラウドサービスへ の デプロイ環境 20
  • ここではクラウドサービスに対応するWindows Azureサービスパッケージの作成とエミュレータ上でのテスト実行ができるものを紹介する• Visual Studio系 • Visual Studio 2012, 2010 • Visual Studio Express 2012 for Web (無料) • Visual Web Developer 2010 (無料)• Windows Azure PowerShell• 過去のもの • Windows Azure Tools for Eclipse • PHPAzureコマンド• Webサイトの管理を中心としたWindows Azureコマンドラインツールもある • Mac OS XやLinuxにも対応エディタやデバッグは基本的には好みのIDE(Eclipse PDTやNetBeansなど)が利用でき、Windows AzureへのデプロイはWebブラウザで実施できるのでここでは取り上げない 21
  • デプロイ環境のセットアップ (1)• PHP Developer CenterからWindows用のInstallerを利用してイン ストールすることで、最低限必要なものが一式インストールされ る http://www.windowsazure.com/ja-jp/develop/php/ • 以下を追加するとなおよい • Azure SQL Databaseに接続するための『Microsoft Drivers 3.0 for PHP v5.3 for SQL Server in IIS(IIS Express)』 • Visual Studioを使う予定がなくても『Visual Studio Express 2012 for Web with Windows Azure SDK』をインストールしておいた方 が困った時に参考になる 22
  • 23
  • デプロイ環境のセットアップ (2)• ここまでの作業でWeb Platform InstallerがPCにインストールさ れ、スタートメニューに存在する • Web Platform Installerを利用することで、Azure開発に関するツー ルが簡単にインストールできる• PHPのオフィシャルサイトにあるバイナリを利用してインストー ルしたい場合は、 Non Thread Safe版を利用する 24
  • Visual Studio 2012,Visual Studio 2012 Express for Web• Microsoftから提供される標準ツール • Visual Studio 2012 Express for Webは無償で利用可能• GUIで設定が可能 • 各種パラメータ設定 • リモートデスクトップの設定 • SSL証明書の組込• OnStart, OnStop, Runなどのメソッドが利用可能(.NETで記述)• 管理者モードで起動する必要がある※ これ以降このドキュメント内では、 Visual Studioを『VS』と表記する場合がある 25
  • Windows Azure PowerShell• Microsoftから提供されるPowerShellコマンド• 全ての設定などは作成されたファイルを直接修正する• 利用できるコマンドの一覧は、PowerShellコンソールでHelpコマ ンドを実行すると取得できる PS> help Azure• コマンドのヘルプはHelpコマンドで対象のコマンドを指定すると 取得できる PS> Get-Help Publish-AzureServiceProject 26
  • PHPAzureコマンド(過去のもの)http://phpazure.codeplex.com/• PHPAzure(Windows Azure SDK for PHP)にコマンドラインツールが含ま れている• 特別な設定なしでWindows AzureインスタンスにPHPラインタイムがインス トールされる• サービスパッケージ作成に必要なテンプレートファイルが用意されている• 全ての設定などは作成されたファイルを直接修正する• packageコマンドでデプロイパッケージの作成やエミュレータでの実行ができ る• PHPのコーディングには好きなテキストエディタを利用する• セットアップ方法 1. ダウンロードしたファイルを適当なフォルダに解凍する 2. PHPランタイムのフォルダにPATHを通す 3. PHPAzureのbinフォルダにPATHを通す 27
  • Windows Azure Tools for Eclipse(WindowsAzure4e) (過去のもの)http://www.windowsazure4e.org/• ※ 開発が止まっていてWindows Azure SDK v1.6以降には対応していないのでお奨めしない• Eclipse PDT + プラグイン• PHPに対応したIDE• XdebugやZend Debuggerなどが利用可能• 一部の機能はGUIでは設定できない • 各種パラメータ設定 • インスタンス数、インスタンスサイズの変更 • リモートデスクトップの設定 • SSL証明書の組込• 特別な設定なしでWindows AzureインスタンスにPHPラインタイムがインストールされる• php_azure.dll(後述)が古い• PHPAzure(後述)が古い• WebサーバーがデフォルトではHWCになる• OnStartなどの.NETメソッドを実行することができない• セットアップ方法 http://msdn.microsoft.com/ja-jp/windowsazure/hh240574 • Windows Azure SDK v1.6以降でも、以下の対応をすることで既存のプロジェクトのデプロイパッケージの作成は可能に なる • コマンドプロンプトを管理者モードで起動してcsrun.exeとMicrosoft.ServiceHosting.Tools.dllのシンボリックリンクを SDKのbinに作成する C:> mklink "%ProgramFiles%Windows Azure SDKv1.6bincsrun.exe" "%ProgramFiles%Windows Azure Emulatoremulatorcsrun.exe" C:> mklink "%ProgramFiles%Windows Azure SDKv1.6binMicrosoft.ServiceHosting.Tools.dll" "%ProgramFiles%Windows Azure EmulatoremulatorMicrosoft.ServiceHosting.Tools.dll" 28
  • #3クラウドサービスのプロジェクトファイ ル 構成 29
  • Roleの設定を記述する2種類のファイル(*.cscfgとServiceDefinition.csdef)と、Roleごとのプロジェクトファイルがある。Roleごとのプロジェクトファイルは、それぞれのロールごとにフォルダが分かれており、その中にプログラムファイルを作成する。(例外あり) Visual Studioの例 30
  • Roleの設定を記述するファイル (1)• *.cscfgファイル(サービス構成ファイル) • Windows Azure ファブリックでのサービスの実 行中に構成できるホステッド サービスの値を設 定するファイル。 サービス構成ファイル内の値 には、各ロールに必要なインスタンスの数、サー ビス定義ファイルで設定されている構成パラメー ターの値、サービスに関連付けられた管理証明書 がある場合はそのサムプリントなどが含まれる。 • インスタンス数やAzure OSバージョンの指定も ここ。 • インスタンス数 Instanceエレメントのcountに指定 • OSバージョン ServiceConfigurationエレメントのosFamilyアト リビュート • 1:Windows Server 2008 + IIS 7.0 • 2:Windows Server 2008 R2 + IIS 7.5 • 3:Windows Server 2012 + IIS 8.0 Visual Studio/Visual Web Developer の例 31
  • Roleの設定を記述するファイル (2)• ServiceDefinition.csdef(サービス定義ファ イル) • アプリケーションのサービス モデルを定義 するファイル。このファイルには、ホス テッド サービスを構成するロール、サービ ス エンドポイント、構成設定、SSL エンド ポイント用の証明書などが含まれる。 サー ビスをデプロイして実行した後で、サービ ス モデルを変更することはできない。 • インスタンスサイズの指定はここ。 WebRoleエレメントもしくはWorkerRoleエ レメントのvmsizeアトリビュート • ExtraSmall • Small • Medium • Large • ExtraLarge Visual Studio/Visual Web Developer の例 32
  • RoleごとのプロジェクトファイルRoleに配布するファイルなどを配置する• WebサーバーRoleの場合は、 DOCUMENT_ROOTになる • PHPスクリプト、画像、JavaScript、cssな どを配置 • DOCUMENT_ROOTを変更することも可能• *.csファイル(右画像の例では WebRole.cs) • OnStart(後述)やRunメソッドなどを記述 する• Web.configファイル • Apacheの.htaccessに相当する物 • URL Rewriteなど、ディレクトリごとのIIS 設定• diagnostics.wadcfgファイル Visual Studio/Visual Web Developer の例 • httpdログやパフォーマンスログの取得設定 33
  • #4クラウドサービス へのデプロイ 34
  • 作成したWebアプリケーションをクラウドサービスで稼働させるためには、以下の手順を踏む必要がある。1. 開発環境でアプリケーションのパッケージを作成2. 作成したパッケージをWindows Azure実行環境にデプロイこれらはVSやPowerShellなどのデプロイツールから一連のオペレーションで実施することもできるが、ここでは汎用的な方法である以下の手順を紹介する。1. 各開発ツールでアプリケーションのパッケージファイルを作成 • Visual Studio 2012 Express for Web • Windows Azure PowerShell2. WebブラウザでWindows Azure管理ポータルからデプロイ 35
  • Web管理ポータルhttps://manage.windowsazure.com/ 36
  • #5 Demoクラウドサービスのプロジェクト作成か ら デプロイ 37
  • • Visual Studio 2012 Express for Webによる アプリケーションプロジェクト作成~パッケージ作成• Windows Azure PowerShellによる プロジェクト作成~パッケージ作成• Windows Azure管理ポータルからのデプロイ 38
  • #6クラウドサービス への PHP環境の構築 39
  • Windows Azure上のインスタンスでPHPアプリケーションを動かすためには、インスタンスの初期化時にPHPをセットアップする必要がある。そのための方法として以下のようなものが考えられる。• WebPi Commandを利用してPHPランタイムをインストールする• PHPランタイムのファイルをパッケージに含める• インスタンスの初期化時にwindows.php.netよりファイルをダウ ンロードして、任意のバージョンをインストールするここでは、もっとも簡単な、WebPi Commandを利用してPHPランタイムをインストールする方法を紹介する。 40
  • インスタンス初期化時に任意の処理を実行インスタンスの初期化時にPHPをセットアップするにはStartup TaskまたはOnStartメソッド(.NET)に記述する。• Startup Task • 任意のコマンドを実行することができる• OnStartメソッド • .NETでOnStartメソッドに記述した処理がインスタンス初期化時 に実行されるこれらの処理はPHPのセットアップに限らず、フォルダの権限変更、IISの設定変更やその他のアプリケーションのインストールなどに利用できる。 41
  • Startup Task (1)インスタンス初期化時に任意のコマンドを実行することができる。パッケージ内にバッチファイルを作成し、それを実行することが多い。• ServiceDefinition.csdefに<startup>エレメント内で呼び出すコマンドを記載 <?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="SimpleDemo" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole" vmsize="Small"> : <Startup> <Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" /> </Startup> </WebRole> </ServiceDefinition>• commandLine:実行するコマンド。Roleルートからの相対パス• executionContext:コマンドを実行する権限 • elevated:プロセスは管理者特権で起動される • limited:プロセスをホストしているロールと同じ特権で実行• taskType • simple:現在のタスクが終了してから別のタスクが起動される • background:現在のタスクが終了するのを待たない • foreground:バックグラウンドと同様だが、この値ではすべての フォアグラウンド タスクが終了するまでロールは再起動されない 42
  • Startup Task (2)• バッチファイルはBOM付きのUTF-8で保存してはいけない • VSやメモ帳で編集して保存すると、デフォルトではBOM付き UTF-8になってしまう。 • メモ帳ではANSIを指定して保存すればOK• 環境変数が使える • %ProgramFiles% • %ProgramFiles(x86)% • %SystemDrive% • %SystemRoot%• appcmd.exeでIISの設定変更を行うことができる• バッチファイルからPowerShellコマンドを呼び出すことも可能• 最初に「@echo off」をして出力を抑制する 43
  • OnStartメソッド (1)*.csのOnStartメソッド内にインスタンス初期化時に実施する任意の処理を.NETで記述することできる namespace WebRole { public class WebRole : RoleEntryPoint { public override bool OnStart() { // 構成の変更を処理する方法については、 // MSDN トピック (http://go.microsoft.com/fwlink/?LinkId=166357) を参照してください。 /**** ここに初期化時に実行する処理を記述する ****/ return base.OnStart(); } } }• Microsoft.Web.Administration.dllを利用して、 IISの設定変更などをすることができる 44
  • OnStartメソッド (2)• IISの設定変更などその実行に管理者権限を必要とする処理がある 場合は、ServiceDefinition.csdefファイルでロールのRuntimeを 管理者特権に昇格する <?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="SimpleDemo" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole" vmsize="Small"> : <Runtime executionContext="elevated" /> </WebRole> </ServiceDefinition> • executionContext: • elevated:管理者特権でプロセスが起動される • limited:管理者特権なしでプロセスが起動される 45
  • WebPi Commandを利用してPHPランタイムをセットアップする(1)Startup TaskでWebPi Commandを利用してPHPのランタイムをインストールする方法を紹介する1. %ProgramFiles%MicrosoftWeb Platform Installerにある以下の4つのファ イルをプロジェクトに含める • Microsoft.Web.PlatformInstaller.dll • Microsoft.Web.PlatformInstaller.UI.dll • WebpiCmd.exe • WebpiCmd.exe.config2. VSの場合、含めたすべてのファイルの 『出力ディレクトリにコピー』プロパティを 『常にコピー』に変更する ※ Azure Power Shellなど、VS以外の場合は不要3. ServiceDefinition.csdefを変更する(詳細次頁)4. WebPiCmdを呼び出すバッチファイル (setup_web.cmd)を作成し、 『出力ディレクトリにコピー』プロパティを 『常にコピー』に変更する(詳細次頁) 46
  • WebPi Commandを利用してPHPランタイムをセットアップする(2)• ServiceDefinition.csdef <?xml version="1.0"?> <ServiceDefinition xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=http://www.w3.org/2001/XMLSchema name="phptest" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1" vmsize="ExtraSmall"> <Imports /> <Startup> <Task commandLine="setup_web.cmd &gt; log.txt" executionContext="elevated"> <Environment> <Variable name="EMULATED"> <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" /> </Variable> <Variable name="RUNTIMEVERSIONPRIMARYKEY" value="5.3.17" /> <Variable name="RUNTIMEID" value="PHP" /> <Variable name="RUNTIMEURL" value="http://nodertea.blob.core.windows.net/php/5.3.17.exe" /> </Environment> </Task> </Startup> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> </WebRole> </ServiceDefinition> 出典:http://msdn.microsoft.com/ja-jp/library/windowsazure/hh691735(v=vs.103).aspx 47
  • WebPi Commandを利用してPHPランタイムをセットアップする(3)• setup_web.cmd @echo off ECHO "Starting PHP Installation" >> log.txt md "%~dp0appdata" cd "%~dp0appdata" cd "%~dp0" reg add "hku.defaultsoftwaremicrosoftwindowscurrentversionexploreruser shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d "%~dp0appdata" /f "%~dp0AssetsWebPICmd.exe" /Install /Products:PHP53,SQLDriverPHP53IIS /AcceptEula >>log.txt 2>>err.txt reg add "hku.defaultsoftwaremicrosoftwindowscurrentversionexploreruser shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%AppDataLocal /f ECHO "Completed PHP Installation" >> log.txt 48
  • WebPi Commandを利用してPHPランタイムをセットアップする(4)• Windows Azure PowerShellのAdd-AzurePHPWebRoleコマンド により作成されるバッチファイルが参考になる • 以下のコマンドを実行することでPHPをインストールするバッチ ファイルが作成される PS> Import-Module "C:Program FilesMicrosoft SDKsWindows AzurePowerShellAzureAzure.psd1" PS> New-AzureServiceProject : ServiceName: phppj (任意のサービス名を入力する) : PS> cd phppj (直前にServiceNameで指定したサービス名) PS> Add-AzurePHPWebRole PS> cd WebRole1bin PS> dir Directory: C:tempphppjphptestWebRole1bin Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 10/25/2012 12:49 PM 2101 download.ps1 -a--- 9/13/2012 11:41 AM 1446 setup.cmd -a--- 9/13/2012 11:41 AM 1268 setup.ps1 -a--- 10/31/2012 8:08 AM 1497 setup_web.cmd※ 2012/11/28現在のバッチファイルは古いWebPIを利用してしまうので、新しいものを使うように書き換える必要がある 49
  • Windows Azure PowerShellを利用してPHPランタイムをセットアップする(1)1. Azureプロジェクトを作成する PS> Import-Module "C:Program FilesMicrosoft SDKsWindows AzurePowerShellAzureAzure.psd1" PS> Get-AzurePublishSettingsFile ← Webブラウザが起動するのでログインすると発行のための設定ファイルがダウンロードされる PS> Import-AzurePublishSettingsFile “{ダウンロードしたファイル名をフルパスで}” PS> mkdir ~phppj PS> cd ~phppj PS> New-AzureServiceProject : ServiceName: phppj (任意のサービス名を入力する) : PS> cd phppj (直前にServiceNameで指定したサービス名) PS> Add-AzurePHPWebRole2. 現時点(2012/11/28)では利用しているインストーラー (WebPI)が古いため、WebRole1setup.cmdを最新のWebPIに 書き換える “.webpicmdline” /Products:PHP53,SQLDriverPHP53IIS,PHPManager /AcceptEula >> ..startup-tasks-log.txt 2>>..startup-tasks-error-log.txt ↓ “.webpicmd” /Install /Products:PHP53,SQLDriverPHP53IIS,PHPManager /AcceptEula >> ..startup-tasks-log.txt 2>>..startup-tasks-error-log.txt 50
  • Windows Azure PowerShellを利用してPHPランタイムをセットアップする(2)3. %ProgramFiles%MicrosoftWeb Platform Installerにある以下 の4つのファイルをプロジェクトに含める • Microsoft.Web.PlatformInstaller.dll • Microsoft.Web.PlatformInstaller.UI.dll • WebpiCmd.exe • WebpiCmd.exe.config4. パッケージファイルを作成する PS> Publish-AzureServiceProject –Location “East Asia” -PackageOnly 51
  • #7 仮想マシン作成時の注意 52
  • インスタンスとストレージのアフィニティグループ• 仮想マシンのインスタンスと、仮想マシンがマウントするディス クイメージを保存するAzure Blobは、同じアフィニティグループ に保存すること • アフィニティグループが同じである方が、そうでないよりもネッ トワーク的に近くなるので、通信速度が速くなる。 • 簡易作成では、ディスクイメージを保存するアフィニティグルー プを選択することができないので、『ギャラリーから』OSを選択 して作成する。 • 以下の手順で仮想マシンを作成する必要がある。 1. 仮想ネットワークの作成をすることで、アフィニティグループも 作成する。 2. 作成したアフィニティグループに属するAzure Storageを作成す る。 3. 仮想マシンを『ギャラリーから』作成する。 4. 仮想マシンモードを選択する画面で作成した仮想ネットワークま 53
  • #8Azure Storage を利用する 54
  • アフィニティグループ• アフィニティグループとは、Windows Azure 内でインスタンスと ストレージ アカウントを地理的にまとめたグループ。 アフィニティ グループは、コンピューティング ワークロードと データ ストレージ ワークロードを同じデータ センター内または 対象ユーザーの近くに配置することにより、サービス パフォーマ ンスを向上させることができる。• インスタンスからアクセス対象となるストレージは、そのインス タンスと同じアフィニティグループに所属させた方が、その間の 通信速度が速くなる。• アフィニティグループの作成は、「仮想ネットワーク」の作成に より可能。• コンピューティングやストレージの作成時にアフィニティグルー プを決定する必要があり、後からアフィニティグループに所属さ せることはできない。 55
  • Windows Azure SDK for PHPPHPからAzure Storageにアクセスするには、Windows Azure SDKfor PHPを利用する。Windows Azure SDK for PHPには以下の2種類がある。• Microsoftが作成しgithubで配布しているもの https://github.com/WindowsAzure/azure-sdk-for-php• PHPAzure - Windows Azure SDK for PHP http://phpazure.codeplex.com/githubで配布されているものが新しく、PHPAzureの作者もgithubで配布されているものを利用することを推奨している。ただし、現時点(2012/11/29)ではPHPAzureのすべての機能をgithub配布版がカバーしているわけではない。ここでは、githubで配布されているSDKでの説明をする。 56
  • #9Azure Blob を利用する 57
  • Azure BlobとはAzure Blobはファイルを格納するストレージである。コンテナーと呼ばれる、ファイルをまとめるフォルダーに相当する機能があるが、コンテナーの作成は1階層のみで、コンテナーの中にコンテナーを作成することはできない。コンテナーより仮想のディレクトリ構成は、ファイル名に『/』を含ませることで疑似的に利用できる。Azure Blob用のツールによっては、このファイル名に含まれる『/』をディレクトリと解釈して表示してくれるものもある。コンテナーごとに共有ポリシーを設定することができ、キーなしでアクセスできるPublic、キーが必要なPrivateがある。コンテナーの共有ポリシーがPublicであれば、http/httpsでファイルにAzureの外部からも直接アクセスできる。https://{アカウント名}.blob.core.windows.net/{コンテナー}/{ファイル名} 58
  • Azure Blob用ツール• Neudesic Azure Storage Explorer• CloudBerry Explorer• Gladinet• ClumsyLeaf CloudXplorer• Cyberduck• myAzureStorage• etc... CloudBerry Explorer 59
  • PHPからAzure Blobのファイルにアクセスする(1)Azure BlobにアクセスするためにはWindows Azure SDK for PHPを利用する。• 接続 ServiceBuilderのインスタンスのcreateBlobServiceメソッドに接 続文字列を渡して接続する。 // Windows Azure SDK for PHP ライブラリの読み込み require_once vendorautoload.php; use WindowsAzureCommonServicesBuilder; use WindowsAzureCommonServiceException; use WindowsAzureBlobModelsCreateBlobOptions; $protocol = https; // Storageへの通信プロトコル http or https $accountName = YOUR STORAGE ACCOUNT; // ストレージアカウント $accountKey = YOUR STORAGE ACCOUNT KEY; // ストレージアカウントキー $connectionString = DefaultEndpointsProtocol= . $protocol . ; . AccountName= . $accountName . ; . AccountKey= . $accountKey; // Windows Azure Storageに接続 $blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString); 60
  • PHPからAzure Blobのファイルにアクセスする(2)• ファイルの格納 ファイルの格納はcreateBlockBlobメソッドなどを使う。 createBlockBlobメソッドで作成されるファイルはBlock Blobになる。 ローカルストレージのファイル システムからコピーする事が可能。 //アップロードするファイル $content = fopen(C:sample.png, r); $blob_name = sample.png; //Content-Typeの設定 $blobOptions = new CreateBlobOptions(); $blobOptions->setContentType(image/png); //アップロード $blobRestProxy->createBlockBlob(public, $blob_name, $content, $blobOptions);• この例ではContent-Typeをimage/pngとしている。• 参考コンテンツ • How to use the Blob service from PHP https://www.windowsazure.com/ja-jp/develop/php/how-to-guides/blob-service/ • Windows Azure SDK for PHP API Documentation http://dl.windowsazure.com/phpdocs/namespaces/WindowsAzure.Blob.html 61
  • #10Azure Table を利用する 62
  • Azure Tableとは (1)Azure Table はKVS (Key value Store) の一種。RDBMS のテーブルとは違いリレーションシップを持っておらず、データ構造やインデックスに相当する機能に関しても考え方が異なる。 63
  • Azure Tableとは (2)Partitionkey Rowkey Timestamp first last 性別users 1 2012/01/08 クラウディ 窓辺 女性 ア ←エンティティusers 2 2012/01/21 ななみ 窓辺 女性users 3 2012/01/30 クロード 窓辺 男性users 4 2012/02/13 店長 男性users 5 2012/02/28 ウェブ マトリクスマ ↑ ン ↑ プロパティ 一部のプロパティが (最大255個) なくても格納可能 64
  • Azure Tableとは (3)• テーブルを論理的な構造で表現すると、エンティティ (赤の枠) と プロパティ (青の枠) で表す事ができる• エンティティは、最大で 255 個のプロパティを持つオブジェクト• プロパティの内 Partitionkey/Rowkey/Timestamp はシステムによ り予約されており、エンティティクラスを定義する際の必須項目 である• 各々のエンティティはRDBMS と異なり、プロパティの数と名前 が一致しなくても良い• 固定のスキーマを持たず、制約、外部キー、主キーを持たない• プロパティに必須項目とする概念などは無い為、特定のプロパ ティをキーにしたソートやグループ化は行う事ができない• Partitionkey によってストレージノードが分散されるので、慎重 な設計とチューニングが必要となる 65
  • Azure Table用ツール• Neudesic Azure Storage Explorer• ClumsyLeaf TableXplorer• myAzureStorage Azure Storage Explorer 66
  • PHPからAzure Tableにアクセスする (1)Azure TableにアクセスするためにはWindows Azure SDK for PHPを利用する。• 接続 ServiceBuilderのインスタンスのcreateBlobServiceメソッドに接 続文字列を渡して接続する。 // Windows Azure SDK for PHP ライブラリの読み込み require_once vendorautoload.php; use WindowsAzureCommonServicesBuilder; use WindowsAzureCommonServiceException; use WindowsAzureTableModelsEntity; use WindowsAzureTableModelsEdmType; $protocol = https; // Storageへの通信プロトコル http or https $accountName = YOUR STORAGE ACCOUNT; // ストレージアカウント $accountKey = YOUR STORAGE ACCOUNT KEY; // ストレージアカウントキー $connectionString = DefaultEndpointsProtocol= . $protocol . ; . AccountName= . $accountName . ; . AccountKey= . $accountKey; // Windows Azure Storageに接続 $blobRestProxy = ServicesBuilder::getInstance()->createTableService($connectionString); 67
  • PHPからAzure Tableにアクセスする (2)• エンティティ(行)の追加 エンティティの追加にはinsertEntityメソッドなどを使う。 // テーブル作成 $tableRestProxy->createTable("mytable"); // エンティティ(行)の作成 $entity = new Entity(); $entity->setPartitionKey("tasksSeattle"); $entity->setRowKey("1"); $entity->addProperty("Description", null, "Take out the trash."); $entity->addProperty("DueDate", EdmType::DATETIME, new DateTime("2012-11-05T08:15:00-08:00")); $entity->addProperty("Location", EdmType::STRING, "Home"); // エンティティの追加 $tableRestProxy->insertEntity("mytable", $entity);• 参考コンテンツ • How to use the Table service from PHP https://www.windowsazure.com/ja-jp/develop/php/how-to-guides/table-service/ • Windows Azure SDK for PHP API Documentation http://dl.windowsazure.com/phpdocs/namespaces/WindowsAzure.Table.html • Windows Azure Table の利用 ~ 特性とパフォーマンスの検証 http://msdn.microsoft.com/ja-jp/windowsazure/hh398428 68
  • #11SQL Database を利用する 69
  • SQL DatabaseとはSQL Databaseは、Microsoft SQL Serverを基に開発された RDBMSで、SQL Server同様 Transact-SQL (T-SQL) を用いて、アクセスする事ができる。分散構造で提供される Windows Azureストレージ サービスとは異なり、RDBMS である SQL Databaseは単一障害点となり得るため、プライマリーサーバーに加え2つの物理サーバー上にデータを複製し、合計3台で稼働する事で高可用性を維持している。プライマリーに障害が発生した場合は、自動的にセカンダリに切り替わってサービスを継続する。 70
  • SQL Database管理ツール• SQL Database管理ポータル• Microsoft SQL Server Management Studio 2008 R2 SP1以降 Microsoft SQL Server Management Studio 2008 R2 SP1 71
  • データベースの作成• データベースの作成 • Windows Azure管理ポータルの[+新規]ボタンから「データサービ ス」 - 「SQLデータベース」 - 「カスタム作成」と選択する。 ※ 「簡易作成」ではデータベースの照合順序を選択できない 72
  • 認証とファイアウォール (1)SQL Databaseへの接続は以下にの2つより制御される • 接続先サーバー名とログインID、パスワードによる認証 • Windows Azure管理ポータルで作成できるユーザーは1つの管理 ユーザーだけだが、T-SQLで権限を制限した追加ユーザーを作成 することができる • 接続時に最低限指定するパラメータは以下 • サーバー名 Windows Azure管理ポータルでサーバーを作成したときに自 動で作られたランダムな文字列 + ".database.windows.net" ex.) abcd1234.database.windows.net • ログイン名 ログイン名 + "@" + Windows Azure管理ポータルでサーバー を作成したときに自動で作られたランダムな文字列 + ex.) yourename@abcd1234 • パスワード 73
  • 認証とファイアウォール (2)• 接続元IPアドレスを制限するファイアウォール • Windows Azure管理ポータルのデータベースの「構成」ページで データベースに対して設定することができる • Windows Azure外の接続元のグローバルIPアドレスを許可する必 要がある • Windows Azure上のインスタンスからの接続を許可するには、 「使用できるサービス」の「」WINDOWS AZUREサービス」を 『はい』にする。 • 設定の反映に5分程度かかる 74
  • PHPからSQL Databaseにアクセスする (1)PHPからSQL Databaseにアクセスするには、Microsoft Drivers forPHP for SQL Serverを利用する。http://www.microsoft.com/downloads/en/details.aspx?FamilyID=80e44913-24b4-4113-8807-caae6cf2ca05Microsoft Drivers for PHP for SQL Serverは、PHPエクステンションとして提供されている。ローカルPCへのインストールにはWeb Platform Installerを利用し、Windows Azure上のインスタンスへのインストールはWebPi Commandを利用する(前述の『WebPi Command を利用してPHPランタイムをインストールする 』のように/Productsオプションに「SQLDriverPHP53IIS」を指定する)のが最も簡単である。インストールが正常にできているかは、phpinfo()でネイティブの『sqlsrv』および抽象化されたPDOの『pdo_sqlsrv』のうち利用したいものが表示されていることを確認する。マニュアルはPHPのオフィシャルドキュメントと、上述のURLからダウンロードできるファイルに含まれているヘルプファイルの両方を参照するのがよい 75
  • PHPからSQL Databaseにアクセスする (2)• sqlsrvドライバを利用した接続例 <?php // 定数 define(SERVERNAME, "yourhost.database.windows.net"); // SQL Databaseの FQDN define(DB_USER, username); // ユーザー名 define(DB_PASS, password); // パスワード // 接続情報 $connectionInfo = array( "UID" => DB_USER.@.SERVERNAME, "PWD" => DB_PASS, "Database" => "sample" ); // SQL Databaseへの接続 $conn = sqlsrv_connect(SERVERNAME, $connectionInfo); if ($conn === false) { echo "接続に失敗しました。rn"; die(print_r(sqlsrv_errors(), true)); } echo "接続しました。rn"; // 現在 SQL Databaseにアクセスしているユーザーを取得するクエリ $tsql = "SELECT CONVERT(varchar(32), SUSER_SNAME())"; $stmt = sqlsrv_query( $conn, $tsql); if( $stmt === false ) { echo "クエリの発行に失敗しました。rn"; die( print_r( sqlsrv_errors(), true)); } // クエリの結果取得 $row = sqlsrv_fetch_array($stmt); echo "ログインしているユーザー: ".$row[0]."rn"; // コネクションとステートメントの開放 sqlsrv_free_stmt( $stmt); sqlsrv_close($conn); 76
  • PHPからSQL Databaseにアクセスする (3)• pdo_sqlsrvドライバを利用した接続例 <?php // 定数 define(SERVERNAME, "yourhost.database.windows.net"); // SQL Databaseの FQDN define(DB_USER, username); // ユーザー名 define(DB_PASS, password); // パスワード try { $conn = new PDO("sqlsrv:server=" . SERVERNAME . ";Database = sample", DB_USER."@".SERVERNAME, DB_PASS); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("接続に失敗しました。rn"); var_dump($e); } echo "接続しました。rn"; // 現在 SQL Databaseにアクセスしているユーザーを取得するクエリ $tsql = "SELECT CONVERT(varchar(32), SUSER_SNAME())"; $stmt = $conn->query($tsql); // クエリの結果取得 $row = $stmt->fetch(PDO::FETCH_NUM); echo "ログインしているユーザー: ".$row[0]."rn"; // コネクションとステートメントの開放 $stmt = null; $conn = null; 77
  • SQL Databaseの制限• SQL DatabaseはSQL Serverと比べていくつかの機能が制限されてい る • テーブルにはクラスタ化インデックスが必須 • プライマリキー作成時にそのインデックスがクラスタ化インデックス になる • その他の違いは以下を参照 http://msdn.microsoft.com/ja-jp/library/ff394115.aspx• SQL Databaseは共有リソース上で動いているため以下のような場合 に強制的に切断される • リソースの過度の使用 • 30分以上アイドル状態の接続 • サーバー障害によるフェイルオーバー すなわち、強制切断に備えて、再接続する仕組みを入れておく必要が ある• ガイドラインと制限事項について以下にまとめられている http://msdn.microsoft.com/ja-jp/library/ff394102.aspx 78
  • 日本語やマルチバイト文字を扱うSQL Server(SQL Databaseを含む)では、Unicode文字列を格納する型として、nvarchar/nchar が用意されている。これらUnicode文字列を格納する際や比較を行う際のUnicodeリテラル文字列には、プレフィックスとして『N』を付与する必要がある。• INSERTの例 INSERT INTO sample (ID, UserName, Created, Updated) VALUES (1, Nテスト銀行 , GETDATE(), GETDATE())• SELECT ~ WHEREの例 SELECT UserName WHERE UserName = Nクラウディア 79
  • タイムゾーングローバルに提供されるデータベースサービスのため、標準のタイムゾーンがUTCとなっている上に、接続ごとにタイムゾーンを指定することはできない。そのため、各国での利用では標準時刻との差を補正する必要がある。仮に日本でのサービスであれば以下のようにするとよい。• datetimeoffset型を使う datetimeoffset型にはタイムゾーンが含まれる。 この型で扱うデータに対して、switchoffset関数とsysdatetimeoffset 関数を利用することで、JSTに変換することができる。 • INSERT INTO sample VALUES(switchoffset(sysdatetimeoffset(), +09:00)) INSERTの際にJSTに変換して格納する • SELECT switchoffset(col, +09:00) FROM sample UTCで格納されているデータをSELECTの時にJSTに変換する • これらを置き換えるユーザー定義関数やビューを作ってしまってもい いだろう 80
  • MySQL vs SQL Database• バックアップ&リカバリ • MySQL:ユーザーの責任 • SQL Database:自動で行われる• 死活監視 • MySQL:ユーザーの責任 • SQL Database:自動で行われる• クラスタリング環境 • MySQL • ユーザーが実施 • 用意した台数分だけ、インスタンス費用とストレージ費用がかかる • SQL Database • 自動でマスターノード1台、スレーブノード2台 • 費用は標準価格に含まれる 81
  • #12 Frameworkテンプレートエンジ ン 82
  • Frameworkテンプレートエンジンの利用Windows Azureでも、CakePHPなどのFrameworkや、Smartyなどのテンプレートエンジンを利用することができる。その際、以下の注意が必要となる。• キャッシュファイルを出力する場合は、その出力先フォルダがIIS_IUSRSグ ループから書き込み可能である必要がある • Startup TaskやOnStartメソッドでicaclsコマンドなどを利用して書き込み権限 を与える icacls ..approottemp /grant "IIS_IUSRS":F /T• SQL Databaseを利用する場合、FrameworkのSQL Serverドライバが提供さ れており、さらに日本語を扱う場合はそのドライバが日本語に対応している必 要がある 以下にあげるFrameworkは対応しているようだ • CakePHP • ZendFramework • CodeIgniter (http://cisqlsrvuni.codeplex.com/を利用する) • symfony 83
  • #13セッション変数 $_SESSION 84
  • セッション変数の利用(仮想マシン&クラウドサービス)• 複数のWebサーバーがある場合、デフォルトの session.save_handler=filesでは、ロードバランサがどのサー バーにつなぐことを選択するかわからないため機能しない• 仮想マシンおよびクラウドサービス用のロードバランサはセッ ションアフィニティの機能を持たない• memcachedをセッション変数の保存先として利用することができ る • extension=php_memcache.dll • session.save_handler=memcached • session.save_path="tcp://memsv1:11211,tcp:memsv2:11211"• sqliteやPostgreSQLなどのセッションハンドラも存在する• カスタムセッションハンドらを作成することも可能 http://php.net/manual/ja/session.customhandler.php 85
  • セッション変数の利用(Webサイト)• Webサイト用ののロードバランサはセッションアフィニティの機 能を持つため、複数のWebサーバーがあってもデフォルトの session.save_handler=filesでセッション変数を利用できる• Memcachedなどをセッション変数の保存先として利用することが できない 86
  • #14 IISの設定 87
  • Windows Azure上のWebサーバー• クラウドサービスおよび仮想マシン上のWebサーバーは、Full IISと呼 ばれる通常のIISで動くモードと、HWC(Hostable Web Core)と呼 ばれるアプリケーション組込用のIISが動くモードがある • 自由度の高いFull IISで動かすことをお奨めするが、Windows Azure Tools for Eclipseでデプロイパッケージを作成するとデフォルトでは HWCモードになる• Full IISの場合、選択するAzure OSのバージョンにより、IIS 7.0かIIS 7.5、IIS 8.0のいずれかになる • Azure OS 1.x系:IIS 7.0 • Azure OS 2.x系:IIS 7.5 • Azure OS 3.x系:IIS 8.0 特別な要件がない限りは、IIS 8.0のAzure OS 3.x系を利用することをお 奨めする。 各バージョンでは、同じ機能の設定方法がほとんどの場合は同じにな るため、IIS 7.0の設定資料がIIS 7.5やIIS8.0でもそのまま利用できると 思って良い。 88
  • IIS全体への設定オンプレミスのWindows ServerでのIISの設定は、IISマネージャーというGUIツールで実施するのが一般的である。Windows Azureでもリモートデスクトップで接続してIISマネージャーで設定することも可能だが、その方法だと以下のような場合にも手作業で設定しなければならないのでお奨めしない。 • インスタンス追加時の新しいインスタンスに対して • インスタンスのOSがバージョンアップがされた場合 • インスタンスを『初期状態にリセット』した場合 • インスタンスに障害が発生し、別の物理サーバーにVMが移動した場合 • 何らかの理由によりインスタンスが再起動した場合その代わりとして、以下のような方法で上記のような場合にも再設定されるようにしておく必要がある。 • Startup Taskでappcmd.exeを利用する • Startup TaskでPowerShellのWebAdministrationモジュールを利用する • OnStartメソッドでMicrosoft.Web.Administrationクラスなどを利用 89
  • ディレクトリ単位での設定IISで公開されているディレクトリごとの設定はWeb.configでできる。Apacheの.htaccessのような役割のファイルである。SystemDriveのドライブレターや、DOCUMENT_ROOTのドライブレターが変更される可能性があるので、これらのパス情報を書き込むような設定をしてはいけない。 90
  • 記述方法の知り方• ディレクトリ単位での設定 IISマネージャーで対象のディレクトリを選択した状態で設定を変更 し、それによってWeb.configの変更された内容を確認する。 それを参考にして、プロジェクトのWeb.configを作成する。• IIS全体への設定 IISマネージャーでサーバーを選択し『構成エディター(英語: Configuration Editor)』を開き、そこで変更をする。 変更したい項目はsystem.webセクションかsystem.webServerセク ションにあることが多い。 値を変更したら画面右の『スクリプトの生成(英語:Generate Script)』をクリックすることで、変更方法のコードが表示される のでこれを参考にしてStartup TaskやOnStartメソッドを記述する。 91
  • URL Rewrite (1)URL Rewriteについてはよく話題に出てくるので、参考情報としてここにあげる。Windows Azure上のIISでももちろん、URLをRewriteすることができる。IISマネージャーでApacheのmod_rewriteの設定文を変換することができるのでその方法を紹介する。1. IISマネージャーで適当なサイトかフォルダを選択し、『URL書き 換え(英語:URL Rewrite)』を開く2. 画面右側の『規則のインポート(英語:Import Rules)』をク リックする3. Rewrite rules欄にmod_rewriteの設定を書き込んで適用 (Apply)する4. これによって作成されたWeb.configを参考に、Windows Azure 用のWeb.configを作成する 92
  • URL Rewrite (2)<?xml version="1.0" encoding="UTF-8"?><configuration> <system.webServer> <rewrite> <rules> <rule name="インポートされた規則 1" stopProcessing="true"> <match url="^$" ignoreCase="false" /> <action type="Rewrite" url="app/webroot/" /> </rule> <rule name="インポートされた規則 2" stopProcessing="true"> <match url="(.*)" ignoreCase="false" /> <action type="Rewrite" url="app/webroot/{R:1}" /> </rule> </rules> </rewrite> </system.webServer></configuration> Web.config 93
  • #15クラウドサービスのアプリケーションの 更新方法 94
  • クラウドサービスでは、従来のオンプレミスサーバーやホスティングサーバーと同じ方法では、アプリケーションのバージョンアップができない。それは、バージョンアップでサーバー上のファイルを直接変更した状態で、OSメンテナンスや障害などによりインスタンスが初期化されると、そのバージョンアップは消えてしまい、デプロイ時の状態に戻ってしまうためである。それに加えて、インスタンスを増加したときに、新しく追加されたインスタンスでもバージョンアップは反映されない。ここではアプリケーションをバージョンアップする方法を紹介する。• ステージングからのVIP Swap• In-Place Upgrade• Windows Azure Web Hosting Suite 95
  • ステージングからのVIP Swap同一ホステッドサービス内の運用環境のデプロイに割り当てていたVIPをステージング環境のデプロイに付け替える機能。運用中のホステッドサービスのステージング環境に最新バージョンのアプリケーションをデプロイし、運用環境とステージング環境を入れ替えることでバージョンアップできる。• メリット • サービスの停止時間を最も短くできる VIP Swapにかかる時間は数秒 • ステージング環境でテストしたものをそのままリリースできる • 新バージョンに不具合があった場合、すぐに旧バージョンに戻すことができ る• デメリット • デプロイをする必要があるので作業時間が長くなりがち • ステージング環境にデプロイしたアプリケーションに不具合があった場合、 その修正をしたものを再度デプロイしなければいけないので、さらに作業時 間が長くなる • エンドポイント構成が同一でないと入れ替えできない 96
  • In-Place Upgrade稼働しているデプロイのすべてのインスタンスを5つ程度のグループに分けて、グループごとに順次アップグレードする機能。• メリット • 全てのRoleで複数のインスタンスが稼働していればローリング アップグレードされるのでサービス停止しないで済む• デメリット • アップグレード開始から終了まで、全てのインスタンスのアップ グレードが完了するのに時間がかかる • アップグレード中に、新旧2つのバージョンが共存してしまう 97
  • Windows AzureWeb Hosting SuiteファイルをFTPでアップロードしてバージョンアップすることができる。FTPサーバーとWebサーバーは定期的にファイルを同期している。http://azurehosting.codeplex.com/• メリット • FTPでバージョンアップできるのでなじみやすい• デメリット • FTPサーバー専用のインスタンスを動かしているため、その分余 計に費用がかかる • FTPサーバーとWebサーバーの同期が定期的に行われているので、 アップロードした瞬間にWebサーバーに反映されるのではなく、 同期されるまでのタイムラグがある 98
  • その他のアイディア• gitやSubversionを利用して最新のファイルを取得する仕組みを作 る• ファイルの更新をAzure Blobに対して行い、そこからファイルを 取得する仕組みを作る 99
  • #16 データのバックアップ 100
  • Azure StorageとSQL Databaseのデータ• Azure Storageは6多重、SQL Databaseは3多重されて全体バック アップも取られているため、ユーザーとしてはバックアップを取 らないという割り切りもあり• ユーザーの操作ミスによるデータの損失はリカバリできないため、 そのためのバックアップは必要となる• Azure Storageのデータは、通常のAzure Storageへのアクセス方 法でバックアップすることになる• SQL Databaseのバックアップは、以下のツールなどが利用できる • BCPコマンド • DACエクスポート(SQL Database管理ポータルなどから実施) • SQL Database Data Sync • SQL Database Data Copy 101
  • #17memcached互換 Caching 102
  • Windows Azure Cachingはクラウドサービスのインスタンス上に構築できるキャッシュサービスで、memcachdプロトコルでアクセスすることができる。Cachingをホストするインスタンスを複数にすることによって、それぞれのインスタンスでデータをコピーし、高可用性を実現することができる。キャッシュの利用方法によって、以下の二つの構成をとる。 Webロール Webロール Workerロール アプリケーショ アプリケーショ ン ン Caching Caching Memcacheサーバーゲートウェイ Memcacheクライアントshim 103
  • アプリケーションとキャッシュを同じインスタンスに構築する方法• ロールのキャッシュ設定で「キャッシュを有効にする」にチェッ ク• エンドポイント設定で 名前=memcache_default / 種類=Internal / プロトコル=tcp / プライベートポート=11211 104
  • アプリケーションとキャッシュを異なるインスタンスに構築する方法• キャッシュのロールは、前述の同じインスタンスにする設定と同 じ• アプリケーションのロールで以下を行う • NuGetで「Windows Azure Caching Memcache Shim」パッケージ をプロジェクトにインストールする • web.config(Webロール)またはapp.config(Workerロール)の autoDiscovery要素にキャッシュをホストするロールのロール名を 記入する default config which is used for all Named Caches <dataCacheClients> <!-- This is the This can be overriden by specifying other dataCacheClient sections with name being the NamedCache name --> <dataCacheClient name="DefaultShimConfig" useLegacyProtocol="false"> <autoDiscover isEnabled="true" identifier="WorkerRole1" /> <!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />--> </dataCacheClient> </dataCacheClients>• アプリケーションからは、localhostにmemcachedサーバーがあ るように見える 105
  • PHPからmemcachedを利用する• php_memcache.dllエクステンションをインストールする • PHPのextディレクトリにphp_memcache.dllファイルを置き、 php.iniにextension=php_memcache.dllと記述する http://downloads.php.net/pierre/php_memcache-2.2.6-5.3-nts-vc9-x86.zip 106
  • #18事例 107
  • 事例1モーグリのツイートキャッチ システム構成 Windows Azure Platform サーバー群 データベース Webサーバー (SQL Database) (PHP) DB HTTP WorkerRole (ツイート収集) Azure Storage Blob CDN (ビデオコンテンツ) ※Webで公開されている情報から読み取ったものなので正確ではない可能性があります 108
  • 事例2 ソーシャルゲーム 初期システム構成 Windows Azure Platform L x 20, M×1 インスタンス データベース(MySQL) L x 5, M×5 インスタンス HTTP WebサーバーHTTP (PHP) GREE L x 20インスタンス User DB (My SQL) バッチ L x 5 インスタンス M×1インスタンス MASTER DB 運 M×3インスタンス 営 監視(phpMyAdmin) TEMP DB M×1インスタンス M×2インスタンス 開発(PHP,バッチ) M×2インスタンス Azure Storage Azure Storage 共有ファイル/バックアップ領域 My SQLファイル 109
  • 事例2 ソーシャルゲーム 第二期システム構成 Windows Azure Platform L x 20, M×1 インスタンス データベース(SQL Database) 3インスタンス,70GB HTTP WebサーバーHTTP (PHP) GREE L x 20インスタンス User DB 50GB バッチ M×1インスタンス MASTER DB 運 10GB 営 監視 TEMP DB M×1インスタンス 10GB 開発(PHP,バッチ) M×2インスタンス Azure Storage 共有ファイル/バックアップ領域 110
  • 事例3スマートフォンゲーム システム構成 Windows Azure Platform 日本向けサーバー(東アジア) データベース (SQL Database) Webサーバー(PHP) 4インスタンス S×6インスタンス 日本向けDB HTTP アジア向けサーバー(東アジア) Webサーバー(PHP) アジア向けDB S×6インスタンス アメリカ向けDB アメリカ向けサーバー(北米) 運 Webサーバー(PHP) 営 XS×2インスタンス ヨーロッパ向けDB ヨーロッパ向けサーバー(西欧) Webサーバー(PHP) 開発(PHP,FTP) XS×2インスタンス XS×1インスタンス Azure Storage Blob CDN 画像/音声ファイル 111
  • 事例2 mixiXmas システム構成 Windows Azure Platform サーバー群 HTTP Web Role memcachedサーバーHTTP (.NET) mixi Worker Role 運 Table 営 Queue CDN Blob Azure Storage 112
  • #19PHP on Azureべし ・ べからず 113
  • 共通• SQL Databaseでは日本語の取り扱いに気を付けるべし • 照合順序の設定 • Nプリフィックスをつけるべし• SQL Databaseではタイムゾーンを意識すべし • UTCになっている• PHPAzureは使うべからず • 開発が止まっている• セッション変数を使うべからず (クラウドサービス&仮想マシ ン) • 複数のWebサーバーがある場合、ロードバランサがどのサーバー につなぐことを選択するかわからないため機能しない • Azureのロードバランサはセッションアフィニティの機能を持た ない 114
  • クラウドサービス(1)• ファイルの書き込みをAzureインスタンスのローカルディスクにす るべからず • ローカルディスクはメンテナンスや障害で消えてしまうことがあ る → ローカルディスクに保存したファイルは消えてしまうものと 思って扱うべし • Azure BlobやSQL Databaseなど、永続化されるストレージに保存 すべし • Frameworkのキャッシュなど、永続化不要なファイルはローカル ディスクに保存すべし• OSやIISの設定はStartup TaskやOnStartメソッドで実施すべし 115
  • クラウドサービス(2)• Windows Azure Tools for Eclipse、php_azure.dllは使うべから ず • 開発が止まっている • Eclipse PDTでコーディングするのは問題ない• Full IISモードでWebサーバーを動かすべし• 運用では2台以上のサーバーで運用すべし • Azure OSアップデートによる再起動が1~2ヵ月に1回程度はある • 複数台動かしていることによって、ローリングアップグレードに なるのでサービス停止にならない• Startup Taskのコマンドファイルはキャラクタセット『ANSI』か 『UTF-8 BOMなし』で保存すべし メモ帳で日本語を書いたり、VSでファイルを保存すると、UTF-8 BOM付きで保存されてAzure上でインスタンスが起動しなくなる 116
  • 仮想マシン• インスタンスと、インスタンスがマウントするディスクイメージ があるBlobストレージは同じアフィニティグループにすべし• 仮想マシン同士で通信したい場合は、仮想マシン作成時に「既存 の仮想マシンに接続します」を選択すべし 117
  • #20Appendix 118
  • PHPアクセラレータ• APCは利用できない• 『Windows Cache Extension for PHP』が利用できる http://www.iis.net/download/wincacheforphp http://www.php.net/manual/ja/book.wincache.php • WebPiCmdでインストールできる webpicmd.exe /Install /Products:PHP53,wincache53 /AcceptEula 119
  • iOS、AndroidアプリケーションからWindows Azure Storageを利用するiOSやAndroidからWindows Azure Storageを利用するためのToolkitが提供されている• Windows Azure Toolkit for iOS https://github.com/WindowsAzure-Toolkits/wa-toolkit-ios• Windows Azure Toolkit for Android https://github.com/WindowsAzure-Toolkits/wa-toolkit-android 120
  • メールの送信Windows Azureでは、SMTPサービスを提供していない。また、Windows AzureのインスタンスにSMTPサーバーを構築し、そこからメールを配信することも推奨されていない。• 利用しているIPアドレスが以前の利用者のせいでブラックリスト に登録されている可能性があるため。メールを送信するには、Office 365やSendGridなどの、外部のSMTPサービスを利用することになる。• How to Send Email Using SendGrid(英語) • https://www.windowsazure.com/en-us/develop/net/how-to- guides/sendgrid-email-service/ 121
  • Windows Azure Toolkitfor Social Gameshttps://github.com/WindowsAzure-Toolkits/wa-toolkit-gamesWindows Azure Toolkit for Social Gamesには、開発者がWindowsAzure環境に手早くソーシャルゲームを構築することを助ける、ガイダンス、サンプル、ツールなどが含まれている。 122
  • cronに相当するタスクスケジューラLinuxでバッチ処理を定期的に行う方法の一つとして、cronがある。WindowsならびにWindows Azureでは『タスクスケジューラ』がこれに相当する。タスクスケジューラには、schtasksコマンドでジョブを登録することができるため、Startup TaskやOnStartでこれを実装する。• schtasksのヘルプは以下の引数を渡すことで参照できる C:> schtasks /Create /?• schtasksの例 schtasks /create /sc daily /MO 1 /tn SampleTask /ru "NT AUTHORITYLOCALSERVICE" /tr "%%ProgramFiles(x86)%%phpphp.exe %~dp0batchtest.php" /st 00:00リモートデスクトップでAzure上のインスタンスにログインして、コマンドプロンプトでテスト実行してみるとよいだろう。複数のインスタンスが稼働しているロールに設定して、同時に複数のバッチが実行されないように注意すること 123
  • Azure OSバージョンの固定Azure OSバージョンを自動にしていると、新しいバージョンのAzureOSが利用可能になったときに、自動でバージョンアップする。その結果、インスタンスが順次リフレッシュされる。意図しないタイミングでのインスタンスのリフレッシュを望まない場合は、Azure OSバージョンを指定しておくことで、その回数を減らすことができる。• ServiceConfig.cscfgファイルのServiceConfigurationエレメントの osVersionアトリビュートにAzure OSバージョンを指定する ※ xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*"> osFamilyアトリビュートと整合性のとれたバージョンを指定する <ServiceConfiguration serviceName="PhpOnAzure" こと osVersionに指定できる値は http://msdn.microsoft.com/en- us/library/ee924680.aspx から、各バージョンページの 『Configuration value』であるosVersionを指定していても、インスタンスをホストしているサーバーのバージョンアップや、深刻なセキュリティホールが発見されたAzure OSバージョンを利用してた場合は、リフレッシュされることがある。 124
  • Mac OS Xでの開発PHPのソースを書くことや、仮想マシンやWebサイトを構築するという点では、Mac OS Xでも何ら問題ない。Windows Azure SDK for PHPはそのまま動作する。しかし、クラウドサービスでは以下の課題を解決する必要がある。 • デプロイするためのパッケージファイルの作成ができない • Mac OS X上で動作確認するための環境 • SQL Databaseに接続するためのドライバ(php_sqlsrv.dll)がないこれを解決するためのアイディアとしてParallels DesktopやVMWare Fusion、VirtualBoxなどのデスクトップ仮想化製品を利用し、そのゲストOSとしてWindowsを入れ、そこにWindows Azure開発環境を構築、ソースフォルダを共有してMac OS Xから編集する方法が考えられる。 125
  • Webコンテンツ• Windows Azure PHP Developer Center http://www.windowsazure.com/en-us/develop/php/• Windows Azure Training Kit https://github.com/WindowsAzure-TrainingKit• Windows Azure SDK for PHP http://dl.windowsazure.com/phpdocs/• Windows Azure によるアプリケーション開発基礎 (クラウドサービス) http://msdn.microsoft.com/ja-jp/windowsazure/gg263608• IT Pro (IT 担当者) のための Windows Azure Platform 運用管理ガイド 1.0 (クラ ウドサービス) http://technet.microsoft.com/ja-jp/cloud/hh224648.aspx• Windows Azure http://msdn.microsoft.com/en-us/library/windowsazure/• Internet Information Services (IIS) TechCenter > PHP on IIS http://technet.microsoft.com/ja-jp/iis/ee794964.aspx• Windows Azureデベロッパーセンター - コミュニティ http://msdn.microsoft.com/ja-jp/windowsazure/cc974147 126
  • トレーニング• 無料 クラウド & モバイル開発トレーニング ~ Cloud Developers Field http://www.microsoft.com/japan/windowsazure/events/hol/ 127
  • フォーラム• Windows Azure - 全般 http://social.msdn.microsoft.com/Forums/ja- JP/windowsazureja/threads• SQL Azure 全般 http://social.msdn.microsoft.com/Forums/ja- JP/sqlazureja/threads• Internet Information Services – 全般 http://social.technet.microsoft.com/Forums/ja-jp/iis7ja/threads• PHP on Windows http://social.technet.microsoft.com/Forums/ja- jp/phpwinja/threads 128
  • コミュニティ• Japan Windows Azure User Group http://r.jazug.jp/ 129
  • Q&A 130