SORACOM Users

Documents

SORACOM Beam を使用して AWS と接続する

はじめに

「SORACOM」プラットフォームはAmazon Web Services(以降、AWS)上で動いているため、「SORACOM Beam」(以降、Beam)からのデータを直接AWS上のサービスを利用して処理することもできます。 これまでは、IoTシステムを構築するにあたり、デバイス、通信、インフラと別々に用意する必要がありました。Beam を用いると、セキュアなIoTシステムをAWS上で容易に構築できます。
ここでは Beam を使用して、AWSにデータをセキュアに送信する方法についてご説明します。

SORACOM Funnel もご利用いただけます
  • AWSにデータをセキュアに送信する方法としては SORACOM Beam の他、 SORACOM Funnel をご利用いただくことで、より簡単に実装できます。併せてご検討ください。

Beam とは

Beam は SORACOM Air の SIM を使用したデバイスからのデータ・アップロード時にクラウド側でデータ処理を行うためのプロキシーサービスです。

Beam概要

Beam を使用することで、以下が可能となります。

AWSで利用するサービス

AWSのサービス群から、以下のサービスを使用します。各サービスに関する詳しい情報は、リンク先をご参照ください。

  1. Amazon API Gateway マネージドAPI管理サービス
  2. AWS Lambda データ処理
  3. Amazon DynamoDB NoSQLデータベースサービス
  4. Amazon CloudFormation プロビジョニングツール

データの流れ

BeamAWS連携

機密性の高い情報を IoT デバイスから送受信するには暗号化処理が必要となります。その一方で、IoT デバイスの限られたリソースでは暗号化処理が難しい場合もあります。 そのような場合に暗号化処理を SORACOM プラットフォームのリソースにオフロードできます。

また、Beam を使用した IoT デバイスからのデータアップロードの場合は、3G/LTE 閉域網を通じて Beam のエンドポイントまでデータが送信されますので、平文のままであってもデータは Beam まで安全に届けられます。 Beam から先のサーバーは Beam によって暗号化された通信経路によって安全にデータを送信できます。 API Gateway は HTTPS で通信を行うため、上記のようにセキュアに AWS に接続することが可能になります。

前提

当ガイドでは、クライアントプログラムとして curl コマンドを使用します。クライアント は、USB ドングル(USBデータ通信端末)などを使用して、SORACOM Air の SIM による通信を行っていることを前提としています。

  1. SORACOM の利用を始める https://dev.soracom.io/jp/start/
  2. AWS アカウント作成の流れ https://aws.amazon.com/jp/register-flow/

手順

ステップ1

AWSサービスの準備を行います。

DynamoDB テーブル と Lambda ファンクション の作成

AWS の CloudFormation(※) というサービスを利用し、DynamoDB テーブルと Lambda ファンクションを作成します。

CloudFormation とは、AWSの様々なリソースをテンプレートファイルとして記述し、スタックという単位で管理するためのツールです

  1. こちらのリンクをクリックし、マネージメントコンソールの CloudFormation スタック作成画面を開きます。
    Stackの作成1
    特に変更が必要な項目はないので、次へをクリックします。

  2. 次の2つの画面は特に変更が必要な項目はないので、次へをクリックします。
    Stackの作成2 Stackの作成2

  3. 次の画面では、一番下にスクロールしていくと、機能 (※) の項目にチェックボックスがあるので、チェックボックスを入れてからスタックの作成を押します。
    Stackの作成3

    ※ Lambda ファンクションを実行する際に必要となる権限を付与するために必要となります

  4. CREATE COMPLETE と表示されたら、作成が完了となります。
    Stackの作成3

作成された Lambda ファンクションのコード(JavaScript)は下記のような物となります。

// initialize SDK and document client
var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context) {
  // insert imsi and timestamp into item object
  event.item.imsi = event.imsi;
  event.item.timestamp = event.timestamp;

  // build API parameter
  var params = {
    Item: event.item,
    TableName: 'BeamDemo'
  };

  // call PutItem operation
  docClient.put(params, function(err, data){
    if (err)
      context.fail(err);
    else
      context.succeed({Item: event.item, Result:'success'});
  });
};

Lambda ファンクションのテストを行う

  1. Lambdaファンクション一覧からBeamDemoで始まる物を選び、テストをクリックします
    Functionのテスト1

  2. テストデータでの実行
    イベント名に LambdaTest と入力し下記のテスト用データをコピー&ペースト、作成をクリックします。

    {
      "imsi":"001010000000001",
      "timestamp":1443465806,
      "item":{
        "a":1,
        "b":2,
        "c":3
      }
    }
    

    Functionのテスト2
    続けてテストボタンをクリックします。 Functionのテスト2

  3. 実行後、ログ画面が下記のようになっていることを確認してください。
    Functionのテスト3

  4. DynamoDBのテーブルを確認する
    このリンクからDynamoDBのテーブルを開き、
    「項目」タブをクリックし、テストデータが入っていることを確認してください。
    Functionのテスト4

これで Lambda ファンクションと DynamoDB テーブルの用意が完了しました。

API Gatewayの設定

  1. APIの作成
    API GatewayのAPI新規作成画面を開き、APIの名前(BeamDemoなど)を付け、API の作成をクリックします
    API Gateway設定1

  2. メソッドの作成
    PUTメソッドを利用してデータをアップロードするので、PUTメソッドを追加します。
    API Gateway設定2
    API Gateway設定2

API Gateway のメソッドについて
  • デバイスや環境によっては PUT メソッドがご利用いただけない場合があります。その場合は POST メソッドをご利用ください。その場合でも本稿で紹介している手順は有効です。 PUT となっているところを POST とお読み替えください。(API Gateway の設定や curl コマンドの引数など)
  1. メソッドの設定
    先ほど作成した Lambda ファンクションを指定します
    API Gateway設定3
    パーミッションの追加確認ダイアログが出ますので、OKを押します
    API Gateway設定4
  2. メソッドリクエストの設定
    メソッドリクエストをクリックして設定画面に移動
    API Gateway設定5
    リクエストヘッダを追加
    API Gateway設定6
    リクエストヘッダ内の、X-SORACOM-IMSIX-SORACOM-TIMESTAMP を追加
    API Gateway設定7
  3. 統合リクエストの設定
    API Gateway設定8

マッピングテンプレートを追加し、下記のコードを貼り付けます。

{
  "imsi":"$input.params('X-SORACOM-IMSI')",
  "timestamp":$input.params('X-SORACOM-TIMESTAMP'),
  "item":$input.json('$')
}

API Gateway設定9
6. テスト実行
メソッドの実行画面から、テスト画面に入り、
API Gateway設定10
サンプルデータを入力してテスト実行してみます
API Gateway設定11
ログがLambdaファンクションのテスト結果と同じ物となれば、設定完了です。
7. デプロイ
アクションメニューから API のデプロイ をクリックし、
API Gateway設定12
Deploy を行います
API Gateway設定13
8. インターネットからのAPI実行

curlコマンドが使用できる環境から、下記のようにデータを送信してみます(URLは読み替えてください)

    $ curl -X PUT -d "{\"a\":10,\"b\":20,\"c\":30}" \ # PUTメソッドを使用、データをJSON形式で指定
      -H "Content-Type:application/json" \ # 送信データがJSON形式であることを指定
      -H "X-SORACOM-IMSI:0010000000003" \ # 仮のIMSIを指定
      -H "X-SORACOM-TIMESTAMP:1443509559" \ # 仮のタイムスタンプを指定
      https://uu4zh75hxf.execute-api.ap-northeast-1.amazonaws.com/prod
    {"Item":{"a":10,"b":20,"c":30,"imsi":"0010000000003","timestamp":1443509559},"Result":"success"}

データがアップロードされている事が確認できます。
9. APIキーによる認証
インターネット上の任意のホストからAPIを実行されては困るので、APIキーによる認証を掛けます。 まず こちらのリンクから使用量プランを作成します。スロットリングやクォータはテスト用のため無効化します。 API Gateway設定15

作成ボタンをクリックし、先ほど作成した BeamDemo の prod 環境に紐付けます

API Gateway設定16

続けて、こちらのリンクのアクションメニューからAPIキーの作成をクリックします。
API Gateway設定15
使用量プランに追加ボタンをクリックし、先ほど作成した使用料プランに紐付けます。 API Gateway設定15
メソッドリクエスト画面に戻り、API Key Required を true とします
API Gateway設定17

忘れずに手順7を参考に、再度デプロイを行います。 すると、

    $ curl -X PUT -d "{\"a\":10,\"b\":20,\"c\":30}" \
      -H "Content-Type:application/json" \
      -H "X-SORACOM-IMSI:0010000000003" \
      -H "X-SORACOM-TIMESTAMP:1443509559" \
      https://uu4zh75hxf.execute-api.ap-northeast-1.amazonaws.com/prod
    {"message": "Not able to access resource."}

のようにエラーとなりますが、

    $ curl -X PUT -d "{\"a\":10,\"b\":20,\"c\":30}" \
      -H "Content-Type:application/json" \
      -H "X-SORACOM-IMSI:001010000000003" \
      -H "X-SORACOM-TIMESTAMP:1443509559" \
      -H "X-API-KEY:aDB7Q8ZkAo8wt9mB623ow2dG0ogGXyDO7YuOD7fk" \
      https://uu4zh75hxf.execute-api.ap-northeast-1.amazonaws.com/prod
    {"Item":{"a":10,"b":20,"c":30,"imsi":"001010000000003","timestamp":1443509559},"Result":"success"}%

とAPIキーをつけて実行することで、APIコールができることを確認しました。

以上でAWS側の設定は完了です。

ステップ2

ここでは、Beam の設定を行います。デバイスから Beam に送信されたデータを暗号化し AWS に送信します。 SIM の登録等については、「SORACOM の利用を始める」(https://dev.soracom.io/jp/start/begin_soracom )を参照してください。

以下の URL から SORACOM のコンソールにログインします。
https://console.soracom.io/#/?coverage_type=jp

グループの作成

Beam は、IoT SIM のグループ単位で設定します。そのため、IoT SIM を何らかのグループに所属させる必要があります。 今回は、Beam の動作確認をするための専用のグループを作成してそこに SIM を所属させます。
「SIM 管理」画面を開いて、Beam を用いた通信を行う SIM を選択し、[操作] ボタンから [所属グループ変更] を選択します。
Beamグループ

SIM の所属グループを選択するためのダイアログが表示されますので、[新しい所属グループ] ドロップダウンから [新しいグループを作成…] を選択します。
Beamグループ

以下のようなグループ作成ダイアログが表示されますので、グループの名称を入力して [グループ作成] ボタンをクリックします。 今回は BeamDemoSample というグループ名とします。 Beamグループ

[グループ作成] ボタンを押すと元の [SIM の所属グループ変更] ダイアログに戻ります。 [新しい所属グループ] ドロップボックスが、今作成した BeamDemoSample グループになっていることを確認し [グループ変更] ボタンをクリックします。
Beamグループ


Beam の設定

Beam の設定を行います。[SIM グループ管理](https://console.soracom.io/#/groups)画面から作成したグループをクリックします。

SORACOM Beam 設定を展開し「+」から「HTTP entry point」を選択します。 Beamグループ

HTTP entry point で以下のように設定します。
Beamグループ

Beamグループ

Beamグループ

設定内容は以下のとおりです。

上記を入力して、「保存」をクリックします。

ステップ3

実際にBeam を経由して AWS にデータを送信してみます。
Beamの設定されたSIMで通信を行える状態となったデバイス上で、下記コマンドを実行します。

pi@raspberrypi:~$ curl -X PUT -d "{\"a\":10,\"b\":20,\"c\":30}" \
  -H "Content-Type:application/json" http://beam.soracom.io:8888
{"Item":{"a":10,"b":20,"c":30,"imsi":"001011111111111","timestamp":1443515749634},"Result":"success"}

デバイスがBeamを通じて通信を行う際には、HTTPSではなくHTTPで通信を行い、またIMSIやTIMESTAMP、APIキーを付与する必要がない点に注目してください。 Beamが通信を転送する過程で、ヘッダにそれらの情報を入れて送信をしているためです。

「SORACOM Beam と AWS を連携する」は以上です。

Getting Started

SORACOM Air for セルラー

SORACOM Air for LoRaWAN

SORACOM Air for Sigfox

SORACOM Beam

SORACOM Canal/Direct/Door

SORACOM Endorse

SORACOM Funnel

SORACOM Funk

SORACOM Gate

SORACOM Harvest

SORACOM Inventory

SORACOM Junction

SORACOM Krypton

SORACOM Lagoon

SORACOM Mosaic

SORACOM Napter

SORACOM Orbit

SORACOM Peek

SORACOM LTE-M Button

GPS マルチユニット SORACOM Edition

ビーコン対応 GPS トラッカー GW

IoT 体験キット

Device

サービス機能詳細

Developer Tools

API & Tools Usage Patterns

Design Patterns

pagetop