Amazon API Gateway に送信する
SORACOM は Amazon Web Services (以下、AWS) 上で動いているため、Beam からのデータを直接 AWS 上のサービスを利用して処理することもできます。 これまでは、IoT システムを構築するにあたり、デバイス、通信、インフラと別々に用意する必要がありました。Beam を使用すると、セキュアな IoT システムを AWS 上で容易に構築できます。 ここでは Beam を使用して、AWS にデータをセキュアに送信する方法についてご説明します。
AWS にデータをセキュアに送信する方法としては Beam のほか、SORACOM Funnel を利用することで、より簡単に実装できます。併せてご検討ください。
操作を始める前に準備が必要です (クリックして確認してください)
(1) SORACOM Air for セルラーの IoT SIM が使用できること
IoT SIM の入手、および初期設定は SORACOM の利用を始める を参照してください。
(2) USB ドングル (USB データ通信端末) など SORACOM Air for セルラーの IoT SIM を使用して通信できる PC やデバイス (Raspberry Pi 等) があること
IoT SIM を利用したデバイスによるテザリングでも Beam を利用できます。
(3) 上記の PC やデバイス (Raspberry Pi 等) が curl コマンドを使用できること
クライアントプログラムとして curl コマンドを使用します。
(4) AWS のアカウントがあること
アカウント作成手順は、AWS アカウント作成の流れ を参照してください。
準備完了AWS で利用するサービス
AWS のサービス群から、以下のサービスを使用します。各サービスに関する詳しい情報は、リンク先を参照してください。
- Amazon API Gateway: マネージド API 管理サービス
- AWS Lambda: データ処理
- Amazon DynamoDB: NoSQL データベースサービス
- Amazon CloudFormation: プロビジョニングツール
データの流れ
- デバイスから HTTP で送信されたデータは、Beam により 受信され、デバイスに固有のデータを付与した上で、Amazon API Gateway に TLS 暗号化されたセキュアな状態で送信されます。
- 次に API Gateway は受け取ったデータを加工し、デバイス固有の情報をデータに含めた上で、Lambda の JavaScript コードを実行します。
- Lambda で実行されたコードは、受け取ったデータを DynamoDB に格納します。
機密性の高い情報を IoT デバイスから送受信するには暗号化処理が必要となります。その一方で、IoT デバイスの限られたリソースでは暗号化処理が難しい場合もあります。 そのような場合に暗号化処理を SORACOM プラットフォームのリソースにオフロードできます。
また、Beam を使用した IoT デバイスからのデータアップロードの場合は、3G/LTE 閉域網を通じて Beam のエントリポイントまでデータが送信されますので、平文のままであってもデータは Beam まで安全に届けられます。 Beam から先のサーバーは Beam によって暗号化された通信経路によって安全にデータを送信できます。API Gateway は HTTPS で通信を行うため、上記のようにセキュアに AWS に接続できます。
ステップ 1: AWS を準備する
AWS サービスの準備を行います。
DynamoDB テーブル と Lambda ファンクション の作成
AWS の CloudFormation というサービスを利用し、DynamoDB テーブルと Lambda ファンクションを作成します。
以下のボタンをクリックして、AWS マネジメントコンソールの「スタックのクイック作成」画面を表示します。
AWS CloudFormation テンプレートを利用する
AWS CloudFormation テンプレート
ここで利用する AWS CloudFormation テンプレートは、ダウンロード できます。
にチェックボックスがあるので、チェックを入れてから を押します。Lambda ファンクションを実行する際に必要となる権限を付与するために必要となります。
以下のエラーが出た場合、既存の CloudFormation スタックステップ 1: AWS を準備するを実行してください。 CloudFormation スタックの削除はAWS CloudFormation スタックの削除を参照してください。
を削除してから再度Stack [BeamDemo] already exists
「CREATE_COMPLETE」と表示されたら、作成が完了となります。
作成された 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 ファンクションのテスト
Lambda ファンクション一覧 から BeamDemo で始まる物を選び、テストをクリックします。
イベント名に
LambdaTest
と入力し下記のテスト用データをコピー&ペースト、作成をクリックします。{ "imsi": "001010000000001", "timestamp": 1443465806, "item": { "a": 1, "b": 2, "c": 3 } }
続けてテストボタンをクリックします。
実行後、ログ画面が下記のようになっていることを確認してください。
このリンク から DynamoDB テーブルにテストデータが入っていることを確認してください。
これで Lambda ファンクションと DynamoDB テーブルの用意が完了しました。
API Gateway の設定
デバイスや環境によっては PUT メソッドがご利用いただけない場合があります。その場合は POST メソッドをご利用ください。その場合でも本稿で紹介している手順は有効です。PUT となっているところを POST とお読み替えください。(API Gateway の設定や curl コマンドの引数など)
API Gateway の API 新規作成画面 を開き、API の名前 (BeamDemo など) を付け、API の作成をクリックします。
PUT メソッドを利用してデータをアップロードするので、PUT メソッドを追加します。
メソッドの設定
先ほど作成した Lambda ファンクションを指定します。
パーミッションの追加確認ダイアログが出ますので、OK を押します。
メソッドリクエストの設定
メソッドリクエストをクリックして設定画面に移動
リクエストヘッダーを追加
リクエストヘッダー内の、
X-SORACOM-IMSI
とX-SORACOM-TIMESTAMP
を追加統合リクエストの設定
マッピングテンプレートを追加し、下記のコードを貼り付けます。
{ "imsi":"$input.params('X-SORACOM-IMSI')", "timestamp":$input.params('X-SORACOM-TIMESTAMP'), "item":$input.json('$') }
メソッドの実行画面からテスト画面に入り、「ヘッダー」および「ステージ変数」に下記のサンプルデータを入力してテスト実行してみます。ログが Lambda ファンクションのテスト結果と同じ物となれば、設定完了です。
ヘッダー
X-SORACOM-IMSI:001010000000002 X-SORACOM-TIMESTAMP:1443503174
ステージ変数
{ "a": 4, "b": 5, "c": 6 }
アクションメニューから API のデプロイ をクリックします。
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-IMSI
やX-SORACOM-TIMESTAMP
のヘッダーには仮の値を入れています。後の手順では SORACOM Beam が自動でヘッダーを付与します。{"Item":{"a":10,"b":20,"c":30,"imsi":"0010000000003","timestamp":1443509559},"Result":"success"}
インターネット上の任意のホストから API を実行されては困るので、API キーによる認証を掛けます。まず こちらのリンク から使用量プランを作成します。スロットリングやクォータはテスト用のため無効化します。
作成ボタンをクリックし、先ほど作成した BeamDemo の prod 環境に紐付けます。
続けて、こちらのリンク のアクションメニューからAPI キーの作成をクリックします。
使用量プランに追加ボタンをクリックし、先ほど作成した使用料プランに紐付けます。
メソッドリクエスト画面に戻り、API Key Required を true とします。
手順 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 の設定はグループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。
SIM グループ画面で
をクリックします。SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。
→ の順にクリックします。
HTTP エントリポイントを以下のように設定します。
設定内容は以下のとおりです。
- : 任意です。AWS への設定とわかるように設定名をつけてください。
http://beam.soracom.io:8888/
) に対して、データを送信します。 : HTTP エントリポイントのプロトコル、ホスト名、ポート番号、パスです。デバイスからは、この情報に対応する URL (例: beam.soracom.io:8888
へのアクセスについては、当設定でプロトコル変換され、転送されることになります。 : Beam が変換するプロトコル、および転送するホストになります。指定のグループ (この場合「BeamDemoSample」) に含まれる IoT SIM から、X-Soracom-IMSI
ヘッダーとX-Soracom-Timestamp
ヘッダーが API Gateway に送信されます。「事前共有鍵」には任意の値を入力してください。入力の際には別のダイアログが開きます。 : IMSI の付与、署名ヘッダーを付与します。ここでは ON にします。ON にすることで、X-API-KEY
を追加します。値は、AWS の API Gateway で発行されたものを使用します。 :
をクリックします。
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 を連携する」は以上です。
参考
AWS CloudFormation スタックで作成される AWS リソース
ステップ 1: AWS を準備するの AWS CloudFormation で作成される AWS リソースは下記になります。
AWS リソース | リソース名 |
---|---|
Lambda ファンクション | BeamDemo-Lambda-<ランダムな文字列> |
DynamoDB テーブル | BeamDemo |
IAM ロール | BeamDemo-LambdaExecutionRole-<ランダムな文字列> |
AWS CloudFormation スタックの削除
ステップ 1: AWS を準備するにて AWS CloudFormation で作成した DynamoDB テーブル と Lambda ファンクションは AWS CloudFormation スタックを削除すると削除されます。
AWS CloudFormation コンソールにて
を検索し選択。 をクリックしてください。