enebularで作ったLINE BotやLIFFアプリをクラウド実行環境でずっと動かす

LINE公式アカウントでカスタマイズされたやり取りを行うLINE Botを作成するには、HTTPSで通信可能なWebhook受信用URLが必要です。また、LINEミニアプリやLIFFアプリを作成する場合は、WebページやWebアプリをホスティングし、そのURLをLINEプラットフォームからアクセス可能な形で提供する必要があります。

[enebular](https://www.enebular.com/ja/)のフローエディタは、Node-REDをローカルにインストールした場合と異なり、インターネットでアクセス可能なURLが利用できます。そのため、インフラ環境を構築せずにLINE BotやLINEミニアプリ、LIFFアプリをローコードで実装して手軽に試すことができます。

しかし、フローエディタは連続して4時間しか利用できません。

そこで！enebularのクラウド実行環境を利用する方法を紹介します。

:::note info
本記事では、enebularやLINEビジネスアカウントを取得済みであることが前提として書いてます。初めての方は、以下の記事を参考にしてください。

enebular
https://docs.enebular.com/ja/getstarted/introduction

LINEビジネスアカウント
https://www.lycbiz.com/jp/manual/OfficialAccountManager/new_account/?list=7171
:::

## クラウド実行環境
enebularでは、フローエディタやアセット管理などの開発機能だけではなく、クラウド実行環境というインフラ環境も用意されています。
無料の範囲でも月に24時間の動作時間が利用できるので、個人的に利用する範囲であれば十分にお試しができます。
(この24時間の動作時間というのは、例えばLINE Botの場合は、Webhookで呼び出されてからレスポンス返すまでの時間の合計です。）

クラウド実行環境の詳細は、以下のブログも参照ください

https://blog.enebular.com/enebular/how-to-use-enebular-cloud-exec-environment/

## クラウド実行環境を使ったLIFFアプリの例
今回は、クラウド実行環境を使って、LIFFアプリを作る例を紹介します。
LINE Botについては、「[花粉のピークは過ぎたかもしれないけど、enebularで花粉bot作ってみた](https://qiita.com/jksoft/items/e05392bff71b7f153cdc)」を参照ください

クラウド実行環境にLIFFアプリ用のWebページを構成し、それをLINEログインでLIFFアプリとして登録して、LINE公式アカウントから呼び出すという感じにします。

構成的には、下図のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e2bc7a5b-6cc8-5f15-1d1f-9fa1d659c57f.png)


### クラウド実行環境の準備
無料のプランでは、プロジェクトごとに2つのクラウド実行環境を作成できます。
作成方法は、プロジェクトのダッシュボードのメニューから「クラウド実行環境」を開き、右下の「＋」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/a705c26f-5262-492f-eb44-14d900d7deb3.png)

名称を適当に入力し「OK」をクリックします。
（名称は半角英数で入力可能で、自分で識別するための名称のため、後で認識できればデフォルトのままでもOKです。後から変更することもできます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/31db6f2b-599a-baca-fb8f-21263b8dd02b.png)

1,2分待つと作成が完了します。

今回は、HTTPのエンドポイントとして動作させるので、作成が完了したら、設定タブを開き、「設定を編集する」をクリックして、HTTPトリガーのスイッチをOFFからONにして、パスを入力します。
パスは、enebular全体でユニークでなければ行けないので、登録できない場合は、オリジナルの文字列を入力する等で対応してください。これが、LIFFアプリとして連携するURLとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e24c97bc-f195-209e-a3cf-3831010bb215.png)

設定が終わったら、下の方にある「保存」ボタンをクリックします。
保存したらHTTPトリガーの箇所にあるコピーボタンからURLをコピーし、メモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ed2dcd53-64da-594b-85cc-46c278829ad0.png)


### LIFFアプリの設定
[LINE Developers](https://developers.line.biz/ja/)のサイトでログインし、コンソールから新規もしくは既存のプロバイダーからLINEログインのチャンネルを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/3c23b149-1dad-f408-6366-5b2747d90452.png)

地域やチャンネル名を設定し、作成したらLIFFのタブから「追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/be64049a-b556-a3d0-2a17-28f5aca1a59e.png)

LIFFアプリの初期設定として、エンドポイントURLの箇所にコピーしておいたクラウド実行環境のURLを記入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/87d1baf7-abf3-c2e8-b996-14b438ec6fc3.png)

残りの必須の項目を入力したら、「追加」ボタンをクリックします。
追加されたLIFFアプリのLIFF IDとLIFF URLをコピーして、メモしておきます。

### フローの作成
LIFFアプリの簡単な例として、LINE公式アカウントからLIFFアプリを開き、LINEのユーザー名を表示するページを試してみます。
フローは、次のように作りました。単純なHTMLを`templateノード`に記述してます。（HTMLはChatGPTに作ってもらってます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/473d3625-767d-ab17-cbfe-b042fc88f673.png)

HTTPサーバとしてのフローを作成する場合、入口として`http inノード`、出口として`http responseノード`を使用しますが、クラウド実行環境の場合は、`http inノード`の代わりに`LCDP-inノード`、`http responseノード`の代わりに`LCDP-out`ノードを使用します。

下記は、フローのJSONです。コピーして読み込めば同じフローが使用できます。
```json
[{"id":"16917b09a46aa393","type":"LCDP-in","z":"d79fac0155463365","name":"","x":270,"y":200,"wires":[["b6038804c90b27a3"]]},{"id":"b6038804c90b27a3","type":"template","z":"d79fac0155463365","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<!DOCTYPE html>\n<html lang=\"ja\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>LINE Display Name</title>\n  <script src=\"https://static.line-scdn.net/liff/edge/2/sdk.js\"></script>\n</head>\n<body>\n  <h1>ようこそ！</h1>\n  <p id=\"greeting\">LINEの表示名を取得中です...</p>\n\n  <script>\n    // LIFFアプリIDを設定（LINE Developersで取得したLIFF IDを入力）\n    const liffId = 'YOUR_LIFF_ID'; // ここに実際のLIFF IDを設定\n\n    // LIFF初期化と表示名取得処理\n    async function initLiffApp() {\n      try {\n        await liff.init({ liffId }); // LIFF初期化\n        if (!liff.isLoggedIn()) {\n          liff.login(); // ログインしていない場合はログインを促す\n        } else {\n          const profile = await liff.getProfile(); // プロフィール情報を取得\n          const displayName = profile.displayName; // 表示名を取得\n          document.getElementById('greeting').textContent = `こんにちは、${displayName}さん！`;\n        }\n      } catch (error) {\n        console.error('LIFF初期化中にエラーが発生しました:', error);\n        document.getElementById('greeting').textContent = 'エラーが発生しました。再読み込みしてください。';\n      }\n    }\n\n    // ページが読み込まれたらLIFFを初期化\n    initLiffApp();\n  </script>\n</body>\n</html>\n","output":"str","x":420,"y":200,"wires":[["ff12dcfbaaa04bf1"]]},{"id":"ff12dcfbaaa04bf1","type":"change","z":"d79fac0155463365","name":"","rules":[{"p":"headers","t":"set","pt":"msg","to":"{\"Content-Type\":\"text/html; charset=UTF-8\"}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":200,"wires":[["933f5b9e1cfe9203"]]},{"id":"933f5b9e1cfe9203","type":"LCDP-out","z":"d79fac0155463365","name":"","x":790,"y":200,"wires":[]}]
```
:::note warn
enebularのプロジェクトを作成する際に`enebular-privatenode-contrib-lcdp-toolkit`を登録するチェックを外している場合は、[Discover Assets](https://enebular.com/discover/privatenode/7861b7c9-35cd-4ad7-bb0a-840251568a8d)より`lcdp-toolkit`をプロジェクトにインポートしてください。
:::
また、このフローを利用する場合は、`templateノード`のプロパティを開いて、15行目の`YOURE_LIFF_ID`の部分をメモしておいたLIFFアプリの IDに書き換えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e6932f58-606f-c85e-3f2b-478189531b41.png)

### フローのデプロイ
フローの準備ができたらクラウド実行環境にデプロイします。
作成したクラウド実行環境の概要タブから「デプロイ」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/2bde425f-66ae-4907-fb91-a66e4432b0e8.png)

作成したフローを選択して、「デプロイ」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/2e518bc2-30ff-646a-c958-0906e225d687.png)

デプロイには少し時間がかかるので、先にLINE公式アカウントからLIFFアプリを開けるように設定します。

### LINE公式アカウントの設定
[LINE公式アカウントの管理画面](https://manager.line.biz/)にサインインして、新規もしくは既存のLINE公式アカウントを開きます。
いくつか方法がありますが、今回はリッチメニューからLIFFアプリを開くように設定します。
メニューから「リッチメニュー」をクリックし、「リッチメニューを作成」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/dd2f1b41-10e3-3d38-ca4c-bd1829141532.png)

基本設定とコンテンツ設定を行い、アクションは「タイプ」をリンクにしてから、URLとしてメモしておいたLIFF URLを記載します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/1996a814-4070-e0a8-fcd3-199e7c25f4af.png)

設定が終わったら「保存」ボタンをクリックします。

## 動作確認
一通りの設定が終わったら、設定したLINE公式アカウントのリッチメニューからLIFFアプリを開きます。
LINEの表示ユーザー名が表示されれば、成功です。
LINEアプリから開くことで認証が自動的に行われ、ログイン操作をせずにLINEの表示ユーザー名を取得して表示されたことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ef9b6f7b-d0ca-519f-5927-c11dba776def.png)
（認証の画面は初回のみ開きます）

無料プランの場合は、クラウド実行環境のメモリ量に制約があり、初回起動に時間がかかります。連続して開く場合は問題ないですが、時間が空くと開放されます。
そのため、最初や間を開けてLIFFアプリを開く時に10秒ほど時間がかかります。