Azure Functions をバックエンドとした LINE Bot を作成する

アプリケーションのインタフェースとして LINE はよく使用されていますが、LINE SDK を使ってさまざまなアプリケーションが作成できるので非常に便利です。今回は　LINE の Messaging API 機能を使用して　Azure Functions と連携する方法をご紹介します。

# 作成するもの
今回は超シンプルなエコーボットを作成してみます。イメージとしてはこんな感じです。LINE で入力したテキストをバックエンドの Functions がそのまま返答します。
![スクリーンショット 2022-06-22 9.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/46b6cd63-9034-9241-b1f6-3be008ab71c2.png)

# 準備するもの
今回作成にあたり準備が必要なものは以下の通りです。デプロイしながら足りないものを継ぎ足していく感じで問題ないでしょう。
- Azure サブスクリプション
- LINE アカウント (Developer 登録が可能なもの / 普段お使いのもの)
- Visual Studio Code
- Visual Studio Code の Azure Functions 拡張機能
- npm (Node.Js)
- Azure CLI

# LINE の設定
Line Developer コンソールにサインインして、プロバイダを作成します。サインインするアカウントは普段お使いの LINE アカウントです。Developer コンソールにサインインするとプロバイダ作成ボタンが出てくるので、プロバイダ名を入力して作成します。プロバイダ名は一意である必要があるみたいで、かつ特定の文字列を入れてはいけないといった命名規則があるのでなんどか入れてみてクリアできる名前で作成するのが良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/af232ae4-e83a-9349-2253-0fb96cfbbd49.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/f20a1a3a-f94c-af32-fc8b-b2d2bd04f9d0.png)
プロバイダが作成できたら、Messaging API を作成します。Messaging API 作成ボタンを選択すると、いくつか入力する項目が出てくるので適当な値を入力して作成します。ここで入力する `チャネル名`　はあとから LINE で追加する友達名になりますのでわかりやすいものを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/352bdf32-43c8-174a-12b1-b247b93e99d9.png)
すべて項目を入力し Messaging API が無事作成されると、チャネルシークレットとチャネルアクセストークンを取得できます。設定画面の該当項目から二つの値をコピーしておきます。これはのちほど Azure Funcitons　の中に記載していきますので、メモ帳などに保存しておくと良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/b8f80c22-5ebf-a8f7-194e-fb699b2aebd5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/45049d5b-e3f3-f162-ecbe-997f5f32c38d.png)
これで　LINE Developer 側の設定は完了です！

# Visual Studio Code で Functions を作成
次に Visual Studio Code で Azure Functions を作成していきます。今回は mac 環境で Azure Functions　を作成していきますが、基本的な作り方は同じです。また Node.JS 並びに Azure Functions の拡張機能などが準備されている前提で書いていますので、もしインストールできていない環境の場合はここでインストールしてください。

[Node.JS のインストール](https://nodejs.org/ja/)
[Visual Studio Code Functions 拡張機能のインストール](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-develop-vs-code?tabs=csharp)

結果的に LINE SDK　がインストールされた Azure Functions　が Azure Portal で確認できれば良いので作成方法はどんな感じでも大丈夫です。今回は丁寧に書いていきます。

## ディレクトリ作成と VS Code からディレクトリを開く
適当なディレクトリに適当な名前のフォルダを作成します。今回は LineBot といったフォルダを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/c26bfebb-d3c2-1f21-bb79-f6563b0e9946.png)
VS Code からそのフォルダを開きます。カラッポのフォルダが開けたのでここに諸々追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/e5a0c718-2289-8200-eed5-e98c39d259d1.png)

## VS Code で Azure Functions を作成する
左側にある `Azure` マークをクリックして、ワークスペースを選択します。そのワークスペースのタブの上にある `+` ボタンを押すと、 `Create Functions` というボタンが見えますので、そちらをクリックして Azure Functions　を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/cee2fe94-72e8-bced-10c7-c33ad0875623.png)
作成する際、空っぽのフォルダなので新しいプロジェクトを作成しますか？と聞かれます。ここはそのまま `Yes` を選択してプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/d345af5b-cbde-ed42-e7aa-94b25e7cdc41.png)
プロジェクトを作成すると、作成する　 Functions の中身を決めていくようなフローになります。ラインタイム、トリガー、Functions の名前、承認レベルを選択していきます。今回はこんな感じで作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/b8f0b2d7-316d-7a4c-08b1-2c829f38b816.png)
Fucntions 作成が完了すると、先おど空っぽだったフォルダの中に Azure Functions　の必要な要素ができているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/e9725a8e-2d4f-07c8-84d9-d4c58e2ac244.png)
この中身を変更して LINE と連携できる Functions を作成していきます。

## Azure 環境に Functions をデプロイ
まだ Azure 上の Functions　を作成できていないので空っぽの Azure Funcitons　を作成します。Azure のマークから `+` ボタンを選択し、`Create Functions App in Azure` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/4003a504-9a85-64f1-eee5-020960d5555e.png)
作成する Azure Functions の名前(komiyasafunc1)、ラインタイム情報(NodeJS14)を入力し、Azure上に Functions を作成します。無事に作成されると中身の入っていない Azure Functions　が Azure 上に構築されます。ちなみにこれは従量課金制なので実行しない限り課金が発生しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/a3e8d334-abb5-b5b6-f3b3-3cb8ca04f318.png)

## Fucntions　の中身を変更して Azure 上にデプロイ
VS Code でコードを変更していきます。変更する箇所はひとつだけです。 `index.js`　の中身を以下のように変更します。

```index.js
const line = require('@line/bot-sdk');

const config = {
    channelAccessToken: '<アクセストークン>',
    channelSecret:  '<シークレット>',
};

const client = new line.Client(config);

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.message || (req.body && req.body.events)) {
        if (req.body && req.body.events[0]) {
            message = {
                type: "text",
                text: req.body.events[0].message.text
            }
            console.log(message);
            if (req.body.events[0].replyToken) {
                client.replyMessage(req.body.events[0].replyToken, message);
            }
        }
        else {
            context.res = {
                status: 200,
                body: "You said" + req.query.message
            };
        }
    }
    else {
        context.res = {
            status: 200,
            body: "Please check the query string in the request body"
        };
    };
};
```

この `<アクセストークン>` と `<シークレット>` には先程 LINE からコピーした値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/0747cf90-51d8-11ab-2fa6-f5552f6282b7.png)
GitHub にもこちらのコードを公開しています。
https://github.com/komiyasa/linebot/blob/master/HttpTrigger1/index.js

コピペできたら、次は LINE SDK をインストールします。 VS Code のコンソールで以下のコマンドを実行します。

```
npm install @line/bot-sdk
```
VS Code のターミナルはこんな感じです↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/6c0423f1-2122-9e0f-0c08-43dca0a73d45.png)
これを忘れてしまうと、コードがうまく実行できないので忘れずに `npm install` しておきましょう。
これで VS Code での編集は完了です。次に作成したものを先程作った Azure Functions に向けてデプロイをしかけていきます。フォルダを右クリックすると `deploy to Function App`　が選択できるので、ここで先程 Azure に作成したものを選びデプロイします！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/fc05dd4f-7414-bf48-ef6d-65b327590ca6.png)
無事デプロイが完了すると Azure Portal から作成した関数が見えるようになります。今回はあえて GitHub Actions を使わずに直接 VS Code からデプロイしてみましたが、簡単にできることがお分かりいただけたかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/97cc1396-2e81-4b58-13f9-df872532382f.png)
Azure Functions ではテストを実行できます。message をクエリにセットして、適当なメッセージを投げるとそれがそのまま帰ってくるのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/585efb40-7370-b4cb-8f77-c14ccf4335ad.png)
これで　Azure Functions 側の設定は完了です！

# LINE と Azure Functions をつなぎ合わせる
Azure Functions の HTTP リクエストの URL を LINE Webhook として登録します。そうすることで LINE をインタフェースとして Azure Functions の HTTP トリガーを呼び出すことができます。
## Azure Funcitions の URL を取得する
Azure Portal から簡単に取得できます。`関数のURLを取得する` から取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/99b3fcd3-6d6f-546f-03d8-bee2b0d2c5d9.png)

## LINE Dev コンソールで　Webhook 登録
最初に作成した　　LINE Developer コンサールの Messeing API 設定を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/9e973ba8-be46-15b4-0f6a-3f43249262de.png)
このページにある Webhook URL を開き、先程コピーした Azure Functions の URL を入力します。このページから確認できる QR コードを LINE の友達登録から読み込むと友達登録ができます。これで完成です！
LINE から何か投げかけるとそれをそのまま返してくれるボットが完成しました。単純なボットですが、Azure Functions でカスタマイズした処理をすることで色々応用が効きそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/ea223792-1fa2-0ddc-75aa-ca7a3690e43c.png)

# さらに活用する！
以下のURLは 温泉 MaaS という取り組みですが、ソースコードも公開されていて、LINEのタクシー配車アプリを簡単に作成することができます。非常に素晴らしいソースですので、是非試してみてください！！さすが Zen さんという感じです！
https://github.com/zengeeks/onsen-maas-taxi-allocation
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/1fa94d08-ea28-47d7-e0f6-6549cf3aa668.png)