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

BeamAWS連携 BeamAWS連携

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

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

前提

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

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

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

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

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

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

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

    Stackの作成1 Stackの作成1

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

    Stackの作成2 Stackの作成2

    Stackの作成2 Stackの作成2

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

    Stackの作成3 Stackの作成3

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

    Stackの作成3 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 Functionのテスト1

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

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

    Functionのテスト2 Functionのテスト2

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

    Functionのテスト2 Functionのテスト2

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

    Functionのテスト3 Functionのテスト3

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

    Functionのテスト4 Functionのテスト4

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

API Gateway の設定

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

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

    API Gateway設定1 API Gateway設定1

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

    API Gateway設定2 API Gateway設定2

    API Gateway設定2 API Gateway設定2

  3. メソッドの設定

    先ほど作成した Lambda ファンクションを指定します。

    API Gateway設定3 API Gateway設定3

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

    API Gateway設定4 API Gateway設定4

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

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

    API Gateway設定5 API Gateway設定5

    リクエストヘッダーを追加

    API Gateway設定6 API Gateway設定6

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

    API Gateway設定7 API Gateway設定7

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

    API Gateway設定8 API Gateway設定8

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

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

    API Gateway設定9 API Gateway設定9

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

    ヘッダー

    X-SORACOM-IMSI:001010000000002
    X-SORACOM-TIMESTAMP:1443503174
    

    ステージ変数

    {
      "a": 4,
      "b": 5,
      "c": 6
    }
    

    API Gateway設定10

    API Gateway設定11 API Gateway設定11

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

    API Gateway設定12 API Gateway設定12

    API Gateway設定13 API Gateway設定13

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

    $ 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
    

    以下のようなレスポンスが確認できます。なお、X-SORACOM-IMSIX-SORACOM-TIMESTAMP のヘッダーには仮の値を入れています。後の手順では SORACOM Beam が自動でヘッダーを付与します。

    {"Item":{"a":10,"b":20,"c":30,"imsi":"0010000000003","timestamp":1443509559},"Result":"success"}
    
  10. インターネット上の任意のホストから API を実行されては困るので、API キーによる認証を掛けます。まず こちらのリンク から使用量プランを作成します。スロットリングやクォータはテスト用のため無効化します。

    API Gateway設定15 API Gateway設定15

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

    API Gateway設定16 API Gateway設定16

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

    API Gateway設定15 API Gateway設定15

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

    API Gateway設定15 API Gateway設定15

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

    API Gateway設定17 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: SORACOM Beam を有効にして HTTP エントリポイントを設定する

ここでは、Beam の設定を行います。デバイスから Beam に送信されたデータを暗号化し AWS に送信します。

Beam の設定はグループに対して行います

ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作ついて詳しくは、グループ設定 を参照してください。

  1. SIM グループ画面で [SORACOM Beam 設定] をクリックします。

    SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。

  2. [+][HTTP エントリポイント] の順にクリックします。

    Beamグループ Beamグループ

  3. HTTP エントリポイントを以下のように設定します。

    Beamグループ Beamグループ

    Beamグループ Beamグループ

    Beamグループ Beamグループ

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

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

  5. IoT SIM が所属するグループを切り替えます。

    IoT SIM の Beam の設定が完了しました。

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

実際に Beam を経由して AWS にデータを送信してみます。 Beam の設定された IoT 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 を連携する」は以上です。