SORACOM, INC.

User Console »
Documents

SORACOM Beam を使用して AWS IoT と接続する(Rubyスクリプト版)

はじめに

SORACOM Beam(以下、Beam) を使用して AWS と連携する方法として、HTTP 経由で API Gateway を使用した連携について以前ご紹介させていただきました。 本記事では、2015年10月の AWS のカンファレンス Re:invent で発表された AWS IoT という新しいサービスを利用する際、 IoT デバイスから AWS IoT にデータ送信を行うために SORACOM Beam を活用する方法をご説明いたします。

当ガイドは、Beam の設定に Ruby スクリプトを使用しています。SORACOM ユーザーコンソールを使用する場合は、SORACOM Beam を使用して AWS IoT と接続する(ユーザーコンソール版) を参照してください。

AWS IoT とは

AWS IoT とは、デバイス(Thing)から安全にデータをクラウドに送信し、また送信されたデータに対してルールベースで各種AWSサービスを連携させる事ができるプラットフォームです。

image (AWS IoT ドキュメント : How AWS IoT Works より)

デバイス(Thing)からクラウドへのデータ送信の方法には2種類用意されています。

本記事では、MQTTS を使用してデータを投入してみたいと思います。送信されたデータは SNS を使用してメール通知してみましょう。

Beam とは

Beam は SORACOM Air の SIM を使用したデバイスからのデータ・アップロード時にクラウド側でデータ処理を行うためのプロキシーサービスです。

Beam概要

本記事では、MQTT -> MQTTS のプロトル変換(暗号化)機能を利用します。 CPUパワーがあまりなく、MQTT通信は行えるが、MQTTSでの通信を行うのが難しいようなデバイスの場合には、有用となるでしょう。

またクライアント証明書は各デバイスが利用できるようにデバイス上にコピーしておく必要がありますが、 SORACOM Beamがデバイスの代わりにクライアント証明書を使用してTLS通信を行うため、証明書の管理が楽になります。

AWS IoT の設定

  1. AWS IoT コンソールを開き AWS IoT の設定を開始します AWS IoT

  2. まずはデバイス(Thing)を作成します。名前を入力して、Createを押します AWS IoT

  3. View thing で Thing の Detail 情報を表示し、右下の Connect a device ボタンを押します AWS IoT

  4. Node.js を選択し、Generate Policy and Policy を押します AWS IoT

  5. Privae Key ファイルと Certificate ファイルをダウンロードします(後ほど使用します) Confirm & Start connecting を押して、 次ページで Return to Thing Detail を押します AWS IoT

  6. Thing Detail 画面から Create Rule を押します AWS IoT

  7. 全てのTopicに送信されたデータの、全ての Attribute を対象にします AWS IoT

  8. Rule の Action は上から2つ目の Send message as a push notification (SNS) を選択 AWS IoT

  9. 通知対象の SNS Topic を選択するか、Create a new resource から新規作成を行います また、対象の Topic に通知するための権限を付与するために、 Create a new role から Role を作成します AWS IoT

  10. 最後に Create を押したら、AWS IoTの設定は完了です AWS IoT

SORACOM Beam の設定

準備

証明書ファイルの用意

AWS IoT の Thing 設定の際に得られた証明書ファイルのうち、

と、

を用意します。

SORACOM SDK for Ruby のインストール

SORACOM SDK for Ruby を利用しますので、インストールを行います。

$ (sudo) gem install soracom # 環境によっては sudo が必要となります
Successfully installed soracom-1.0.4
Parsing documentation for soracom-1.0.4
1 gem installed

Ruby スクリプトの準備

下記のスクリプトを BeamtoAWSIoT.rb という名前で保存します。

#!/usr/bin/env ruby
require 'soracom'
require 'json'

if ARGV.length < 3
  puts <<EOS
usage: #{$PROGRAM_NAME}" key.pem cert.pem ca.pem [ group-id ]

If 'group-id' is provided, this program will set Beam config to access AWS IoT.
If 'group-id' is not provided, this program will generate JSON to use with CLI.
EOS
  exit
end

if ARGV.length == 4
  client = Soracom::Client.new
  group_id = ARGV.pop
end

certs = {}
ARGV.map{ |f| open(f).read }.each_with_index do |v, i|
  certs[['key','cert','ca'][i]] = v
end

credentials_id = "certs_#{Time.now.to_i}"
credentials_set = {
  type: 'x509',
  description: '',
  credentials: certs,
}

puts "Creating a credentials set"
p client.create_credentials credentials_id, credentials_set.to_json

params = [{
  key: 'mqtt://beam.soracom.io:1883',
  value: {
    name: 'AWS IoT',
    destination: 'mqtts://data.iot.ap-northeast-1.amazonaws.com:8883',
    enabled: true,
    addSubscriberHeader: false,
    useClientCert: true,
    clientCerts: {
      default: { '$credentialsId' => credentials_id }
    }
  }
}]

# puts JSON.pretty_generate params
puts params.to_json

if group_id
  puts "update group configuration to group #{group_id}"
  p client.update_group_configuration group_id, 'SoracomBeam', params.to_json
end

グループの準備

AWS IoT にアクセスするための Group を新規で作成するか、または既存の Group の ID を確認します。 Group の ID は SORACOM ユーザコンソールのグループ一覧画面で、右側の ID 欄に表示されているものとなります。

もし CLI で作成する際には、

$ soracom group create --tags name:"AWS IoT"
{
  "operatorId": "OP0000000000",
  "groupId": "435bc5a3-f2f8-4b33-a510-45381e478edc",
  "createdAt": 1444892610985,
  "lastModifiedAt": 1444892610985,
  "configuration": {
  },
  "tags": {
    "name": "AWS IoT"
  },
  "createdTime": 1444892610985,
  "lastModifiedTime": 1444892610985
}

のように実行します(この例では、グループID は 435bc5a3-f2f8-4b33-a510-45381e478edc となります)。

Beam 設定の投入

まずはスクリプトを実行してみましょう。

$ ruby Beam_to_AWSIoT.rb
usage: Beam_to_AWSIoT.rb" key.pem cert.pem ca.pem [ group-id ]

If 'group-id' is provided, this program will set Beam config to access AWS IoT.
If 'group-id' is not provided, this program will generate JSON to use with CLI.

引数は3つないしは4つとなり、順番に 秘密鍵、証明書、CA証明書、グループIDとなります。

試しにグループID以外の引数を与えて実行してみましょう。

$ ruby Beam_to_AWSIoT.rb 84283d2378-private.pem.key \
  84283d2378-certificate.pem.crt \
  VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem
[{"key":"mqtt://beam.soracom.io:1883","value":{"name":"AWS IoT","destination":"mqtts://data.iot.ap-northeast-1.amazonaws.com:8883","enabled":true,"addSubscriberHeader":false,"useClientCert":true,"clientCerts":{"default":{"$credentialsId":"certs_1461731234"}}}}]

表示されたJSON文字列は、soracom group updategroupconfiguration コマンドの引数として使用できます。

もしグループIDを4つ目の引数として与えて実行した場合には、対象のグループに AWS IoT への接続情報を設定します。

$ ruby Beam_to_AWSIoT.rb 84283d2378-private.pem.key \
  84283d2378-certificate.pem.crt \
  VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem \
  435bc5a3-f2f8-4b33-a510-45381e478edc
[{"key":"mqtt://beam.soracom.io:1883","value":{"name":"AWS IoT","destination":"mqtts://data.iot.ap-northeast-1.amazonaws.com:8883","enabled":true,"addSubscriberHeader":false,"useClientCert":true,"clientCerts":{"default":{"key":"...","cert":"...","ca":"..."}}}}]
update group configuration to group 435bc5a3-f2f8-4b33-a510-45381e478edc
{"operatorId"=>"OP0000000000", "groupId"=>"435bc5a3-f2f8-4b33-a510-45381e478edc", "createdAt"=>1444896227569, "lastModifiedAt"=>1444896243150, "configuration"=>{"SoracomBeam"=>{"mqtt://beam.soracom.io:1883"=>{"name"=>"AWS IoT", "destination"=>"mqtts://data.iot.ap-northeast-1.amazonaws.com:8883", "enabled"=>true, "addSubscriberHeader"=>false, "useClientCert"=>true, "clientCerts"=>{"default"=>{"$credentialsId"=>"certs_1444896227"}}}}}, "tags"=>{"name"=>"AWS IoT"}, "createdTime"=>1444896227569, "lastModifiedTime"=>1444896243150}

これで Beam の設定が完了しました。

忘れずに、Air SIM を Beam の設定をおこなったグループに所属させてください。

$ soracom sim set_group --group-id=<グループID> --imsi=XXXXXXXXXXXXXXX

データ送信デモ

実際にデータを送信してみましょう。

AWS IoT ドキュメントの Verify MQTT Subscribe and Publish ページの例では、

$ mosquitto_pub --cafile rootCA.pem \
  --cert cert.pem \
  --key thing-private-key.pem \
  -h data.iot.us-east-1.amazonaws.com -p 8883 \
  -q 1 -d -t topic/test -i clientid2 -m "Hello, World"

のように証明書ファイル等を指定して送信する必要があります。

しかし、先ほど設定したグループに属する SORACOM Air SIM で接続されている Raspberry Pi からは、

pi@raspberrypi ~ $ mosquitto_pub -d -h beam.soracom.io -t beamdemo -m "Hello, World"
Received CONNACK
Sending PUBLISH (d0, q0, r0, m1, 'beamdemo', ... (12 bytes))

のように証明書を指定せずに、AWS IoTへデータ送信を行う事が可能です。

データを送信してすぐにSNS経由でメールが来ました。

AWS IoT

SNSへの通知以外にも、S3やDynamoDBへのデータ保存、Lambda Functionの実行等、様々な AWS サービスと連携出来ますので、是非お試しください。

pagetop