読者です 読者をやめる 読者になる 読者になる

backstage

合唱音源の新着情報の舞台裏

【mBaaS】Azure Mobile AppsでiOSアプリを作ってみたかった

Microsoft AzureのmBaaS(Mobile Backend As A Service)である Mobile Apps を使ってみました。

azure.microsoft.com

コードを書かなくてもバックエンド機能を提供できるので、すでにAzure上にデータを持っている私にとって、かなり楽にアプリを作れるはずです。

はずだったのですが、パブリックベータ中とはいえあまりにも情報が少なく苦しみました。 結局うまく行かなかったのですがメモを残しておきます。

目的

すでにAzure上にあるSQL Databaseから、何らかの方法でデータを取り出してiOSクライアントで使用します。

Mobile Appsについて調べると、チュートリアルとして自動作成されるTODOリストアプリケーションの作り方はよく見つかるのですが、すでに存在するAzureサービスとiOSアプリをつなぎ合わせる方法は見つかりませんでした。

登場人物たち

  • サーバサイド(Microsoft Azure)
    • Azure Mobile Apps
    • Azure SQL Database
  • クライアントサイド(iOSアプリ)
  • 開発マシン
    • azure-cli(on node.js)

Microsoft Azureが提供するmBaaS

AzureのmBaaSには2種類あります

  • Azure Mobile Service
  • Azure App Service の Mobile Apps

まず名前が非常に似ていてややこしいです。 そして、できる事もよく似ています。

一応、公式に違いが書いてあります。

azure.microsoft.com

決定的な違いは、 Mobile Appsの方がだいぶ新しい ということです。 作れる画面も場所も違いますので、気をつけていれば混同することはありません。たぶん。

mBaaS 時期 作成場所
Mobile Service ふるい クラシックポータル
Mobile Apps あたらしい(現状パブリックプレビュー版) 新ポータル

今回はMobile Appsの方を使っていきます。

同じようにパブリックプレビュー版のまま使っているAPI Appsは現状バリバリ動いていますので、たぶんMobile Appsも特に問題なく使えるでしょう。たぶん。

新しい方が楽しそうですし。

Azure Mobile Appsの作成

まず新しいポータルにアクセスし、Mobile Appsを作成します。

f:id:s2terminal:20160117234916p:plain

Easy Tableの設定

下記プレスリリースを頼りに進めます。

Azure Mobile Apps の2015 年 11 月更新版を発表 - Cloud and Server Product Japan Blog - Site Home - TechNet Blogs

とりあえず「クイックスタートに移動して詳細を確認してください」とありますので、確認してみます。

f:id:s2terminal:20160117235309p:plain

データベース接続文字列を設定するのですが、ここでハマります。

まず 定義済みの接続情報をどうやっても選択できません 。「接続情報が選択されていません」みたいな事を言われて戻されてしまいます。

なので、まったく同じ接続文字列を毎回新しく作りなおすことになります。そういうものなのかもしれませんが。

すると今度は 「Missing SQL Server connection string」 みたいなエラーが出てきて、デプロイが完了できずに終了しまいます。 いや、「選択しろ」と言われたからちゃんと選択して進めているのですが…

あれこれ設定を変えながら10回ほど試してもダメで、なんとなくPCを変えてもう一度やってみたらうまくいきました。 環境の問題か、なにか裏側でトラブルが起きていたか、よく分かりませんが、できました。

cliを使ってみれば良かったかもしれません。

さて、デフォルトでは「TodoItems」というテーブルを作成するようですが、すでに「tweets」というテーブルがありますので、それに対してEasy Tablesを作成してみました。

f:id:s2terminal:20160117235344p:plain

なんだか盛大に崩れているのですが、一応データらしき何かが表示されていることがわかります。バイナリを無理矢理開いたみたいになっていますが、データベースにあるツイート情報の中身です。表示されている数字は左から「id」「エンゲージメント数」「リツイート数」「お気に入り数」であり、それらしい数字になっていることが分かります。

f:id:s2terminal:20160117235406p:plain

スキーマ情報は完璧に取得できていました。

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文へ書き換えます。

azure.microsoft.com

    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"]);
            }
        }
    }];

コレでデータが取れます。

取れるはずなのですが、ログになにも吐かれません。

f:id:s2terminal:20160117235456p:plain

なにか間違っていると思うのですが、私はMobile AppsにもiOS Objective-Cにも疎いためよく分かりません。 唯一分かるのはデータベースです。

SQL Databaseのクエリログを確認する

このままでは何も手が打てませんので、クエリログを確認しに行きます。 SQL DatabaseのクエリログはAzure Storageに出力できるそうです。

azure.microsoft.com

上記を参考に、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

Macで開発していたので、Macでのやり方を探してみます。

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 VMRuby on Railsを乗せているので、現状はそちらにAPI開発したほうが早いと思いました。 プッシュ通知でも打つ時になったら帰ってきます。

EOD