enebular-agentをRaspberry Piにインストールする

enebular-agentとは、Raspberry Pi等の小型のLinuxデバイス上で動作するIoT向けのエージェントソフトです。

[enebular](https://www.enebular.com/ja/)と連携し、以下のことが可能です。

* Node-RED フローの遠隔デプロイ
* ファイルの遠隔デプロイ（2021年9月より無料でも利用できるようになった）
* AIモデルの遠隔デプロイ（2021年9月より無料でも利用できるようになった）
* フローのスタート/ストップ（現在、有料機能）
* enebular-agentのログ、ステータス監視（現在、有料機能）

enebular-agentは主にRaspberry Pi上で動作します。Raspberry Piとenebular-agentを使った例をQiitaに書いているので、参考にしてください。

* [参加者リスト自動作成システムを作ってみた](https://qiita.com/jksoft/items/00cb286d7cdd1ac3ef45)
* [SwitchBot 温湿度計をenebular-agentに繋ぐ](https://qiita.com/jksoft/items/5175d6c0b49928c2b214)
* [enebular-agentで表示端末を作る](https://qiita.com/jksoft/items/d230c6323ea45d1cc4e4)

この記事では、enebular-agentをRaspberry Pi 4Bにインストールし、enebularと連携させる手順を説明します。



# enebular-agentを使うためには
enebular-agentでは、enebularとの連携にAmazon Web Service（AWS）のAWS IoTとAmazon SNSを使用しますので、AWSのアカウントが必要になります。
下図はenebularとAWS、enebular-agentとのイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/80f1a903-4a44-ec3e-34dd-635a9cc07ac9.png)



AWSのアカウントを作成し、IAMのユーザーを用意すれば、enebularやenebular-agentのインストーラが自動的に設定を行いますので、AWSの各サービスの知識は不要です。



# AWSのアカウント作成
まずは、AWSのアカウントを作成します。すでにお持ちの方は、この手順は飛ばしてください。

AWSのアカウント作成には以下の情報が必要になるので、用意してください。

* Eメールアドレス
* パスワード
* AWSアカウント名
* フルネーム
* 電話番号（登録用と検証用 同じものでも可）
* 住所
* クレジットカードまたはデビットカード番号
※引き落とし用の情報は必要になりますが、個人利用、enebular-agent数台分であれば無料枠の範囲で利用できます

[Amazon Web Service](https://aws.amazon.com/jp/)のページで以下のアイコンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/673777a5-d53a-e628-3feb-722601fb4ac2.png)

サインインのページから以下のアイコンをクリックし、アカウントを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/8fbe5db7-5c45-e518-8674-d6f7e0671bb6.png)

アカウント作成画面で必要情報を入力していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/10286077-78ab-cd36-185e-bb01142ada36.png)

SMSもしくは音声での検証が必要になるので、国を選択し、電話番号を入力し、セキュリティの文字を入力後、「SMSを送信する」をクリックし、受け取ったコードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/5d4379d4-be79-905b-dda3-7b25ca3a8e7e.png)

次のページでサポートプランを選択します。とりあえず無料のベーシックプランで十分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/5c9de2d6-8569-0934-e41f-ef59dc6ba5dd.png)

これでアカウントの作成は完了です。

最初に入力した、Eメールアドレスがルートユーザーのメールアドレスになるので、サインインのページでEメールアドレスとパスワードを入力し、サインインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/70b85b72-0fc5-3044-a4ec-277026080382.png)

# IAMユーザー、ロールの作成
AWSにログインした状態でサービス検索欄からIAMを検索し、IAMのページに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e20a1db3-7943-5ad8-dc3b-f34aed64731c.png)

## IAM Role ARNの作成
IAMのページの左メニューからロールを選択し、「ロールを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/668d109c-d730-0a5e-2d71-279c287b65a9.png)

ロールの作成画面で「IoT」を選択、ユースケースの選択で「IoT」を選択し「次のステップ：アクセス権限」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/15a4dc87-a9fa-5f46-6df2-265c90a477e1.png)

アクセス権限ポリシー、タグの作成はそのまま次のステップへ進み、確認画面でロール名を入力し「ロールの作成」をクリックします。

ロールの名前は、指定無いですが、わかりやすく「enebular_status_push_role」と名付けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/30ec4b0d-db56-6da8-440e-d12fe36951fd.png)

ロール一覧の画面に作成したロールが追加されるので、それをクリックし設定を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/02a1e019-5136-b466-8977-d1d18f10c7ee.png)

追加されているポリシーをすべて削除し、「ポリシーをアタッチします」から「AWSIoTDataAccess」と「AmazonSNSFullAccess」を追加し直します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/bc5d52af-29c7-46f6-d306-90276029bd2c.png)

アタッチし直したポリシーは以下の様になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/3ef22b87-8f8c-4477-024f-4f4f681ea70c.png)

これで、IAM Role ARNの作成は完了です。

## AWSユーザの作成

### PassRoleポリシーの作成
ユーザーを作成する前にPassRoleポリシーの作成を行います。IAMのページの左メニューからポリシーを選択し、「ポリシーを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/0f5e06ab-bca3-98e9-d302-8f3aa7ce48ec.png)

ポリシーの作成画面、サービスの選択で「IAM」を検索し、選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/084c7ad2-82f1-40d9-ef62-369c9057842f.png)

アクションで、「PassRole」を検索し、選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/8e3f8a16-8976-c427-7619-5a1b93bf146e.png)

同じようにアクションで、「GetRole」、「ListAttachedRolePolicies」を検索し、選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/44983162-3f20-9984-c783-fac0898eb4ab.png)

リソースの欄では、「ARNの追加」をクリックし、Role name with Path欄に「enebular_status_push_role」と入力し、「追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/99aaf596-ccb4-2680-27fc-82a4659116d1.png)

「次のステップ：タグ」をクリックし、タグの作成画面は、そのまま「次のステップ：確認」をクリックします。

ポリシーの名前は、指定無いですが、わかりやすく「EnebularPassRole」と名付けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ce1e1d6a-76ba-fb7c-d7ae-52a7c76b0661.png)


### ユーザの作成
最後にユーザの作成を行います。IAMのページの左メニューからユーザーを選択し、「ユーザーを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/93481866-de70-b256-942e-4c54a2433e2c.png)

ユーザー名は特に指定ないですが、わかりやすく「enebular-conn-user」と名付けました。AWS認証情報のタイプ選択は、アクセスキー・プログラムによるアクセスを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/5fe16c8c-dd88-7c5f-910d-c7032c6fbd1b.png)

アクセス許可の設定で、「既存のポリシーを直接アタッチ」をクリックし、ポリシーのフィルタで、「AWSIoTFullAccess」と入力し、選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/0512bf0f-3bbe-2761-9c8b-5ba1c8ece5d3.png)

同じように「AmazonSNSFullAccess」、「EnebularPassRole」も選択し、「次のステップ：タグ」をクリックします。

タグの作成画面は、そのまま「次のステップ：確認」をクリックします。

確認画面は、追加されているポリシーを確認し、「ユーザーの作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/501760d8-3831-5d2a-e6a7-d9510644e274.png)

最後に表示される作成したユーザーの情報で、CSVファイルをダウンロードします。このCSVに記載されているアクセスキーIDとシークレットアクセスキーはenebular上の設定とenebular-agentのインストールの際に使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ad265624-4abe-d070-94fa-a2c7fdef65cb.png)

# enebularのコネクションを設定
enebular-agentをenebularに繋ぐためにenebular側でコネクションを設定します。
enebularの無料アカウントの作り方から説明します。

## enebularのアカウントの作り方
[enebular](https://www.enebular.com/ja/)のページから「サインイン」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/cc984b4e-85e2-7693-c00a-59e9465aaf84.png)

サインインページで、「Create an account」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/725c5539-3ca3-e4e6-0d41-f290618835e8.png)

サインアップページで、必要情報を入力。プライバシーポリシーと利用規約に同意しますのチェックボックスにチェックを入れ、「sign up」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/00042cf2-0503-1167-b5a8-759864260b28.png)

入力したEメールアドレス宛に検証メールが届くので、「Verify」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/5777e4fa-af88-b54d-4bd0-08dce033a4d8.png)

検証が完了したらアカウントの作成完了です。左上のアイコンをクリックして、メインページに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/7944a0fd-7b76-0abd-cd1b-e38868315f89.png)

## プロジェクトとコネクションの作成
enebularでは、プロジェクトの上でフローやファイル、AIモデル等のアセットやenebular-agent等のデバイスを管理するので、プロジェクトを作成します。

### プロジェクトの作成
メインページで「Create Project」をクリックし、表示されるダイアログでプロジェクトの名前を入力後「Submit」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/b42c26a9-8662-0e97-2069-78147f443ee0.png)

## コネクションの設定
コネクションを設定する前にIAM Role ARNとAWS IoT Endpointとを調べておきます。

### IAM Role ARN
[IAM Role ARNの作成](##IAM-Role-ARNの作成)で作成したロールのページに記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/8e0ca146-af31-93c1-76b1-90a42ea547e2.png)

### AWS IoT Endpoint
AWS IoT Coreのページから調べられます。AWSのサービス検索欄で「IoT Core」と入力し、ページに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/c33ea63e-dedd-afa4-0c47-85df8c385c43.png)

AWS IoT Coreのページの左メニューから設定を開きます。右上のリージョン選択欄はどこでも良いですが、東京を選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/3c42fc2c-9813-0217-dd2a-000882bcc982.png)

### コネクションの作成
作成したプロジェクトのダッシュボードに入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/6c889f58-ebd4-f71d-3a15-05ecd04261bb.png)

ダッシュボードの左メニューからConnectionsを選択し、「＋」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ace928a3-dc48-1894-086e-d934908ceccf.png)

Connection作成のダイアログに必要情報を入力します。

* Connection Type ⇒ AWS IoT
* Connection Name ⇒ device（自由な名前でOK）
* AWS Access Key ID ⇒ AWS IAMユーザー作成時にダウンロードしたCSVに記載されているものを記入します
* AWS Secret Access Key ⇒ AWS IAMユーザー作成時にダウンロードしたCSVに記載されているものを記入します
* AWS IoT Endpoint ⇒ 前項で調べたAWS IoT Endpointを記入します
* IAM Role ARN ⇒ 前項で調べたIAM Role ARNを記入します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e69b9bb7-ad4c-0ca2-c45b-66f1390704bd.png)

最後に「Save」をクリックすれば、Connectionsに追加されます。

# enebular-agentのインストール
Raspberry Pi 4Bに最新の[Raspberry Pi OS with desktop](https://www.raspberrypi.org/software/operating-systems/)をインストールし、ターミナルから以下のコマンドでenebular-agentをインストールします。

```
> wget -qO- https://enebular.com/agent-install | sudo -E bash -s -- --aws-iot-thing-name={thing name} --aws-access-key-id={AWS Access Key ID} --aws-secret-access-key={AWS Secret Access Key} --aws-iot-region={region} --user=pi
```

※コマンド中の以下の情報は書き換えてください

* `{thing name}` ⇒ 同じコネクション内で被らない名前にします。enebular上で表示されるDeviceの名前にもなります。例：`device-001`
* `{AWS Access Key ID}` ⇒ AWS IAMユーザー作成時にダウンロードしたCSVに記載されているものを記入します
* `{AWS Secret Access Key}` ⇒ AWS IAMユーザー作成時にダウンロードしたCSVに記載されているものを記入します
* `{region}` ⇒ Connection作成時と同じリージョンを記入します。例：`ap-northeast-1`

インストールが完了すると以下のように表示されます。

```
================================================================================
 enebular-agent has been successfully installed ✔
   - Version: 2.15.5
   - Location: /home/pi/enebular-runtime-agent
   - User: pi
   - Service name: enebular-agent-pi

 AWS IoT Thing device-001 has been created.
 enebular-agent is running as a system service.
 To check the status of agent, run the following command on the target device:
   sudo journalctl -ex -u enebular-agent-pi.service
================================================================================
See details in full install log file: /tmp/enebular-agent-install-log.xLiusK
```

enebular-agentはServiceに登録され、裏で起動します。また、再起動しても自動起動します。
インストーラで、AWS IoTのThingもインストールコマンドの引数で指定した名称で作成されます。

# enebular-agent動作確認
動作確認として、[enebular-agentで表示端末を作る](https://qiita.com/jksoft/items/d230c6323ea45d1cc4e4)で紹介しているフローをデプロイしてみます。

フローのOverview画面の「Deploy」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/a285a257-c56e-f12a-9915-05e579a74948.png)

Connectionの一覧が表示されるので、作成したAWS IoTのConnectionをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/04dd3d14-0fee-035e-2922-4357e1342e67.png)

次にAWS IoTに登録されているThingが表示されますので、enebular-agentをインストールした際に指定した名称のものをチェックし、「Deploy」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/9e76f644-da57-e065-66b4-ac9cbae5118e.png)

次に表示される画面で、Deploy StatusがDeployingからDeployedになれば、enebular-agentへのフローのデプロイが完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/d6e13240-58d7-7e16-3e26-669e753af20d.png)

Raspberry Piの画面を確認すると自動的にブラウザが表示され、天気情報が表示されるので、フローが動作していることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/50af69e2-6b88-3e80-7de8-5794a77206b8.png)

Raspberry Piにデプロイしたフローは、ローカルネットワーク内であれば、パソコンからフローを直接編集することも可能です。別記事の[enebular editorでデバッグ](https://qiita.com/jksoft/items/8974bbecf578239bb76f#enebular-editor%E3%81%A7%E3%83%87%E3%83%90%E3%83%83%E3%82%B0)に方法を書いているので、参考にしてみてください。