masato-ka's diary

日々思ったこととか、やったことの備忘録。

SORACOM BeamにGoogle Cloud IoT Coreへの接続設定をソラコムのAPI経由で設定する。

この記事について

この記事ではSORACOM APIを使って Google Cloud IoT Coreへの接続設定を行う方法を記載します。前回の記事ではSORACOMの管理画面からSORACOM Beamの設定を行い、Cloud IoT Coreへの接続設定を行いましたが今回はソラコムが提供するWEB APIを利用して設定を行ってみます。基本的にAPIを叩くだけですが、SORACOM BeamのCloud IoT Core向け設定をAPIで実効する方法など公式ドキュメント化されていない箇所があるので備忘録的に記載しています。

APIで接続設定する利点

前回の記事にも記載しましたが、SORACOM BeamからCloud IoT Coreへ接続する場合、Cloud IoT Coreに登録したデバイスとSORACOM Beamの設定は一対一の関係にする必要があります。これはCloud IoT Coreではデバイスが個別の証明書(秘密鍵)を持つのに対して、SORACOM Beamの仕様では1設定ごと(=1グループ)に証明書を1つしか設定できないことが理由です。そのため、複数のデバイスを接続するためにはデバイス(=SORACOM Air SIM)ごとにグループを作成し、SORACOM Beamの設定を行う必要があります。

f:id:masato-ka:20180623131229p:plain
GCPのデバイス設定とSORACOM Beam設定は一対一

複数の設定をSORACOM のユーザコンソールから設定するのは煩雑ですが、SORACOM Beamの設定はSORACOM APIから設定することができるため、APIでグループの作成と、SORACOM Beamの設定をすることで煩雑さから解放されます。この方法がわかればCloud IoT Coreの設定と合わせて管理ツールを作ることもできます。

APIからの設定

 ソラコムの提供するサービスは全てAPI経由で設定を行うことができます。当然Beamの設定についてもAPIから設定を行うことができます。今回はAPIのクライアントとしてCURLコマンドを利用します。その他のクライアントを使う場合は適宜よみかえを行ってください。soracom-cliAPI のSwaggerドキュメント、各言語のAPIクライアントライブラリが存在しています。現在のバージョンでは証明書の登録ができませんが、私が開発しているVisual Studio CodeのExtentionも利用できます。

 Cloud IoT Coreの設定やデバイスの登録、証明書の発行については以下の過去記事を参考にしてください。

masato-ka.hatenablog.com

なお以降のサンプルでは「//」をコメントとして扱っています。必要に応じて取り除いてください。

証明書の登録

まずはじめにCloud IoT Coreに接続するための認証情報を登録します。あらかじめ、Cloud IoT Coreにデバイスを登録する際に設定した公開鍵のついとなる秘密鍵を用意しておきます。以下のリクエスト送ることで、credential-device01と言うcredentialIDを持つ認証情報を作成することができます。

curl -X POST --header 'Content-Type: application/json;charset=UTF-8' --header 'Accept: application/json' \
--header 'X-Soracom-API-Key: API KEY' \
--header 'X-Soracom-Token: APIのトークン' \
-d '  {
    "description": "api-registry", //(1)
    "type": "googleIoT-credentials", //(2)
    "credentials": {//(3)
      "projectId": "careful-maxim-150804", 
      "region": "us-central1", 
      "registryId": "my-registry", 
      "deviceId": "newcamer", 
      "algorithm": "RS256", 
      "privateKey":"-----BEGIN RSA PRIVATE KEY-----\n..."(4)
    }
}' 'https://api.soracom.io/v1/credentials/credential-device01' //(5)
  • (1) 認証情報の概要を記載しておきます。
  • (2) type要素にCloud IoT Coreの認証情報であることを指定しておきます。
  • (3) credentials要素内ではCloud IoT Coreへの接続情報を入れます。Userコンソール画面を参考に入力します。先述の過去記事を参考にしてください。
  • (4) privateKeyにはpem形式の秘密鍵を設定します。この際、改行を「\n」に置き換えて1行の文字列として貼り付けてください。
  • (5) 認証情報のIDはAPIのパスバリューとして私ます。上記の例ではURL末尾のcredential-device01がcredentialIDとなります。任意の値を指定してください。デバイスごとに認証情報を使う必要があるため、「credential-デバイスID」など命名規則を決めておくと良いでしょう。

credentialIDは次のSORACOM Beamの設定で利用するため書き留めておきましょう。

SORACOM Beamの設定

SORACOM Beamの設定はSIMグループに対して設定します。また、SORACOM BeamからCloud IoT Coreへ接続する場合は前述の通り、1デバイスにつき、1グループが必要になります。そこで、API/groups エンドポイントに対して以下のリクエストを投げ、SIMグループの作成とSORACOM Beamの設定を行います。リクエストに成功した場合、レスポンスボディにgroupIdが含まれていますので書き留めておきましょう。SIMをグループに追加する際に利用します。

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' \
--header 'X-Soracom-API-Key: APIキー' \
--header 'X-Soracom-Token: APIトークン' \
-d ' {
    "configuration": {
      "SoracomBeam": {
        "mqtt://beam.soracom.io:1883": {
          "enabled": true,
          "name": "IoTCore",// (1)任意の設定名を追加する。
          "addEquipmentHeader": false,
          "addSignature": false,
          "addSubscriberHeader": false,
          "customHeaders": {},
          "skipStatusCode": false,
          "useClientCert": false,
          "useGoogleIoT": true,
          "googleIoTCredential": {
            "$credentialsId": "credential-device01" //(2)証明書の登録で登録した認証情報を指定する。
          },
          "addDeviceIdHeader": false,
          "destination": "mqtts://mqtt.googleapis.com:8883"//(3)Cloud IoT Coreの設定
        }
      }
    },
    "tags": {
      "name": "IoTCore2" //(4) グループ名固有の名前になるよう、デバイス名などを指定しておく。
    }
  }' 'https://api.soracom.io/v1/groups'

グループに対する設定はconfigurationセクションで行われます。また、SORACOM Beamへの設定はその中のSoracomBeamネームスペースに設定を記載します。各設定の要点を以下にまとめています。

  • (1) SORACOM Beamの設定名、任意の名前を指定可能。
  • (2) 「証明書の登録セクションで設定した認証情報を指定する。」
  • (3) Cloud IoT Coreのエンドポイントの設定 固定値になります。
  • (4) グループ名、どのデバイスの設定かわかりやすくするため、デバイス名+Groupなど命名規則を決めておくといいと思います。

なお、SORACOM Technology Camp の際に質問し回答をいただいた範囲ではグループ作成の上限数は決まっていないとのことです。

GroupへSIMを追加する。

以下のリクエストでSIMをグループに追加します。

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' \
--header 'X-Soracom-API-Key: APIキー' \
--header 'X-Soracom-Token: APIトークン' \
-d '{
  "groupId": "グループ作成時に取得した値",
}' 'https://api.soracom.io/v1/subscribers/{imsi}/set_group'

groupIdを記録し忘れた場合は以下のAPIを実効することでグループの情報を再度確認することができます。このリクエストは/v1/groupsのエンドポイントにリクエストパラメータでタグ名とその値のクエリを渡して検索しています。SORACOM Beamの設定でリクエストとして送ったJSON(4)の要素を指定しています。もしグループのタグ情報としてnameを指定していない場合は適宜グループの検索条件を指定してください。また、リクエストパラメータを設定しない場合は全てのグループを取得することが可能です。

https://api.soracom.io/v1/groups?tag_name=name&tag_value=IoTCore&tag_value_match_mode=exact

以上で設定は完了となります。追加したSIMを使いSORACOM BeamのMQTTエンドポイントmqtt://beam.soracom.io:1883へpub-subすることでCloud IoT Coreにメッセージが送れるようになります。

まとめ

 今回はSORACOM Beamの設定のみでしたが、Google Cloud IoT Coreへのデバイス追加を行うGCPAPIと組み合わせればデバイス追加を行うための管理サービスを作ることができます。実際に運用するためには証明書の管理などポイントがあると思いますが、小規模なデバイスを管理するのであればこの方法で十分ではないでしょうか。証明書自身はサーバ側で作り、ファイルに保存することなく、SORACOMとGCPの証明書管理サービスに投げ込めばセキュアに実現できるでしょうか。