AWS MobileHub Swift 版 のチュートリアル -Cloud Logic(Lambda)編-


**Cloud Logic**を使ってみましょう。

サンプルアプリの使い方は、`Function`にLambda関数、`Request`にリクエストデータを指定し、`Invoke`をクリックします。Lambda関数からの戻り値が、`Result`に表示されます。

![Screen Shot 2016-06-06 at 8.42.45 AM.png](https://qiita-image-store.s3.amazonaws.com/0/75231/609c25c4-e766-eddf-baf4-14009ff0c301.png)
`StoryBoard`はこんな感じ。
![CloudLogic_storyboard_—_Edited.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/7a232d8d-ff04-a335-8749-ac250abd961f.jpeg)

コードです。
![CloudLogicViewController_swift.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/21e2279d-27db-75d9-adea-56a7e9f8171a.jpeg)

Lambda関数の呼び出しには、ヘルパークラス`AWSCloudLogic`の`invokeFunction`を使用します。ブロックでコールバックを処理します。

```swift:CloudLogicViewController.swift
    public func invokeFunction(name: String, withParameters parameters: AnyObject?, completionBlock: (AnyObject, NSError) -> Void)
```

何度か`Invoke`をタップして実行しましょう。
AWSコンソールのLambdaサービスからアクセスログを見てみます。

![Screen Shot 2016-06-06 at 8.19.38 AM.png](https://qiita-image-store.s3.amazonaws.com/0/75231/d3ef5f42-345a-8931-0412-7f846d2d30f6.png)


きめ細かいアクセスコントロールを実装したい場合は、AWS API Gatewayを使用する必要があります。
残念ながら、まだMobile Hubではサポートしてませんが。。。

## 余興 - LambdaでSwiftを動かしてみる

サーバサイドのLambdaもSwiftで書きたくなりますよね？ [詳細はここ]
(https://medium.com/@gigq/using-swift-in-aws-lambda-6e2a67a27e03#.xq9iazgkv)

Swiftはこちらからダウンロードできるようです。Ubuntu版しかありませんね。 :disappointed_relieved: 
https://swift.org/download/#releases

AMIはこちらを使用しました。

Ubuntu Server 14.04 LTS (HVM), SSD Volume Type - ami-9abea4fb

## 設定方法

`swift`と`lambda`用のディレクトリを作成します。

```bash
sudo mkdir /usr/local/swift
sudo chown ubuntu /usr/local/swift
mkdir ~/lambda
```

Swiftコンパイラー、ライブラリをインストールします。

```bash
# Install dependencies
sudo apt-get update
sudo apt-get install clang libicu-dev libbsd-dev
cd /usr/local/swift/
wget https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
tar xfz swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz --strip 1
export PATH="/usr/local/swift/usr/bin/:$PATH"
```

Swiftで、Hello Worldプログラムを書きます。

```bash
cd ~/lambda
echo print\("Hello World"\) > hello.swift
swiftc hello.swift
./hello
Hello World!
```

Lambdaサービスが動いている`AmazonLinux`にはダイナミックライブラリがないため一緒にアーカイブします。
(スタティックリンクではダメみたいです。)

ダイナミックライブラリ用のディレクトリを作成します。

```bash
mkdir lib
```

コピーします。

```bash
cp /usr/local/swift/usr/lib/swift/linux/*.so lib/
cp /usr/lib/x86_64-linux-gnu/libicudata.so.52 lib/
cp /usr/lib/x86_64-linux-gnu/libicui18n.so.52 lib/
cp /usr/lib/x86_64-linux-gnu/libicuuc.so.52 lib/
cp /usr/lib/x86_64-linux-gnu/libbsd.so lib/libbsd.so.0
```

```bash
vi ~/lambda/index.js
```

Swiftを呼び出すLambda(Node.js)を書きます。

```js:index.js
var exec = require('child_process').exec;
exports.handler = function(event, context) {
  child = exec("./hello", function(error) {
    // Resolve with result of process
    context.done(error, 'Process complete!');
  });
  // Log process stdout and stderr
  child.stdout.on('data', console.log);
  child.stderr.on('data', console.error);
};
```

固めます。

```bash
sudo apt-get install zip
zip swift.zip hello index.js
```

こんなファイル構成になってます。

![Screen Shot 2016-06-06 at 9.35.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/75231/422ba370-3f09-7908-40f4-6b9c157c021c.png)


AWSコンソールのLambdaサービスから、作成した`swift.zip`ファイルをアップロードします。
`Role`に、Mobile Hubで作成したRoleを指定します。

![Lambda_Management_Console_🔊.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/8b9de9b6-b8c4-ffad-e9ec-f489317660e8.jpeg)

Mobile HubのCloud Logicから、作成したLambdaファンクションにチェックを入れます。

![AWS_Mobile_Hub_🔊.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/6cfef0ba-6ad5-46ea-ab6e-e674c6da2a70.jpeg)

コンソールから、テストします。

![Lambda_Management_Console_🔊.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/378c95d2-365e-6987-97c9-98efb65e2abf.jpeg)

Mobile Hubアプリから、作成したSwift Lambdaを呼んでみます。
(クレデンシャルをキャッシュしているので、一旦アプリを再起動してください。)

![Screen Shot 2016-06-06 at 10.04.48 PM.png](https://qiita-image-store.s3.amazonaws.com/0/75231/7818458a-1987-69cd-73db-f9550afb799e.png)

うまくいきました！ :smiley: