SORACOM Beam を使用して AWS と接続する
はじめに
「SORACOM」プラットフォームはAmazon Web Services(以降、AWS)上で動いているため、「SORACOM Beam」(以降、Beam)からのデータを直接AWS上のサービスを利用して処理することもできます。
これまでは、IoTシステムを構築するにあたり、デバイス、通信、インフラと別々に用意する必要がありました。Beam を用いると、セキュアなIoTシステムをAWS上で容易に構築できます。
ここでは Beam を使用して、AWSにデータをセキュアに送信する方法についてご説明します。
- AWSにデータをセキュアに送信する方法としては SORACOM Beam の他、 SORACOM Funnel をご利用いただくことで、より簡単に実装できます。併せてご検討ください。
Beam とは
Beam は SORACOM Air の SIM を使用したデバイスからのデータ・アップロード時にクラウド側でデータ処理を行うためのプロキシーサービスです。
Beam を使用することで、以下が可能となります。
- プロトコル変換および暗号化
”TCP → SSL”、”HTTP→HTTPS”、”MQTT→MQTTS”、”TCP→HTTP”といったプロトコルの変換 - 接続先の切り替え
Beam から先の接続先は、ユーザーコンソールの画面もしくは API で設定でき、いつでも変更できます。例えば、なんらかの変更により、デバイスからの接続先を変更することになった場合も、多数配備された IoT デバイス一つ一つに再設定処理を行う必要はありません。
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 に接続することが可能になります。
前提
当ガイドでは、クライアントプログラムとして curl コマンドを使用します。クライアント は、USB ドングル(USBデータ通信端末)などを使用して、SORACOM Air の SIM による通信を行っていることを前提としています。
- SORACOM Air の SIM が使用できること
SIM の入手、および初期設定は、SORACOM の利用を始める(*1)を参照ください。 - USBドングル(USBデータ通信端末)など SORACOM Air の SIM を使用して通信できる PC やデバイス(Raspberry Pi等) があること
- AWS のアカウントがあること
アカウント作成手順は、AWS アカウント作成の流れ(*2)を参照ください。
- SORACOM の利用を始める https://dev.soracom.io/jp/start/
- AWS アカウント作成の流れ https://aws.amazon.com/jp/register-flow/
手順
- ステップ1:各AWSサービスの準備をする
- ステップ2:SORACOM Beam を設定する
- ステップ3:Beam を使用して AWS に接続する
ステップ1
AWSサービスの準備を行います。
DynamoDB テーブル と Lambda ファンクション の作成
AWS の CloudFormation(※) というサービスを利用し、DynamoDB テーブルと Lambda ファンクションを作成します。
※ CloudFormation とは、AWSの様々なリソースをテンプレートファイルとして記述し、スタックという単位で管理するためのツールです
こちらのリンクをクリックし、マネージメントコンソールの CloudFormation スタック作成画面を開きます。
特に変更が必要な項目はないので、次へをクリックします。次の2つの画面は特に変更が必要な項目はないので、次へをクリックします。
次の画面では、一番下にスクロールしていくと、機能 (※) の項目にチェックボックスがあるので、チェックボックスを入れてからスタックの作成を押します。
※ Lambda ファンクションを実行する際に必要となる権限を付与するために必要となります
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のテーブルを確認する
このリンクからDynamoDBのテーブルを開き、
「項目」タブをクリックし、テストデータが入っていることを確認してください。
これで Lambda ファンクションと DynamoDB テーブルの用意が完了しました。
API Gatewayの設定
APIの作成
API GatewayのAPI新規作成画面を開き、APIの名前(BeamDemoなど)を付け、API の作成をクリックします
メソッドの作成
PUTメソッドを利用してデータをアップロードするので、PUTメソッドを追加します。
- デバイスや環境によっては PUT メソッドがご利用いただけない場合があります。その場合は POST メソッドをご利用ください。その場合でも本稿で紹介している手順は有効です。 PUT となっているところを POST とお読み替えください。(API Gateway の設定や curl コマンドの引数など)
- メソッドの設定
先ほど作成した Lambda ファンクションを指定します
パーミッションの追加確認ダイアログが出ますので、OKを押します
- メソッドリクエストの設定
メソッドリクエストをクリックして設定画面に移動
リクエストヘッダを追加
リクエストヘッダ内の、X-SORACOM-IMSI
とX-SORACOM-TIMESTAMP
を追加
- 統合リクエストの設定
マッピングテンプレートを追加し、下記のコードを貼り付けます。
{
"imsi":"$input.params('X-SORACOM-IMSI')",
"timestamp":$input.params('X-SORACOM-TIMESTAMP'),
"item":$input.json('$')
}
6. テスト実行
メソッドの実行画面から、テスト画面に入り、
サンプルデータを入力してテスト実行してみます
ログがLambdaファンクションのテスト結果と同じ物となれば、設定完了です。
7. デプロイ
アクションメニューから API のデプロイ をクリックし、
Deploy を行います
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キーによる認証を掛けます。
まず こちらのリンクから使用量プランを作成します。スロットリングやクォータはテスト用のため無効化します。
作成ボタンをクリックし、先ほど作成した BeamDemo の prod 環境に紐付けます
続けて、こちらのリンクのアクションメニューからAPIキーの作成をクリックします。
使用量プランに追加ボタンをクリックし、先ほど作成した使用料プランに紐付けます。
メソッドリクエスト画面に戻り、API Key Required を true とします
忘れずに手順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 を選択し、[操作] ボタンから [所属グループ変更] を選択します。
SIM の所属グループを選択するためのダイアログが表示されますので、[新しい所属グループ] ドロップダウンから [新しいグループを作成…] を選択します。
以下のようなグループ作成ダイアログが表示されますので、グループの名称を入力して [グループ作成] ボタンをクリックします。 今回は BeamDemoSample というグループ名とします。
[グループ作成] ボタンを押すと元の [SIM の所属グループ変更] ダイアログに戻ります。 [新しい所属グループ] ドロップボックスが、今作成した BeamDemoSample グループになっていることを確認し [グループ変更] ボタンをクリックします。
Beam の設定
Beam の設定を行います。[SIM グループ管理](https://console.soracom.io/#/groups)画面から作成したグループをクリックします。
SORACOM Beam 設定を展開し「+」から「HTTP entry point」を選択します。
HTTP entry point で以下のように設定します。

設定内容は以下のとおりです。
- 設定名
任意です。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 を経由して 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 を連携する」は以上です。