MENU

Soracom

Users

AWS と接続する

はじめに

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

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

AWS で利用するサービス

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

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

データの流れ

  1. デバイスから HTTP で送信されたデータは、Beam により 受信され、デバイスに固有のデータを付与した上で、Amazon API Gateway に TLS 暗号化されたセキュアな状態で送信されます
  2. 次に API Gateway は受け取ったデータを加工し、デバイス固有の情報をデータに含めた上で、Lambda の JavaScript コードを実行します
  3. Lambda で実行されたコードは、受け取ったデータを DynamoDB に格納します

BeamAWS連携

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

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

前提

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

  • SORACOM Air の SIM が使用できること
  • USB ドングル(USB データ通信端末)など SORACOM Air の SIM を使用して通信できる PC やデバイス(Raspberry Pi 等) があること
  • AWS のアカウントがあること

ステップ 1: AWS を準備する

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

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

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

CloudFormation とは、AWS の様々なリソースをテンプレートファイルとして記述し、スタックという単位で管理するためのツールです
  1. こちらのリンクをクリックし、マネージメントコンソールの CloudFormation スタック作成画面を開きます。特に変更が必要な項目はないので、次へをクリックします。

    Stackの作成1

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

    Stackの作成2

    Stackの作成2

  3. 次の画面では、一番下にスクロールしていくと、機能 (※) の項目にチェックボックスがあるので、チェックボックスを入れてからスタックの作成を押します。Lambda ファンクションを実行する際に必要となる権限を付与するために必要となります

    Stackの作成3

  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

  3. 続けてテストボタンをクリックします。

    Functionのテスト2

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

    Functionのテスト3

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

    Functionのテスト4

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

API Gateway の設定

デバイスや環境によっては PUT メソッドがご利用いただけない場合があります。その場合は POST メソッドをご利用ください。その場合でも本稿で紹介している手順は有効です。 PUT となっているところを POST とお読み替えください。(API Gateway の設定や curl コマンドの引数など)
  1. API Gateway の API 新規作成画面を開き、API の名前(BeamDemo など)を付け、API の作成をクリックします

    API Gateway設定1

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

    API Gateway設定2

    API Gateway設定2

  3. メソッドの設定 先ほど作成した Lambda ファンクションを指定します

    API Gateway設定3

    パーミッションの追加確認ダイアログが出ますので、OK を押します

    API Gateway設定4

  4. メソッドリクエストの設定

    メソッドリクエストをクリックして設定画面に移動

    API Gateway設定5

    リクエストヘッダを追加

    API Gateway設定6

    リクエストヘッダ内の、X-SORACOM-IMSIX-SORACOM-TIMESTAMP を追加

    API Gateway設定7

  5. 統合リクエストの設定

    API Gateway設定8

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

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

    API Gateway設定9

  7. メソッドの実行画面から、テスト画面に入り、サンプルデータを入力してテスト実行してみます。ログが Lambda ファンクションのテスト結果と同じ物となれば、設定完了です。

    API Gateway設定10

    API Gateway設定11

  8. アクションメニューから API のデプロイ をクリックします。

    API Gateway設定12

    API Gateway設定13

  9. 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"}
    
  10. インターネット上の任意のホストから API を実行されては困るので、API キーによる認証を掛けます。まず こちらのリンクから使用量プランを作成します。スロットリングやクォータはテスト用のため無効化します。

    API Gateway設定15

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

    API Gateway設定16

  12. 続けて、 こちらのリンクのアクションメニューからAPI キーの作成をクリックします。

    API Gateway設定15

  13. 使用量プランに追加ボタンをクリックし、先ほど作成した使用料プランに紐付けます。

    API Gateway設定15

  14. メソッドリクエスト画面に戻り、API Key Required を true とします

    API Gateway設定17

  15. 手順 8 を参考に、再度デプロイを行います。

手順 9 と同じリクエストはエラーとなります。

$ 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."}

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

$ 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"}%

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

ステップ 2: Beam を設定する

ここでは、Beam の設定を行います。デバイスから Beam に送信されたデータを暗号化し AWS に送信します。 SIM の登録等については SORACOM の利用を始める を参照してください。

SORACOM ユーザーコンソールにログインします。

グループの作成

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

Beamグループ

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

Beamグループ

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

Beamグループ

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

Beamグループ

Beam の設定

Beam の設定を行います。 SIM グループ管理画面から作成したグループをクリックします。

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

Beamグループ

HTTP entry point で以下のように設定します。

Beamグループ

Beamグループ

Beamグループ

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

  • 設定名 任意です。AWS への設定とわかるように設定名をつけてください。
  • エントリポイント SORACOM Beam のホスト名とポート番号になります。デバイスからはこのホスト(beam.soracom.io:8888)に対して、データを送信します。
  • 転送先 Beam が変換するプロトコル、および転送するホストになります。指定のグループ(この場合「BeamDemoSample」)に含まれる SIM から、beam.soracom.io:8888 へのアクセスについては、当設定でプロトコル変換され、転送されることになります。
  • オプション IMSI の付与、署名ヘッダを付与します。ここでは ON にします。ON にすることで、X-Soracom-IMSI ヘッダーと X-Soracom-Timestamp ヘッダーが API Gateway に送信されます。「事前共有鍵」には任意の値を入力してください。入力の際には別のダイアログが開きます。
  • カスタムヘッダ X-API-KEY を追加します。値は、AWS の API Gateway で発行されたものを使用します。

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

ステップ 3: Beam 経由でデータを送信する

実際に 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 を連携する」は以上です。