Windows Azure Mobile Services の紹介 〜 クラウドカバー Episode 89

 

今回のクラウドカバーは、「Episode 89 - Windows Azure Mobile Services」の紹介。

Nathan と Nick をホストに、今回のお題である Mobile Services の開発者 Josh Twist をゲストに迎えお送りします。

 

 

 

では、いつものようにニュースから。

 

Introduction to Windows Azure Mobile Services

今回のクラウドカバーの主題でもある、Windows Azure の新しいサービス、Mobile Service 追加のニュースです。

Windows Azure の Mobile Service は、モバイルデバイス向けのアプリケーション開発者がもつ共通の課題である認証やクライアントへのプッシュ通知の機能を、高い可用性と信頼性を保って提供することを目的としたサービスです。

現在 Public Preview という位置づけで公開しており、モバイルデバイスとしては Windows 8 を対象としていますが、将来的に iOS や Android、Windows Phone にも対応予定です。

詳しくは後程。

 

 

Windows Azure Mobile Developer Center

Windows Azure の新しいデベロッパーセンターとして、Mobile Developer Center がオープンしました。

Windows Azure の Mobile Service の情報を中心に、モバイル デバイス向けのアプリケーション開発者に向けた情報提供を行います。

 

 

Windows Azure Training Kit - August Refresh

Windows Azure の Training Kit の August リリースに関しては前回のクラウドカバーでもお伝えしていますが、今回 Mobile Services の公開に伴い、Mobile Services 用のコンテンツ(ハンズオンラボ、プレゼンテーション)が追加されています。

  

Azure Node.js developer center homepage redesign

Windows Azure の Node.js のデベロッパーセンター(Webページ)がリフレッシュ。

より Node に関する情報を得やすいように、情報を整理してすっきりしたデザインになりました。 

 

Announcing enhancements to sql data sync in Windows Azure

Windows Azure の SQL Database (旧称 SQL Azure)を中心に、クラウド間のデータベース同期、あるいはオンプレミス-クラウド間のデータベース同期を可能にするソリューション Data Sync Service が強化されました。

具体的には、同期対象として Geography, Geometory 型のデータが追加されたこと、また同期のための初期設定や、オンプレミスとの同期におけるパフォーマンス向上が図られています。

 

 

 

ということで、ここからは Josh にバトンを渡して今回の本題 Mobile Service について。 

image

 

Mobile Service のいいところはとにかく簡単で、煩わしさがないことだ、という Josh。そんな Mobile Service の良さを理解してもらうには、デモが一番いい、ということで早速デモへ。

 

Josh が Windows Azure の管理ポータルにアクセスすると、左側のメニューに「MOBILE SERVICES」の項目が表示されています。 

image

 

通常はこの項目は表示されていませんが、Windows Azure のアカウント ページの「プレビュー機能」の項目で、Mobile Services の申し込みを行っていただくことで、プレビューでの利用を開始いただくことができます。

https://account.windowsazure.com/PreviewFeatures

image

 

さて、Windows Azure の管理ポータルで、新規に Mobile Service を追加すると、以下のような画面が出ますので、これから作成するサービスの名前と、データベース、および配置するデータセンターの選択を行います。Mobile Service ではデータの保管先として Windows Azure の SQL Database を利用しますので、既存の SQL Database を用いるか、新規で作成するかを選んでください。

 

image

 

Josh は今回、既存のデータベースを使用することにして、次の画面でデータベースのアクセスに用いるユーザー ID とパスワードを入力しています。 

すると、Windows Azure 上で入力された情報に基づき Mobile Service の作成(データベースの初期化やエンドポイントの準備)が開始されます。プレビュー期間中の Mobile Service では10個までの Service を利用いただくことが可能です。また、サービスの作成自体は1分もかからずに終了します。

 

image

 

早速今回作成された “cloudcoverdemo” という名称の Mobile Service のページにアクセスします。

 

image

 

ここから5分もかからずに Windows Azure をバックエンドに使用する Windows 8 のストアアプリが作れるよ!、といった Josh。画面左下にタイマーが追加されますスマイル

  

image

 

 さて、最初に必要なのは、Windows 8 Store Application の開発を行うための Visual Studio の準備と、Mobile SDK のインストール。Josh はすでにその環境があるので今回はスキップ。

なお、Windows 8 Store Application の開発に関しては、Windows 8 自体の機能(WinRT)を使用しているため、Windows 7 以前の Windows 環境では行えませんのでご了承ください。

image

 

さて、次はアプリケーションで使用するデータの保存先としてのテーブルを作成します。テーブルに関しては、スタート用のサンプル的な扱いで ToDo のテーブルが作成されるようになっています(テーブルの追加等は後程実施可能です)。

そして、3番目のステップとして、アプリケーションコードのダウンロードを行います。コードは JavaScript もしくは C# のいずれかが選択可能です。

 

image

 

ダウンロードしたコードを unzip して、Visual Studio で開くと Widnows Store Application のコードが確認できます。また、App.xaml.cs では先ほど Windows Azure の管理画面で作成していた Mobile Service へアクセスするための情報(URLとアプリケーションキー)が含まれているのが確認できます。

 

image

 

 早速デバッグ実行でアプリケーションを確認します。

Windows Store Application が立ち上がりますので、To Do を書き込み、Save ボタンを押します。

 

image

 

すると、クライアント(いま実行している Windows Store Application)から、Windows Azure の Mobile Serive 経由で SQL Database へ書き込みが行われます。

 

ということで、2分3秒でアプリケーションの作成と、動作確認ができました!

image

 

さて、ここからは実際の Mobile Service を使ったアプリケーションの内部を詳しく見ていきます。

まず、クラウドにおいて永続化されるデータは、次のように POCO として作成しています。今回の場合 TodoItem クラスとして、IDと ToDo の内容を示す Text、そして終了したかどうかを示す Complete という3つの要素を持っています。

 

image

 

そして、この TodoItem を Mobile Service 経由で SQL Database とやり取りをする IMobileServiceTabel を実装したクラスのインスタンス(今回は todoTable)が以下のようなコード(MobileService.GetTable<> ())で取得できます。

 

image

 

アプリケーションにおいて、ToDoを新規作成したり、現在仕掛中の ToDoを取得したり、あるいは終了済みとして更新したりするのは、この todoTable を使用することで簡単に可能です。

また、Windows Store Application の特徴である、非同期処理を基本とした処理実行を行うために、todoTable には非同期処理用のメソッドが用意されています。以下の InsertTodoItem() では、非同期処理を行う InsertAsync() メソッドが呼ばれるとアプリケーション的にはメインの画面に処理が戻ります。

その後、Mobile Service 経由でデータの挿入が終了すると、items.Add(todoItem) の処理が実行され、画面上にも新しい todo が表示されます。

 

image

 

 

また、todoTable を利用して Table に対するクエリをかけることも可能です。 

image

 

 

Mobile Service では、データアクセスの際の仕組みとして OData を利用しているので、OData で行える操作であれば直接 URL を組み立てることで任意のクエリをかけることができます。

 

また管理ポータルの Dashboard 機能では、アクセス回数、CPU利用時間、データ送信量をリアルタイムにモニターすることが可能です。

image

 

つぎに、管理ポータルの Data 機能では、Mobile Service で利用するデータベースの情報を確認することができます。

Mobile Service では SQL Database を利用しているため、SQL Server の Management Studio 等のツールを使ってスキーマやデータの確認を行うことも可能ですが、アプリケーションの開発者がよりクライアントアプリケーションの開発に注力できるよう、管理ポータルからデータベース情報へアクセスする機能が提供されています。

image

 

 また、Mobile Service では、”Dynamic Schema” (ダイナミック スキーマ)の機能を用意しており、データベース スキーマの動的更新が可能になっています。

一方で、動的なスキーマ更新はしたくない、という場合には、その機能を Off にすることが可能です。

 

image

 

 実際のアプリケーション開発においては、リリースまでの間は Dynamic Schema 機能を利用して、適宜スキーマ情報を最適化しながら、リリースする際には Off にする、といった運用が可能です。

また、カラムの削除や、インデックスの追加、といったことも管理ポータルから行うことが可能です。

 

一方で、より細かな操作を行いたい、といったような場合には、前述したように SQL Server の Management Studio を利用して、データベースに接続することもできます。

 

image

 

 そして、管理ポータルからは Permission 機能を使って、データ操作毎(Insert, Update, Delete, Read)に操作権限の設定(Everyone, Anybody with the Application Key, Only Authenticated Users, Only Scripts and Admins)を行うことが可能です。

 

image

 

 さて、ユーザーごとにデータの操作権限を設定したりできる?という Nathan の問いに、できるよと回答する Josh。その一つの方法が、先ほども少し出てきた Script 機能。

開発者が必要とする機能は様々なので、開発者にはやりたいことをコードで表現してもらい、一方の Windows Azure はそのコードをセキュアにサーバーサイドで実行する環境を提供しています。

具体的には Mobile Service では、データベース操作時のアクションを JavaScript でカスタマイズ可能になっています。また、Windows Azure の管理ポータルではその Script 作成支援のための JavaScript のリッチな編集機能をブラウザ上で提供しています。

またカスタマイズは、データに対する Insert、Update、Delete、Read 各操作において設定でき、それぞれの操作に割り込むことで完全なコントロールを行うことが可能です。

image 

 

これもデモで詳しく見ていきましょう。 

デモで使用する “Where The Friend” サービスでは、3つのテーブルを使用しています。

どこにいるかを示す CheckIn というテーブルと、ユーザーの情報を示す Customers テーブル、そして友人情報を示す Freinds テーブルです。

 

image

 

 早速アプリケーションを実行すると、立ち上がると同時にサインイン処理が行われます。今回のアプリケーションでは Live ID(マイクロソフト アカウント)を使用した認証が行われます。

image

 

さて、このアプリケーションでは、ユーザーがどこにいるのか(Checkinテーブル)、友人情報(Customersテーブル)の検索と、友人へのつながりリクエスト(Friendsテーブル)、またリクエストに対する返信、が可能です。

 

 

ところで、、、とちょっと深刻なトーンで話す Josh。

「じつは Scott に友人リクエストを出したんだけど断られたんだ、、、、、」 

image

 

 

さて、アプリケーションの観点でいうと、友人関係にないユーザーの Checkin 情報が見えるのはちょっとまずい、、、

そこで情報のフィルタリングをしたいところだけれど、(サーバーサイドはこのままで)クライアントサイドで情報をフィルターする、といったことを行うと Fiddler などで通信情報をチェックすれば、友人でない Customer の Checkin 情報が確認できてしまうので、やはりサーバーサイドでフィルタリングするように変更を行う必要がある。

 

ということで、Checkin 情報を読み出してくる操作(Checkin テーブルの Read()関数)を以下のように、Friends テーブルを参照のうえ、友人情報があるユーザーの Checkin 情報のみを返すようにブラウザ上から変更。 

image

 

すると、わずか数秒でサーバーサイドに上記のロジックが適用完了し、再度読み込んだ際には、Josh の唯一の友人である Josh 自身の Checkin 情報だけしか表示されないようになりました。

コンパイルもデプロイも不要で、コードを書いて Save するだけというお手軽さに Nick も Nathan も感嘆!

 

さて、次に追加したい機能として、Checkin 情報を更新したら友人に Push 通知する機能を、ということで、Checkin テーブルの insert 関数を以下のコードに置き換えます。

 

image

 

なお、Windows Azure の管理ポータルにおいても、リッチな JavaScript エディターを提供していますが、今後数か月でインテリセンスを追加したりますます強化を行って行くそうです。ご期待ください!

 

さて、実際の処理の解説ですが、今回は受け取った操作リクエスト(checkin データを insert する)を実行し、それが成功した場合、に行うコードを追加しています。

 

まず最初に行っているのが、操作リクエストに対する返信(request.respond())で、これで Checkin 情報を作成したユーザーに対して、Checkin 情報の作成が成功した旨返します。

 

その一方で、Friends テーブルからユーザーの友人情報を抜き出し、またその友人の持つデバイス情報を所得します。

デバイス情報には Push Notification 用のチャネル(Channel)情報がありますので、それぞれのチャネルに対してユーザーが Checkin を行った旨通知を行います(デモでは、”Cloud cover is fun!” というメッセージを送るようにコードを書き換えています)。

 

なお、コード中 push.wns とあるのが、Windows Store Application にプッシュ通知を行う Windows Push Notification Service を使用している箇所です。

image

 

 実際に Josh がアプリケーションで Checkin 情報を作成すると、、、

Josh の友人である Josh の画面に Push 表示(トースター形式)が表示されます。

image

 

 

さて、次に紹介するのは、ソーシャルな ToDo アプリ、”doto”。

image

 

友人や家族に対して、「帰りにあれ買ってきて」といったお願いを Push 通知を使って行うことができるアプリです。

まずは Josh が Nick に友人リクエストを行い、Nick は自身の PC でそのリクエストを受けたあと、Josh に対して Nathan に花を買ってくるようにメッセージを書きます。

すると Josh のスタートスクリーンにて、Nick の顔写真とともに、”Buy Nate a bounch of flowers” のメッセージが。 

image

 

なお、doto アプリケーションのコードは MSDN にてダウンロード提供を行っており、ドキュメントなど含む形で利用いただけます。

また、doto アプリケーションでは、クライアントアプリケーションの設定値を SQL Database に保存しており、SQL Database 中のその設定値を追加、変更することにより、全クライアントアプリケーションに対して新しい値を設定することが可能です(下記のデモでは doto8.setting に新しい設定値を追加することで、アプリケーションのアクセントカラーと背景イメージの更新を行っています)。

image

 

 さて、開発中などで誤ってスキーマデータの更新を行ってしまった場合などはどうするの?と Nathan。

 そういった場合、カラムを削除したり、動的なスキーマ適用ができないような変更の場合は元にもどせないし、動的なスキーマ変更で元に戻せる場合は、修復する、とのこと。

 

また、テーブルを削除した場合は、そのテーブル以外を使う操作は問題ないが、そのテーブルを参照している操作はエラーになると Josh。さらに、データベース自体を壊したような場合は、ポータルから Change SQL Database の操作を行うことで新しいデータベースを用意できる、とのこと。

 

image

 

 

 また、Nathan からは、セキュリティの観点で、各クライアントアプリケーションが、Mobile Service にアクセスするための Application Key を持っているのは大丈夫、と質問。

これに関しては、Key には2種類あり、Application Key と Master Key があり、Application Key で利用可能なサービス、権限は一般的なユーザーが行う操作権限に合わせており、限定された操作しかできない、とのこと。

image

 

 また、先に出てきたように各操作ごとに、パーミッション設定が可能なので、アプリケーションキーだけで操作を許可するのではなく、認証ユーザーのみしか操作できない、といった設定を行い、さらにセキュリティを高めることも可能です。

 

image

 

重要なのは、アプリケーションキーに関しては、最終的にユーザーに対してアプリケーションとともに配布されるので、それだけ(アプリケーションキーだけ)でセキュリティを確保するのが難しい、ということを認識しておくことです。

 

 

また、これまでもクラウドカバーで紹介してきた Windows 8 Toolkit や、Windows Phone Toolkit と Mobile Service とのすみわけはどうなるの、と Nathan。

Nick がこれに対して、Toolkit は Windows 8 の開発段階からリリースしてきたものであり、今後も開発を続けるし、その中で得られたフィードバックや新機能に関しては、Josh のチームと同期して Mobile Service に適用されるようにしたい、と回答。

 

Mobile Service は現在 Preview 公開中ですが、今後は Windows Azure のコアサービスの一つとして強化されていくと思いますので、ぜひご注目ください!

 

image

以上、クラウドカバー Episode 89、Windows Azure Mobile Services の紹介でした!

Enjoy♪