Serverless Frameworkを試してみる(Line Message API + API Gateway + Lambda + Google Cloud Vision API編)

# はじめに
[前回](http://qiita.com/tsuyopooon/items/690e258435a5bdcb06c6)、Lambda + API GatewayでAPIをサクッと作れることが分かったので、
このままLine Message APIから、API Gatewayを呼び出してみよう！
ついでに、Google Cloud Visionで画像解析の結果を取得して返してみよう！
ってことで、いろいろまとめてみました。

Line Message APIにはSDK、
Google Cloud Vision APIにはClient
が用意されており、意外と簡単に作れちゃいます。

botのソースコードについては[github](https://github.com/tsuyopooon/detectImage-linebot-service)上を参照してください。

# 試してみる

## LINEアカウントの準備
まず[LINE Business Center](https://business.line.me/ja/companies/1207396/services/bot)のDeveloper Trialよりアカウントを作成。

アカウントが作成できると、アカウントリストに「LINE@ Developer」が作成されるので、「LINE@ MANAGER」へアクセス。

「アカウント設定」→「Bot設定」より「APIを利用する」を押下。

下記、Bot設定を行い、保存。
- Webhook送信：利用する
- 自動応答メッセージ：利用しない

こんな感じですね。

![スクリーンショット 2016-11-08 8.11.57.png](https://qiita-image-store.s3.amazonaws.com/0/71316/7e898bcc-4073-dfa8-4a4f-9c618e0638d4.png "スクリーンショット 2016-11-08 8.11.57.png")

## Google Cloud Vision APIの準備

何はともあれGoogleのアカウントが必要です。
Googleアカウントを作成後、[Google Cloud Platform](https://console.cloud.google.com/home/dashboard)にログインします。

なお、Google Cloud Visionは無料枠があるものの、課金を有効にしないと利用できないので、クレジットカードを登録する必要があります。
なので、その辺りの設定を行ってください。

設定が終わったら、新しいプロジェクトを作成します。
![スクリーンショット 2016-12-27 8.24.23.png](https://qiita-image-store.s3.amazonaws.com/0/71316/9db2563f-b97c-ab84-221d-29d405350b36.png "スクリーンショット 2016-12-27 8.24.23.png")

プロジェクト名は適当な感じで作成。
![スクリーンショット 2016-12-27 8.24.55.png](https://qiita-image-store.s3.amazonaws.com/0/71316/2b5eb768-9878-e589-3634-106965f4989d.png "スクリーンショット 2016-12-2 8.24.55.png")
google APIを利用する枠を押下。
![スクリーンショット 2016-12-27 8.25.23.png](https://qiita-image-store.s3.amazonaws.com/0/71316/41dd12b5-2c35-8d51-1920-b3e2da5f1ade.png "スクリーンショット 2016-12-27 8.25.23.png")

「APIを有効にする」を押下します。
![スクリーンショット 2016-12-27 8.25.42.png](https://qiita-image-store.s3.amazonaws.com/0/71316/9ce60f3d-47ab-2bd0-a6eb-7ce2a2524e04.png "スクリーンショット 2016-12-27 8.25.42.png")

すると、APIを検索する画面に遷移しますので、「Cloud Vision」と入力し、「Google Cloud Vision API」のリンクを押下。
![スクリーンショット 2016-12-27 8.26.08.png](https://qiita-image-store.s3.amazonaws.com/0/71316/c6c7db34-3ce1-2b43-c44b-b04bf0a107bb.png "スクリーンショット 2016-12-27 8.26.08.png")

「有効にする」を押下します。
![スクリーンショット 2016-12-27 8.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/71316/93ff5593-3500-4027-f30c-5c0be7b1e66a.png "スクリーンショット 2016-12-27 8.26.23.png")

楽だけど、長い。。。

次に認証情報を作成します。
左メニューの「認証情報」を押下し、「認証情報を作成」ボタンを押下します。
![スクリーンショット 2016-12-27 8.36.19.png](https://qiita-image-store.s3.amazonaws.com/0/71316/9b06f781-eb64-ded0-f4da-ce0c1d985e04.png "スクリーンショット 2016-12-27 8.36.19.png")

すると、何種類か出てくるのですが、今回は「Google Cloud API向け」と書かれてる「サービス アカウント キー」を選択します。
取り急ぎサービスアカウントキーは初めからある「Compute Engine default service account」を選択し、キーのタイプはJSONで作成します。
![スクリーンショット 2016-12-27 8.43.35.png](https://qiita-image-store.s3.amazonaws.com/0/71316/ed516dfc-4ab1-225f-c975-755f36c91960.png "スクリーンショット 2016-12-27 8.43.35.png")

すると、作成されたキーファイルがダウンロードされます。
こちらは、後ほどGoogleのSDKから利用しますので、とっておいてください。


## Line Message API用のWebhook URLのendpointの作成

### 環境
- Serverless:1.4.0
- Python:2.7.11
- pip:9.0.1

### 手順
今回、新たにプロジェクトを作成します。今回もpythonで作成します。

```bash
$ serverless create --template aws-python --path detectImage-linebot-service
$ cd detectImage-linebot-service
```

line-bot用のSDKとGoogleAPIのクライアントをvendor配下にインストール。

```bash:requirements.txt
line-bot-sdk>=1.0.2
google-api-python-client>=1.5.0
```

```bash
$ pip install -r requirements.txt -t vendor
```

endpointをcallbackという名前で用意.

```bash:serverless.yml
provider:
  name: aws
  runtime: python2.7
  region: ap-northeast-1
custom:
  stage: "${opt:stage, self:provider.stage}"

functions:
  callback:
    handler: handler.callback
    events:
      - http:
          path: callback
          method: post
    environment: ${file(env-${self:custom.stage}.yml)}

plugins:
  - serverless-offline
```

env-**.ymlには各自のキーを環境変数として登録します。[^1]

```bash:env-dev.yml
LINE_CHANNEL_SECRET: "XXX"
LINE_CHANNEL_ACCESS_TOKEN: "XXX"
GOOGLE_APPLICATION_CREDENTIALS: "ダウンロードしたサービスアカウントキーのファイルパス"
```


あとは、Line Message APIからのリクエストを受け、
Google Cloud Vision APIにリクエストして、
そのレスポンスを解析して、
Line Message API経由で返す
ようにプログラミングして、デプロイ。

デプロイ結果のendpoints「https://XXXXXXXXXX.execute-api.XXX.amazonaws.com/dev/callback」を
LINE Developersの「Webhook URL」に設定してあげればOK。

あっという間に、Lineから画像認識してくれるbotの出来上がりです。

# 所感
LINE BOT API Trialの頃よりも、ドキュメントやSDKが整備されていて、かなりLine botの作成は簡単になっていると感じました。
また、Google Cloud Vision APIもサービスアカウントキーのパスさえ環境変数に設定しておけば、Client側で勝手によしなにやってくれ、手間いらず。

以前よりも簡単にMyBotが作れ、各サービスとの連携もし易くなっていますので、皆さんも是非お試しください。

****
[^1]: [Using Environment Variables with the Serverless Framework](http://www.goingserverless.com/blog/using-environment-variables-with-the-serverless-framework)