【Ask SA!】Amazon HoneycodeにIoTデバイスからデータを送ろう

2020/06/26

ども、ソリューションアーキテクトの takipone こと大瀧です。23日の Developers.IO 2020 CONNECT のライブセッションは見ていただけましたか? SORACOM の便利なデバイスやサービスをいろいろご紹介していますのでまだの方はぜひ録画をご覧ください。

さて、昨日AWSからノンコーディングサービス Amazon Honeycode がリリースされました。クラウドやITをより手軽に使うための新たなツールとして(現在ベータ版なので)今後の機能強化に期待しつつ活用していきたいですね。そこで本ブログでは、業務データに IoT のデータを加えていただくべく、 IoT デバイスから Honeycode の帳票にデータを送り込む方法をご紹介します。試した様子がこんな感じです。

動作デモ (Youtube動画)

Honeycode の様子や今回利用する Honeycode APIについては、以下の記事が参考になります。

なお、利用する IoT デバイスとしては SORACOM が販売している SORACOM LTE-M Button for Enterprise を取り上げますが、九州農政局様でわなの通知 に活用いただいている LTE-M Button Plus などの LTE-M Button シリーズGPS マルチユニット SORACOM Edition でも後述のセンサーデータ部分を合わせることで Honeycode へのデータ送信が可能でしょう。

Honeycode API と AWS 連携

Honeycode と外部プログラムとの連携方法は Honeycode の画面にはそれらしい項目が見当たらないのですが、ナレッジセンターにその手順が載っていました。

ざっくりまとめると以下のような感じです。

  • Honeycode は有償プラン限定で API が使える
  • Honeycode に紐付ける AWS アカウント ID を申請、 AWS アカウント側でそれを承認すれば AWS IAM の権限を基に Honeycode API が呼べ、有償プランの課金も AWS アカウントに請求される
  • Honeycode API には Table の内容を読み込む GetScreenData API と Automation を実行する InvokeScreenAutomation の2つがある

使える API 名を一見すると大したことはできないように誤解しそうなのですが、 Automation 経由で帳票の操作がおおかた行えるようになっており、今回の IoT デバイスからのデータ送信も InvokeScreenAutomation API を利用します。

全体の構成

IoT デバイスから Honeycode にデータを送信するためのシステム全体の構成図を示します。

LTE-M Button は SORACOM IoT SIM のチップ型 SIMが内蔵されていて、 LTE-M 回線の plan-KM1 経由で利用できる SORACOM Funk によって AWS Lambda に送信します。 Lambda の処理を記述する関数内で Honeycode API を呼び出し、Honeycode ワークブック内にデータを反映させる仕組みです。

手順1. Honeycode とAWS連携のセットアップ

まずは、 Honeycode API を利用するために AWS アカウントとの連携と有償プランへの変更を行います。 Honeycode の画面にログインしたら、左のメニューの人影のマークをクリックし、チーム名(既定ではアカウント登録時の 氏名's Team をクリックします

チームのメンバー一覧画面右下の [Connect AWS account] にある [Connect] ボタンをクリックします。

連携させる AWS アカウントのアカウント ID を入力して [Connect to AWS] ボタンをクリックします

AWSアカウント側に申請が飛ぶので、 [Go to AWS Management Console] ボタンから AWS 管理コンソールを開きます。

画面左上のサービス一覧から Honeycode を検索し、オレゴンリージョンを選択します。申請一覧に今回の申請が表示されるので、右側の [Actions ▼] - [Approve connection] をクリックします。

確認のためテキストフィールドに「 Approve 」と入力し、 [Approve connection] ボタンをクリックして承認します。

Honeycode の画面に戻り、表示が [Connected] に切り替わっていればOKです。

続いて支払いプランを変更します。画面右上方の [Upgdare plan] リンクをクリックします。

適切なプランのボタンをクリックします。今回は Plus プラン選択しました。

[Upgrade] ボタンをクリックすればプランが変更されます。これでアカウントの設定は完了です。

手順2. Honeycode のワークブック設定

続いて Honeycode の画面を作っていきましょう。 Table を作成し、ボタンの送信データに対応するよう3つのカラム DeviceIDClickTimestamp を設定しました。

続いて App を追加してデータの追加画面を作ります。オブジェクトを追加していって、3つのカラムに対応するフィールドを3つ、データセルの選択はGUIの挙動が少し安定しないので、右側のプロパティのフィールドでセットするのが確実です。

サブミットボタンにアクションを追加します。 [Actions] タブにある [Create an action] をクリックします。

アクションの設定では [Add row to:] で先ほど作成したTableを指定、[Take data from:] にはデータセルのプロパティ名を =$[プロパティ名] の形式で入力、 [and write to:] には Table のカラム名をそのまま入力します。

3カラム分入れたら完了です。ボタンを右クリックし [Get ARN and IDs] をクリックします

表示される各項目を控えておきます。いずれも識別情報としてAPIをコールする際に指定します。

手順3. AWS 連携の動作確認

では、手元の PC から AWS CLI でHoneycode API を呼び、動作を確認しています。前の手順で控えた各 ID をオプションに指定し、 --variables オプションで投入するデータを指定します。

$ aws honeycode invoke-screen-automation \
>   --region us-west-2 \
>   --profile takiponep \
>   --workbook-id XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
>   --app-id XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
>   --screen-id XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
>   --screen-automation-id XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
>   --variables '{"DeviceID": {"rawValue": "device1"}, "Click":{"rawValue": "1"}, "Timestamp":{"rawValue": "2020/06/25 18:00:00"}}'

1690241110
$

何を指すのかわからない数字がレスポンスとして返って来ます。Tableを見ると…

行が増えていますね。 API 経由でデータが追加できることを確認しました。

手順4. AWS Lambdaの設定

手順3と同様の API コールを Lambda 関数で再現しつつ、 SORACOM Funk から渡されるデータに合わせて送信データを見繕います。 以下のコードを利用しました。

  • ランタイム : Python 3.8
  • リージョン : us-west-2(Oregon)
import json
import boto3
from datetime import datetime

client = boto3.client('honeycode')

def lambda_handler(event, context):
    imsi = context.client_context.custom['imsi']
    click = event["clickTypeName"]
    timestamp = str(datetime.now())

    client.invoke_screen_automation(
        workbookId = 'XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
        appId = 'XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
        screenId = 'XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
        screenAutomationId = 'XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
        variables = {"DeviceID": {"rawValue": imsi}, "Click":{"rawValue": click}, "Timestamp":{"rawValue": timestamp}})

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

通常のLambda関数であれば boto3(Python 版 AWS SDK) が組み込まれているためデプロイパッケージに含める必要は無いのですが、本日(2020/06/26)時点では Lambda 上で利用できる boto3 のバージョン(1.12.49) には Honeycode のライブラリが含まれていなかったため、デプロイパッケージを作成しアップロードして対応しました。
※ Honeycode のライブラリは 1.17.10 には含まれています。Lambda 上の boto3 がアップデートされればデプロイパッケージの作成は不要となる見込みです。

mkdir honeycodeTest
cd honeycodeTest
vim lambda_function.py # Lambda関数を記述
pip install --target ./package boto3
cd package/
zip -r9 ${OLDPWD}/function.zip .
cd $OLDPWD
zip -g function.zip lambda_function.py

また、 Lambda の設定を以下2点既定から変更しています。

  • 実行ロールは Honeycode API をコールできるように以下のポリシーを割り当て
    • AWSLambdaBasicExecutionRole
    • AmazonHoneycodeWorkbookFullAccess
  • タイムアウトは Honeycode API を同期呼び出しするため長くする
    • 0分30秒 ほど

これでOKです。設定した Lambda 関数の ARN を控えておきましょう。

手順5. SORACOMデバイスの設定

LTE-M Button の設定を以下の手順で行います。

続いて SORACOM Funk の設定について、以下の「ステップ 3: Funk の利用を開始する」を行います。

これでOKです。

動作確認

ボタンをクリックして動作を確認したのが冒頭の動画です。 Honeycode の新しい行にボタンのクリックデータが追加される様子がわかりますね。

まとめ

IoT デバイスから Honeycode の帳票にデータを送り込む方法をご紹介しました。 Honeycode API で Lambda から自由にデータの操作ができること、 SORACOM LTE-M Button のデータを SORACOM Funk 経由で Lambda にデータを渡し連携できる様子を伝えできたかと思います。

SORACOM Funk や SORACOM Beam を利用することで、様々なノンプログラミング SaaS サービスとの連携が可能です。皆さんもぜひ試してみてください!そして便利そうだったらブログなどで公開いただけると嬉しいです。


Posted by takipone at 2020/06/26