SORACOM Developers

SORACOM LTE-M Button デザインパターン
― GCP と連携させる

SORACOM LTE-M Button と GCP を連携させる方法は2種類あります。

デザインパターン
button_design_patterns / Button - Beam - Google Cloud Functions
素早いボタンアプリケーションを構築したい方向け
button_design_patterns / Button - Funnel - Google Cloud Pub/Sub, Google Cloud Functions
関数の保護を手軽に実現したい、もしくは、大量のデータストリームの処理を必要とするアプリケーション向け

SORACOM Beam + Google Cloud Functions パターン

素早いボタンアプリケーションを構築したい場合は、SORACOM Beam から Google Cloud Functions の Webhook を呼び出す方法があります。

button_design_patterns / Button - Beam - Google Cloud Functions

手順

ここでは Google Cloud Functions で Webhook (HTTP トリガー) を作成し、 SORACOM Beam から呼び出せるように構成する手順を解説します。

1. 関数を作成する

GCP ダッシュボードのナビゲーションメニューから “Cloud Functions” を探してクリック、その後に [関数の作成] をクリックします。
※ “API が有効になっていません” と表示される場合は [API を有効にする] をクリックしてから [関数の作成] に進んでください。

表示されるダイアログに以下のように入力した後、[作成] をクリックします。

※ TIPS: ランダムな文字列は pwgen in JavaScript といったツールを活用すると便利です。

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
 exports.helloWorld = (req, res) => {
    console.log(req.headers);
    console.log(req.body);
    res.status(204).end();
};

Beam - Google Cloud Functions / functions 1

作成した関数をクリックし [トリガー] タブをクリックして表示された URL をメモしておきます。

Beam - Google Cloud Functions / functions 2

2. SORACOM Beam の設定を行う

SORACOM IoT SIM グループの管理画面から “SORACOM Air for Cellular 設定” で [バイナリパーサー設定] を “ON” にした後、以下のように入力してから [保存] をクリックします。

Beam - Amazon API Gateway, AWS Lambda / air 1

同じ SIM グループの管理画面から “SORACOM Beam 設定” で [UDP → HTTP/HTTPS エントリポイント] をクリックした後に表示されるダイアログで以下のように入力してから [保存] をクリックします。

Beam - Google Cloud Functions / beam 1

最後に、"SIM 管理" から、LTE-M Buttom を、上記で設定した SIM グループに所属させて完了となります。

3. 確認

確認は Google Cloud Functions で行います。関数の管理画面から [ログを表示] をクリックします。
※ “新しいログを読み込む” をクリックして適宜最新の情報に更新してください

Beam - Google Cloud Functions / testflight 1

4. この後の開発に向けた情報源


トラブルシュート

Google Cloud Functions のエンドポイントセキュリティ

Google Cloud Functions は、標準では URL を知っていればどこからでもコール可能となっており、HTTP リクエストを認証する仕組みは Google Cloud Functions とは別に用意する必要があります。
Google Cloud Functions の公式ドキュメントでは二つの方法が紹介されていますが、そのうち1つの Google Cloud Pub/Sub を使用する方法は SORACOM Funnel + Cloud Pub/Sub パターンで利用可能なため、関数の保護を手軽に実現したい場合にはそちらも検討します。

また、SORACOM Beam で署名ヘッダを生成&送信し、署名を実行する関数内で検証する方式が利用できます。
この手法で、SORACOM Beam から呼び出されたことを検証できますので、不正な呼び出しから関数を保護することが可能です。(この手法は呼び出し自体を回避するものではありませんのでご注意ください)

署名ヘッダを検証するコード例です (Node.js(v8以降))

※ 事前共有鍵は環境変数 SHARED_PSK から取得するようにしています。
※ [実行する関数] は helloWorld としています

function soracom_beam_sign_verification(psk, headers) {
    if (!(headers['x-soracom-imei'] || headers['x-soracom-imsi'])) return false;
    if (!(headers['x-soracom-signature'] && headers['x-soracom-timestamp'])) return false;

    let s = '';
    for (let i of ['x-soracom-imei', 'x-soracom-imsi', 'x-soracom-timestamp']) {
        if (headers[i]) s += `${i}=${headers[i]}`;
    }
    console.log(s);
    const data = psk + s;
    const digest_hex = require('crypto').createHash('sha256').update(data).digest('hex');
    const signature = headers['x-soracom-signature'];
    console.log(signature, digest_hex);
    return (signature == digest_hex);
}

const psk = process.env['SHARED_PSK'];
exports.helloWorld = (req, res) => {
    console.log(req.headers);
    console.log(req.body);
    if (soracom_beam_sign_verification(psk, req.headers)){
        console.log("sign_verification successful.");
        res.status(204).end();
    } else {
        console.log("sign_verification failed.");
        res.status(403).end();
    }
};

SORACOM Funnel + Google Cloud Pub/Sub パターン

関数の保護を手軽に実現したい、もしくは、大量のデータストリームの処理を必要とするアプリケーションを構築したい場合は、SORACOM Funnel から Google Cloud Pub/Sub を通じて Google Cloud Functions を利用する方法があります。

button_design_patterns / Button - Funnel - Google Cloud Pub/Sub, Google Cloud Functions

手順

ここでは Google Cloud Pub/Sub から Google Cloud Functions への連携部分について追加で解説します。

1. Google Cloud Pub/Sub を作成する

SORACOM Funnel の Cloud Pub/Sub アダプターを使用してGoogle Cloud Platformにデータを送信する1. Pub/Sub を設定する2. Funnel で使用するアカウントを作成する を行ってください。

内容としては以下の通りです。

  1. Cloud Pub/Sub の API を有効にする
  2. Cloud Pub/Sub に Publish できるアカウントを IAM で作成する
    • 本ガイドでは soracom-funnel-pubsub-user1 というアカウント名を作成し、JSON 形式の認証情報を取得しておきます。
  3. Cloud Pub/Sub を作成する
    • 本ガイドでは button-topic1 というトピック名とします。

2. 関数を作成する

GCP ダッシュボードのナビゲーションメニューから “Cloud Functions” を探してクリック、その後に [関数の作成] をクリックします。
※ “API が有効になっていません” と表示される場合は [API を有効にする] をクリックしてから [関数の作成] に進んでください。

表示されるダイアログに以下のように入力した後、[作成] をクリックします。

※ TIPS: ランダムな文字列は pwgen in JavaScript といったツールを活用すると便利です。

/**
 * Triggered from a message on a Cloud Pub/Sub topic.
 *
 * @param {!Object} event Event payload.
 * @param {!Object} context Metadata for the event.
 */
exports.helloPubSub = (event, context) => {
    console.log(event.attributes);
    console.log(Buffer.from(event.data, 'base64').toString());
};

Funnel - Google Cloud Functions / functions 1

3. SORACOM Funnel の設定を行う

SORACOM IoT SIM グループの管理画面から “SORACOM Air for Cellular 設定” で [バイナリパーサー設定] を “ON” にした後、以下のように入力してから [保存] をクリックします。

Beam - Amazon API Gateway, AWS Lambda / air 1

これ以降は SORACOM Funnel の Cloud Pub/Sub アダプターを使用してGoogle Cloud Platformにデータを送信する3. Funnel を設定する を行ってください。
※ 4. Funnel を使用して Pub/Sub にデータを送信する はスキップしてください

SORACOM Funnel 設定の際には以下に注意してください

4. 確認

確認は Google Cloud Functions で行います。関数の管理画面から [ログを表示] をクリックします。
※ “新しいログを読み込む” をクリックして適宜最新の情報に更新してください

Funnel - Google Cloud Functions / testflight 1

5. この後の開発に向けた情報源


トラブルシュート

pagetop