SORACOM Developers

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
    特に変更が必要な項目はないので、Next をクリックします。

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

  3. 次の画面では、一番下にスクロールしていくと、Capabilities (※) の項目にチェックボックスがあるので、チェックボックスを入れてから Create を押します。
    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で始まる物を選び、Test function をクリックします
    Functionのテスト1

  2. テストデータでの実行
    下記のテスト用データをコピー&ペーストし、Submit をクリックします。

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

    Functionのテスト2

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

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

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

API Gatewayの設定

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

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

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

Mapping Templateを追加し、下記のコードを貼り付けます。

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

API Gateway設定9
6. テスト実行
Method Execution画面から、Method Test画面に入り、
API Gateway設定10
サンプルデータを入力してテスト実行してみます
API Gateway設定11
ログがLambdaファンクションのテスト結果と同じ物となれば、設定完了です。
7. デプロイ
左上の Deploy ボタンをクリックし、
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キーを作成します。
API Gateway設定15
BeamDemo の prod 環境に紐付けます
API Gateway設定16
Method Request画面に戻り、API Key Required を true とします
API Gateway設定17

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

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

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

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

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


Beam の設定

Beam の設定を行います。対象のSIMが含まれるグループをクリックします。
Beamグループ

以下のような 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 を連携する」は以上となります。 ありがとうございました。

pagetop