GCP(Google Cloud Platform)のIoT Coreサービスが2023年8月16日に終了するとアナウンスされました。1年間の猶予期間中に移行先を検討する必要があります。今回、AWSへの移行が可能か検証してみました。
前提条件
Google Cloud IoT Coreへの接続は以下の状態で行うものとします。
自己署名 X.509 証明書付きの RSA 鍵を生成する。(参考 公開鍵 / 秘密鍵のペアの作成)
以下の環境変数を使用する。
項目名 | 内容 |
---|---|
ENDPOINT | IoT Core接続先エンドポイント(mqtt.googleapis.com) |
PORT | IoT Core接続先ポート番号(8883) |
PROJECT_ID | GCPのプロジェクトID |
REGION | GCPのリージョン(us-central1) |
IOT_REGISTRY_ID | IoT Coreに作成したレジストリID |
IOT_DEVICE_ID | IoT Coreに作成したデバイスID |
MQTT_USERNAME | MQTT接続時のユーザー名(unused ) |
MQTT_PASSWORD | MQTT接続時のパスワード (参考 JSON Web Token(JWT)の使用) |
CA_FILE | MQTT サーバー証明書(roots.pem) |
CERT_FILE | 自己署名 X.509 証明書(rsa_cert.pem) |
KEY_FILE | RSA 秘密鍵(rsa_private.pem) |
SDK(Software Development Kit)を使用するとAWSとの差が分かりづらいため、mosquitto_pubを使用して検証します。 Google Cloud IoT CoreへPublishするコードはこちらです。
mosquitto_pub -h ${ENDPOINT} -p ${PORT} \
-u ${MQTT_USERNAME} -P ${MQTT_PASSWORD} \
-t /devices/${IOT_DEVICE_ID}/events \
-i projects/${PROJECT_ID}/locations/${REGION}/registries/${IOT_REGISTRY_ID}/devices/${IOT_DEVICE_ID} \
-m "{'message': 'Hello, World'}" \
-q 1 \
--cafile ${CA_FILE} \
--cert ${CERT_FILE} \
--key ${KEY_FILE}
それぞれのパラメータは以下の通りです。
パラメーター | 説明 |
---|---|
-h | 接続先エンドポイント |
-p | 接続先ポート番号 |
-u | ユーザー名 |
-P | パスワード |
-t | トピック名 |
-i | クライアントID |
-m | メッセージ |
-q | QoS |
–cafile | サーバー証明書 |
–cert | X.509 証明書 |
–key | 秘密鍵 |
Google Cloud IoT Coreへの接続環境を、AWS IoT Coreへ接続するための環境に変更していきます。
証明書の移行
AWSもGCPと同じくX.509証明書を使用して接続します。AWS IoT Coreで使用できる証明書は2つです。
- AWS IoT Coreで作成した証明書
- 独自CA(Certificate Authority)で発行した証明書
Google Cloud IoT CoreからAWS IoT Coreへの移行の場合は、独自CAで発行した証明書を使用します。独自CAで発行した証明書を使用するには、ルートCAをAWS IoT Coreに登録する方法と登録しない方法があります。今回は登録しない方法で検証します。
AWS IoT Coreへ登録
AWSのマネジメントコンソールでAWS IoTの管理画面を開き、[管理] -> [セキュリティ] -> [証明書]を選択。画面が表示されたら[証明書を追加]をクリックし、[証明書を登録]をクリックします。
アップロードする証明書として[CA が AWS IoT に登録されていません]を選択し、証明書(rsa_cert.pem)をアップロードします。
アップロード後、表示される証明書にチェックを入れ、[有効化]をクリックします。
その後、[登録]をクリックします。
これで証明書が登録できました。
AWS IoT Coreのポリシーとモノの作成、証明書へのアタッチ
次に、接続テストを行う環境を整えます。
IoTポリシーの作成
[管理] -> [セキュリティ] -> [AWS IoTポリシー]を選択し、AWSポリシーの画面で[ポリシーを作成]をクリックします。 [ポリシーのプロパティ]でポリシー名を設定します。今回は、"device001-policy"としました。[ポリシードキュメント]は以下の通りに入力します。
ポリシー効果 | ポリシーアクション | ポリシーリソース |
---|---|---|
Allow | iot:Connect | arn:aws:iot:ap-northeast-1:[AWSアカウントID]:client/${iot:Connection.Thing.ThingName} |
Allow | iot:Publish | arn:aws:iot:ap-northeast-1:[AWSアカウントID]:topic/* |
Allow | iot:Publish | arn:aws:iot:ap-northeast-1:[AWSアカウントID]:topicfilter/* |
※クライアントIDがモノの名前と一致する場合のみ接続を許可。
PublishとSubscribeは任意のトピックを許可
[作成]をクリックします。
これでIoTポリシーの作成は完了です。
モノの作成
[管理] -> [すべてのデバイス] -> [モノ]を選択し、モノの画面で[モノを作成]をクリックします。 [1 つのモノを作成]を選択し、[次へ]をクリックします。「モノのプロパティを設定」の画面で、モノの名前を設定します。
先ほどのIoTポリシーの作成で、クライアントIDがモノの名前と一致するときだけ接続許可と設定したので、モノの名前がクライアントIDとして使用されます。
Google Cloud IoT Coreでは、命名規則によってクライアントIDに必ず"/"が含まれますが、AWS IoT Coreでは"/"をモノの名前に使用することができません。そのため、移行にあたっては クライアントIDを変更する 必要があります。
AWS IoT Coreの命名規則に合ったモノの名前(今回は"device-001")を入力し、[次へ]をクリックします。
既に登録済の証明書を使用するため、[今回の証明書の作成をスキップ]を選択し、[モノを作成]をクリックします。
これでモノの作成は完了です。
証明書にポリシーとモノをアタッチ
[管理] -> [セキュリティ] -> [証明書]を選択し、登録済の証明書を選択します。デフォルトでは作成日時の降順でソートされますので、先ほど登録した証明書は一番上に表示されているはずです。
画面下部の[ポリシー]タブを選択し、[ポリシーをアタッチ]をクリックします。
作成したポリシー"devide001-polucy"を選択し、[ポリシーをアタッチ]をクリックします。
続いて、[モノ]タブを選択し、[モノにアタッチする]をクリックします。作成したモノ"devide-001"を選択し、[モノにアタッチする]をクリックします。
以上で設定は完了です。
動作確認
続いて、動作確認を行います。
以下の環境変数を使用し接続します。
項目名 | 内容 |
---|---|
ENDPOINT | IoT Core接続先エンドポイント (xxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com) |
PORT | IoT Core接続先ポート番号(8883) |
PROJECT_ID | IoT Coreに作成したデバイスID |
CA_FILE | MQTT サーバー証明書(AmazonRootCA1.pem) |
CERT_FILE | 自己署名 X.509 証明書(rsa_cert.pem) |
KEY_FILE | RSA 秘密鍵(rsa_private.pem) |
Google Cloud IoT Core へのPublishと同様に、mosquitto_pubを使用してAWS IoT CoreにPublishできることを確認します。
mosquitto_pub -h ${ENDPOINT} -p ${PORT} \
-t /devices/${IOT_DEVICE_ID}/events \
-i ${IOT_DEVICE_ID} \
-m "{'message': 'Hello, World'}" \
-q 1 \
--cafile ${CA_FILE} \
--cert ${CERT_FILE} \
--key ${KEY_FILE}
• Google Cloud IoT Core への接続時との相違点
- ENDPOINTの値(GCPのエンドポイントをAWSのエンドポイントへ変更)
- クライアントID(AWS IoTのデバイスIDに"/"が使えない)
- CA証明書(接続先をGCPからAWSへ変更)
これだけ変更すれば接続できました。
(ユーザー名やパスワードは、AWSへの接続には不要ですが、指定していても接続は可能でした)
まとめ
Google Cloud IoT CoreからAWS IoT Coreへの移行を検証しました。意外と少ない変更で接続できたと感じています。
移行が必要ないのが一番良いですが、万が一の場合に移行がしやすいかどうか(移植性)もサービス選定のポイントになるのではないかと感じました。今回は業界標準のプロトコル(MQTT)、方法(X.509 証明書)を採用していたため、移行もしやすかったです。
IoTシステムはIoT Coreだけで成り立っているわけではありません。後続のサービスも移行を検討する必要があります。また、IoTは息の長いサービスになりますので、持続可能なインフラ基盤と併せて運用保守がとても重要になります。
Google Cloud IoT Coreから AWSへの移行をご検討される際は、移行支援だけでなく長期の運用保守が提供できる弊社へ是非ともご連絡ください。
富士ソフトのAWS関連サービスについて、詳しくはこちら
アマゾンウェブサービス(AWS)
IoTプラットフォーム on AWS について、詳しくはこちら
IoTプラットフォーム on AWS
IoT運用支援サービス について、詳しくはこちら
IoT運用支援サービス