MENU

Soracom

Users

AWS IoT と接続する (Rubyスクリプト版)

はじめに

本記事では、2015 年 10 月の AWS のカンファレンス Re:invent で発表された AWS IoT を利用する際、IoT デバイスから AWS IoT にデータ送信を行うために SORACOM Beam を活用する方法をご説明いたします。

AWS IoT Core と接続する方法としては SORACOM Beam の他、 SORACOM Funnel をご利用いただくことで、より簡単に実装できます。併せてご検討ください。

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

AWS IoT とは

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

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

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

  • MQTTS : X.509 証明書を使用した TLS(Transport Layer Security) のクライアント認証
  • HTTPS : IAM ユーザーやロール・Cognito を利用した認証

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

ステップ 1: 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

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

準備

証明書ファイルの用意

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

  • (ランダム文字列)-certificate.pem.crt
  • (ランダム文字列)-private.pem.key

と、

を用意します。

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 スクリプトの準備

下記のスクリプトを Beam_to_AWSIoT.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 update_group_configuration コマンドの引数として使用できます。

もしグループ 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 の設定が完了しました。

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

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

ステップ 3: データを送信する

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

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 IoT 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 サービスと連携できますので、是非お試しください。