AWS Mobile Hubで超かんたんモバイルアプリ開発 (Android / iOS)

# 注意

2018/12/05 追記

**今からMobile Appを構築されるという方は、Mobile Hubではなく [AWS Amplify](https://aws-amplify.github.io/) の利用推奨です！！**


# はじめに
ラスベガスで開催中のAWSのイベント「AWS re:Invent 2015」にて、Mobile Hubというサービスが発表されました。

参考記事
- [AWS Mobile Hub – Build, Test, and Monitor Mobile Applications](https://aws.amazon.com/jp/blogs/aws/aws-mobile-hub-build-test-and-monitor-mobile-applications/)
- [わずか3ステップでモバイルアプリケーションを生成する「AWS Mobile Hub」発表。AWS re:Invent 2015](http://www.publickey1.jp/blog/15/aws_mobile_hub.html)

## 特徴
- 環境構築、テスト、を簡素化する
- 1つまたは複数のAWSサービスを利用するモバイルアプリケーションを監視するプロセスを簡素化する
- ユーザ認証、ストレージ、Backend Logic、Push通知、コンテンツ配信、分析、をすべて単一の統合コンソールから設定可能

めちゃくちゃ便利ですね。

それではさっそく使ってみましょう。

```
※ 2015/10/09現在、βサービスです。機能には制限があります。
※ 試しにAndroidアプリを作ってみます。iOSアプリは気が向いたら。
```

# アプリケーションの作成

Developer Consoleから、**Mobile Hub**を選択します。

現時点(2015/10/09現在)では、US/EU/AsiaPacificの各リージョンで利用可能です。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/39743/75f83917-9d17-0761-5490-1fe3901695fe.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/39743/5936c59a-91ba-a69f-d88a-39f12577f329.png)


### 1. アプリケーション名を決める
Project Name欄にアプリケーションの名前を入力します。

ここでは「TestApplication」としました。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/39743/543e505b-d552-74af-4888-175c422df7d1.png)


名前を入力したら Create Project します。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/39743/f2589ef1-7813-ee76-3bf7-e484f93abd4d.png)


少し待つと、Mobile Hubのダッシュボードが開きます。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/39743/43fad44c-f2a2-7b79-f9b2-9b2328f4c946.png)


### 2. ユーザー認証機能の実装

とりあえず**Mobile Hubの全機能**を試してみます。まずはユーザー認証機能を実装しましょう。

**User Sign-in** を選択します。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/39743/74fd9d58-84d6-8703-61f7-6073ed39fbf3.png)


続いて、ユーザー認証に利用する外部サービスの設定を行います。残念ながら2015/10/09現在ではFacebook認証のみサポートされているようです。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/39743/85632de7-249f-fd07-e35f-7590183510c0.png)


1. 今回はユーザー認証を**必須**にしてみます。
2. 認証に利用するサービスを選択します。今回はFacebookを利用します。
3. FacebookアプリのIDを登録します。アプリケーションは[こちら](https://developers.facebook.com/)から作成可能ですが、Facebookのアプリ登録作業は割愛します。

**Save Changes** で登録作業はおしまいです。実に簡単ですね...。

Sign-in機能は、内部的にはAWSのCognitoを使っているようですね。

### 3. Push Notification機能の実装

次はPush Notificationを設定してみます。まずはPushを有効にします。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/39743/06ce8623-baad-6b0d-d3bb-a196ceebb4f9.png)

![9.png](https://qiita-image-store.s3.amazonaws.com/0/39743/5a52e601-6ca2-5499-f5a5-9fe118fa38b1.png)

続いて、Push Notificationを利用するための情報を登録します。

今回はAndroidなのでGoogle Cloud Messaging (GCM) を利用します。今回もGoogleアプリの作成手順は割愛しますが、[こちら](http://mb.cloud.nifty.com/doc/current/tutorial/push_setup_android.html)のページなどが参考になるかと。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/39743/6965ef5d-49c9-d8f7-4447-ae2b536041c4.png)


これでPush Notificationの設定もおしまい。

Push Notificationは、内部的にはもちろんAWS SNSサービスが利用されています。手続きはほとんど同じですね。

### 4. 静的コンテンツ配信

続いて、アプリで利用する静的コンテンツの配信設定を行います。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/39743/d7fc919c-1865-6795-3c3b-1c1714464e02.png)


こちらはS3 + CloudFrontの利用設定ですね。CDNのファイルキャッシュをsingle locationにするかglobalにするかを設定可能です。

![12.png](https://qiita-image-store.s3.amazonaws.com/0/39743/a8a09c30-3dbf-c0d3-9bf1-9acd06a32de9.png)


アプリに配信するファイルはS3に配置します。Mobile Hubで設定が完了したら、S3を見てみましょう。下記のようにMobile Hub用のS3バケットが生成されています。

![13.png](https://qiita-image-store.s3.amazonaws.com/0/39743/4320353b-3f04-0d46-5e08-bab5d5d931d2.png)


アプリに配信したいファイルはこのS3バケットに追加すればOKです。


### 5. ユーザーデータを保存する設定

ユーザーデータを保存する設定を行います。

![14.png](https://qiita-image-store.s3.amazonaws.com/0/39743/dd08bffe-bde2-efe9-ef4a-6f7c3d0538be.png)


これは下記のように設定するだけですね。

![15.png](https://qiita-image-store.s3.amazonaws.com/0/39743/20accbf6-2992-a9e0-2b16-6650530c12d6.png)


これで、ユーザーデータを保存するためのS3バケットが作成されます(下図)。ユーザー認証を利用している場合は、Amazon Cognito Syncも有効になるようです。

![16.png](https://qiita-image-store.s3.amazonaws.com/0/39743/5481f678-89fa-1618-4e9a-32a4c4491632.png)


注意したいのは、Defaultだとアプリを利用する全ユーザーが参照可能なバケットが作成されます。ユーザーごとの情報をStoreしたい場合は、Cognitoを利用するのが良いでしょう。


### 6. Analyticsの設定

次はApp Analyticsの設定を行います。

![17.png](https://qiita-image-store.s3.amazonaws.com/0/39743/5e6d4909-2f16-99fd-b1b3-54fde22bbc17.png)


これはadd analyticsするだけでOKです。

![18.png](https://qiita-image-store.s3.amazonaws.com/0/39743/3d501cc6-2722-8c29-975b-ad145389cb96.png)


これでAmazon Mobile Analyticsサービスが有効になりました。

各種Business Intelligence情報が参照できるようになります。


### 7. Cloud Logicの設定

さて、最後にCloud Logicの設定を行います。これもかなりパワフルな機能でした。

![19.png](https://qiita-image-store.s3.amazonaws.com/0/39743/99cbbd73-9aa2-c6e4-fbf7-3427adf59df6.png)


何ができるかというと、モバイルアプリケーションから呼び出すAWS Lambda Functionが設定できます‥！

![20.png](https://qiita-image-store.s3.amazonaws.com/0/39743/e785aaa9-0250-fd5c-007d-2c90a562d608.png)


今回はモバイルアプリからのRequest Valueを返すだけのシンプルなAWS Lambda Functionを別途作成し、設定してみます。

これで全ての機能を一通り設定できました。設定が完了した項目は紫色になってチェックマークが付くようですね。

![21.png](https://qiita-image-store.s3.amazonaws.com/0/39743/53c79532-2197-eb94-091b-48a87eb65d88.png)


### 8. サンプルアプリをダウンロード＆ビルド

さて、いよいよAndroidアプリをビルドします。左側のビルドボタンを選択しましょう。

![22.png](https://qiita-image-store.s3.amazonaws.com/0/39743/edc9fe8c-5c2b-c7db-8d91-bc709a471613.png)


Androidを選択すると、サンプルアプリのAndroid Studio Project一式が生成されるので、これをダウンロードします。

![23.png](https://qiita-image-store.s3.amazonaws.com/0/39743/25ba08f6-3e7f-f11e-b32d-6f117d9d5f54.png)


ダウンロードしたProjectをAndroid Studioにインポートし、アプリケーションをビルドします。

Android StudioやSDK、Gradleの設定がうまくできていれば、AWS SDKやFacebook SDKなどの依存ライブラリがダウンロードされてビルドできます。

![24.png](https://qiita-image-store.s3.amazonaws.com/0/39743/81646616-db8b-7571-7738-8540cff6d791.png)

![25.png](https://qiita-image-store.s3.amazonaws.com/0/39743/edaa8dc6-729b-c4af-18ff-781a72ed9662.png)

はい、これでアプリの作成は完了です。お手軽ですね。


# 作成したアプリをAndroidにインストールしてみる

さっそくビルドしたアプリをインストールして起動してみましょう。

![26.png](https://qiita-image-store.s3.amazonaws.com/0/39743/bb800fb6-fea5-3cb0-c617-cb054809acfd.png)


いきなりFacebookのログインボタンが表示されるので、ログインします。

![27.png](https://qiita-image-store.s3.amazonaws.com/0/39743/5936421d-1001-e2ca-a321-7a7cf9068f42.png)

![28.png](https://qiita-image-store.s3.amazonaws.com/0/39743/179a2f89-dfe5-a9bd-7682-cab8c2db2ceb.png)

ログインに成功すると、アプリのTop Menuが表示されます。色々と遊んでみます。

![29.png](https://qiita-image-store.s3.amazonaws.com/0/39743/3f26285e-e8f3-ce7f-131e-a33c9d839e4b.png)

### GCMの登録

GCMは、Registration IDをGCMサービスに登録する必要がありますが、この辺りの処理は全て自動生成されています。

ソースを覗いてみます。

```java
new AsyncTask<Void, Void, String>() {
    @Override
    protected String doInBackground(final Void... params) {
        // register device first
        if (!pushManager.isRegistered()) {
            try {
                pushManager.registerDevice();
            } catch (final Exception e) {
                Log.e(LOG_TAG, "Failed to register for push notifications", e);
                return e.getMessage();
            }
        }
```

こんな具合に、AWS Android SDKのPushManagerを利用して、GCMにRegistration IDの登録等を行っています。

問題なくGCMのListenに成功しました。

![30.png](https://qiita-image-store.s3.amazonaws.com/0/39743/8164c070-2276-310e-daa7-fd673d06b939.png)


### 静的ファイル配信

アプリ向けにCDNを使って配信したファイルを確認します。

![31.png](https://qiita-image-store.s3.amazonaws.com/0/39743/439a4877-23af-40f1-a1ea-5fbc58550312.png)

これもS3のバケットに配置されているファイルが正しく取得されていますね。

こちらもソースを少し覗いてみます。

```java
if (itemTitle.equals(getString(R.string.content_context_menu_open))) {
    ContentUtils.openContent(getActivity(), contentItem);
} else if (itemTitle.equals(getString(R.string.content_context_menu_download))) {
    // Download the content.
    contentManager.getContent(contentItem.getFilePath(), contentItem.getSize(),
        ContentDownloadPolicy.DOWNLOAD_ALWAYS, false, contentListItems);
} else if (itemTitle.equals(getString(R.string.content_context_menu_download_latest))) {
    // Download the content.
    contentManager.getContent(contentItem.getFilePath(), contentItem.getSize(),
        ContentDownloadPolicy.DOWNLOAD_IF_NEWER_EXIST, false, contentListItems);

...以下略
```

こんな具合に、SDKのContentManagerを利用して、簡単にコンテンツ操作ができそうです。

### Lambda Function呼び出し

最後に、Cloud Logicで設定したLambda Functionを呼び出してみます。

![32.png](https://qiita-image-store.s3.amazonaws.com/0/39743/ed50587a-b9fe-8176-b0a8-4fff56317d6e.png)

はい、ちゃんとLambda Functionが実行できました。

ソースコードは当然SDK利用で簡単に書かれています。SDKのLambda関数呼び出しAPIをAayncTaskで呼び出しています。これもそのまま流用可能です。

```java
new AsyncTask<Void, Void, InvokeResult>() {
    @Override
    protected InvokeResult doInBackground(Void... params) {
        try {
            final ByteBuffer payload =
                    ENCODER.encode(CharBuffer.wrap(requestPayload));

            final InvokeRequest invokeRequest =
                    new InvokeRequest()
                            .withFunctionName(functionName)
                            .withInvocationType(InvocationType.RequestResponse)
                            .withPayload(payload);

            final InvokeResult invokeResult =
                    AWSMobileClient
                            .defaultMobileClient()
                            .getCloudFunctionClient()
                            .invoke(invokeRequest);
```

以上で **使ってみた** のセクションはおしまい。


# AWS Mobile Hubが生み出す価値

わかったことは、モバイルアプリのクラウド側の機能開発に、ほとんど工数は必要なくなってきた、ということです。

- Lambda Functionを直接呼び出すことでWeb API不要
- データストアもS3 / Cognitoで使える
- ユーザー認証機能も作らなくていい
- ファイル配信サーバーも不要

もはやWebサーバーは必要ありませんね。完全にインフラレスです。
開発が必要なのは、ビジネスロジックをAWS Lambdaで実装することと、ユーザーインターフェース部分。

サーバーエンジニアは、AWSに仕事を全部持っていかれないようにスキルの幅を広げていきたいですね。

完全にサーバー管理はAWSに任せ、ビジネスロジックだけに集中すれば良い時代がやってきました。