【mBaaS】Azure Mobile AppsでiOSアプリを作ってみたかった
Microsoft AzureのmBaaS(Mobile Backend As A Service)である Mobile Apps を使ってみました。
コードを書かなくてもバックエンド機能を提供できるので、すでにAzure上にデータを持っている私にとって、かなり楽にアプリを作れるはずです。
はずだったのですが、パブリックベータ中とはいえあまりにも情報が少なく苦しみました。 結局うまく行かなかったのですがメモを残しておきます。
目的
すでにAzure上にあるSQL Databaseから、何らかの方法でデータを取り出してiOSクライアントで使用します。
Mobile Appsについて調べると、チュートリアルとして自動作成されるTODOリストアプリケーションの作り方はよく見つかるのですが、すでに存在するAzureサービスとiOSアプリをつなぎ合わせる方法は見つかりませんでした。
登場人物たち
- サーバサイド(Microsoft Azure)
- Azure Mobile Apps
- Azure SQL Database
- クライアントサイド(iOSアプリ)
- XCode 7.2(Objective-C)
- 開発マシン
- azure-cli(on node.js)
Microsoft Azureが提供するmBaaS
AzureのmBaaSには2種類あります
- Azure Mobile Service
- Azure App Service の Mobile Apps
まず名前が非常に似ていてややこしいです。 そして、できる事もよく似ています。
一応、公式に違いが書いてあります。
決定的な違いは、 Mobile Appsの方がだいぶ新しい ということです。 作れる画面も場所も違いますので、気をつけていれば混同することはありません。たぶん。
mBaaS | 時期 | 作成場所 |
---|---|---|
Mobile Service | ふるい | クラシックポータル |
Mobile Apps | あたらしい(現状パブリックプレビュー版) | 新ポータル |
今回はMobile Appsの方を使っていきます。
同じようにパブリックプレビュー版のまま使っているAPI Appsは現状バリバリ動いていますので、たぶんMobile Appsも特に問題なく使えるでしょう。たぶん。
新しい方が楽しそうですし。
Azure Mobile Appsの作成
まず新しいポータルにアクセスし、Mobile Appsを作成します。
Easy Tableの設定
下記プレスリリースを頼りに進めます。
とりあえず「クイックスタートに移動して詳細を確認してください」とありますので、確認してみます。
データベース接続文字列を設定するのですが、ここでハマります。
まず 定義済みの接続情報をどうやっても選択できません 。「接続情報が選択されていません」みたいな事を言われて戻されてしまいます。
なので、まったく同じ接続文字列を毎回新しく作りなおすことになります。そういうものなのかもしれませんが。
すると今度は 「Missing SQL Server connection string」 みたいなエラーが出てきて、デプロイが完了できずに終了しまいます。 いや、「選択しろ」と言われたからちゃんと選択して進めているのですが…
あれこれ設定を変えながら10回ほど試してもダメで、なんとなくPCを変えてもう一度やってみたらうまくいきました。 環境の問題か、なにか裏側でトラブルが起きていたか、よく分かりませんが、できました。
cliを使ってみれば良かったかもしれません。
さて、デフォルトでは「TodoItems」というテーブルを作成するようですが、すでに「tweets」というテーブルがありますので、それに対してEasy Tablesを作成してみました。
なんだか盛大に崩れているのですが、一応データらしき何かが表示されていることがわかります。バイナリを無理矢理開いたみたいになっていますが、データベースにあるツイート情報の中身です。表示されている数字は左から「id」「エンゲージメント数」「リツイート数」「お気に入り数」であり、それらしい数字になっていることが分かります。
スキーマ情報は完璧に取得できていました。
iOS側のコード
先述のクイックスタートに、iOS側のクライアントコードの対応箇所も丁寧に書いてあるので、それに従ってコードを書いていきます。
まず「3 Configure your client application」にて「CONNECT AN EXISTING APP」を選択。 「Download the Mobile Services iOS SDK」で落としたファイルをXcodeのプロジェクトにドラッグ&ドロップします。
ヘッダファイルに下記記述を追加します。
#import <MicrosoftAzureMobile/MicrosoftAzureMobile.h>
@property (strong, nonatomic) MSClient *client;
実装ファイルに実際の処理を書いていきます。 クイックスタートのままだとINSERT文になっているのですが、本番のデータベースに勝手なデータを挿入されたら困ります。
下記を参考にSELECT文へ書き換えます。
MSClient *client = [MSClient clientWithApplicationURLString:@"https://xxxxxxxxxx.azurewebsites.net"]; MSTable *table = [client tableWithName:@"tweets"]; [table readWithCompletion:^(MSQueryResult *result, NSError *error) { if(error) { NSLog(@"ERROR %@", error); } else { for(NSDictionary *item in result.items) { NSLog(@"Item: %@", [item objectForKey:@"text"]); } } }];
コレでデータが取れます。
取れるはずなのですが、ログになにも吐かれません。
なにか間違っていると思うのですが、私はMobile AppsにもiOS Objective-Cにも疎いためよく分かりません。 唯一分かるのはデータベースです。
SQL Databaseのクエリログを確認する
このままでは何も手が打てませんので、クエリログを確認しに行きます。 SQL DatabaseのクエリログはAzure Storageに出力できるそうです。
上記を参考に、Azure Storageアカウントを作成し、SQL Databaseの「監査」からログ出力の設定をします。
ちなみに、「監査」を有効化すると、アプリケーションなどのデータベース接続文字列に「secure」を付けないといけなくなるようです。 railsのdatabase.ymlだったらこんな感じです。
#host: myhostname.database.windows.net host: myhostname.database.secure.windows.net
で、設定できたのですが、ここからどうやってログをダウンロードするのか分かりません。 ポータルを探してもダウンロードらしき項目は見つかりません。
Azure Storage Explorerというクライアントソフトを使うとログが見えるそうなのですが、どうもWindows版しか無いようでした。
azurestorageexplorer.codeplex.com
CyberduckがAzure Storageに対応しているそうですので使ってみましたが、エラーが出てしまいダメでした。BLOB Storageにしか対応していないのかもしれません。
おとなしくazure-cliを使ってみてみます。
Macへのazure-cliインストール
npmを入れなければならないのですが、これがまたhomebrewで入るだの入らないだの情報が錯綜していて苦労しました。 自分はnodebrewを使う方法で行けました。
$ brew uninstall node $ brew install nodebrew $ nodebrew install-binary stable $ nodebrew use v5 $ sudo npm install -g azure-cli
Storageの中身を見てみます。
$ azure storage table show SQLDBAuditLogsXXXXXXXX -a ストレージ名 -k プライマリキー info: Executing command storage table show + Getting Storage table information info: No information is found for table SQLDBAuditLogsXXXXXXXX info: storage table show command OK
なにもありませんでした。
心が折れました。
あとは真面目にやるならば、クイックスタートで「CREATE A NEW APP」を選択してダウンロードしたサンプルアプリと見比べながら、足りない設定箇所か何かを探す事になると思います。
まとめ
Azure VMにRuby on Railsを乗せているので、現状はそちらにAPI開発したほうが早いと思いました。 プッシュ通知でも打つ時になったら帰ってきます。