Amazon Web Services ブログ

AWS IoT Core と Amazon Route 53 を用いたグローバルデバイスプロビジョニングの自動化

この記事は Philipp Sacha によって投稿された Automate global device provisioning with AWS IoT Core and Amazon Route 53 を翻訳したものです。

はじめに

AWS IoT CoreAmazon Route 53 を併用することで、位置情報や遅延に基づいて AWS リージョンを選択し、デバイスが AWS IoT Core に初めて接続したときに自動的にデバイスを登録します。

読むのにかかる時間: 10分
ラーニングレベル: 300
使用されるサービス: AWS IoT Core, Amazon Route53, Amazon Certificate Manager プライベート認証機関

背景

以前のバージョンの同様のブログ記事で、AWS IoT Core、AWS Lambda、Amazon DynamoDB、Amazon API Gatewayを使用してグローバルにデバイスをプロビジョニングする方法を紹介しました。今回の新しいアプローチでは、より簡単なアーキテクチャでセットアップができるようになりました。

以前のブログ以降に、AWS IoT Core はフリートプロビジョニング(2020年4月)や設定可能なエンドポイント(2021年3月)などの新機能を発表しています。これらの機能を Amazon Route 53 のトラフィックポリシーと組み合わせることで、コードを書かかずに、デバイスをグローバルにプロビジョニングすることができます。デバイスは、以前のブログで取り上げた HTTPS のアプローチではなく、軽量の Message Queuing Telemetry Transport (MQTT) プロトコルのみを使用します。

ソリューション

AWS IoT Core でデバイスをプロビジョニングしたり、サービス通信するためには、エンドポイントが必要です。カスタムドメインで AWS IoT Core の設定可能なエンドポイントを構築することができます。このブログ記事では、FQDN(Fully Qualified Domain Name)である global.iot.example.com を使用します。セットアップを作成する際に、FQDN をご自身のものに置き換えることができます。Amazon Route 53 では、FQDNを解決するためにトラフィックベースのポリシーを作成することができ、例えば、位置情報レイテンシーベースのルーティングを使用することができます。

このブログでは、Amazon Route 53 がデバイスの場所に基づいて DNS(Domain Name System)クエリーに応答する位置情報ルーティングを使用します。このブログの例では、2つの AWS リージョンを使用しています。

  1. 欧州(アイルランド) (eu-west-1)
  2. 米国東部(バージニア北部) (us-east-1)

北米 (NA) のデバイスの場合、FQDN は us-east-1 にあるIoTエンドポイントに解決されます。eu-west-1 のエンドポイントは、北米に拠点を置いていないデバイスのデフォルトエンドポイントです。

アーキテクチャー

以下の図はプロビジョニングのワークフローを示しています。

  1. (オプショナル) ジャストインタイムプロビジョニング (JITP) を使用する場合には、両方のリージョンで AWS IoT Core に認証局 (CA) 、例えば、Amazon Certiifcate Manager プライベートCA を登録します。
  2.  IoT デバイスは、Amazon Route 53 を使用して、カスタム IoT エンドポイント global.iot.example.com を解決します。DNS ルックアップは、デバイスの場所に応じて、両方のリージョンのいずれかから IoT エンドポイントを返します。
  3. IoTデバイスは、DNS から受け取った AWS IoT Core エンドポイントに接続します。その後、デバイスはそのAWSリージョンに自動的に登録されます

カスタムドメインの作成

AWS IoT Core 開発者ガイドに記載されているように、2つのリージョンに対して独自のカスタムドメインを作成します。両方のリージョンで、AWS Certificate Manager(ACM)にサーバー証明書を登録する必要があります。サーバー証明書を登録した後、両方のリージョンで AWS IoT Core のカスタムドメインを作成します。

Amazon Route 53 位置情報の設定

このブログでは、ドメイン example.com が Amazon Route 53 によってパブリックホストゾーンとして提供されていることを想定しています。ドメイン example.com は、このブログのサンプルドメイン名です。お使いの環境を設定するには、example.com をお使いのドメインに置き換えてください。DNS レコードは、AWS IoT エンドポイントを指す CNAME として作成されます。以下のコマンドを使用して、AWS IoT エンドポイントを取得します。

us-east-1リージョンの場合:aws iot describe-endpoint --endpoint-type iot:Data-ATS --region us-east-1

eu-west-1リージョンの場合:aws iot describe-endpoint --endpoint-type iot:Data-ATS --region eu-west-1

位置情報に応じて IoT エンドポイントを解決する DNS 位置情報ベースのレコードを Amazon Route 53 に作成するには、以下を行います。

  1. Amazon Route 53のコンソールに移動します。
  2. 左のメニューで、ホストゾーンを選択します。
  3. ホストゾーンで example.com を選択し、レコードを作成を選択します。
  4. レコード名に、global.iot を入力します。
  5. レコードタイプCNAME を選択します。
  6. に、us-east-1 の AWS IoT Core エンドポイント (123456aaaaaa-ats.iot.us-east-1.amazonaws.com のような値です)を入力します。
  7. ルーティングポリシー位置情報を選択します。
  8. 場所北米を選択します。
  9. レコード IDUS East IoT Global Endpoint と入力します。
  10. 別のレコードを追加をクリックします。
  11. レコード名に、global.iot を入力します。
  12. レコードタイプCNAME を選択します。
  13. に、eu-west-1 の AWS IoT Core エンドポイント (123456aaaaaa-ats.iot.eu-west-1.amazonaws.com のような値です)を入力します。
  14. ルーティングポリシー位置情報を選択します。
  15. 場所デフォルトを選択します。
  16. レコード IDDefault IoT Global Endpoint と入力します。
  17. レコードを作成をクリックします。
  18. レコードが作成されると、「 example.com のレコードが正常に作成されました」というメッセージが表示されます。

IoT エンドポイントが想定通りに解決されているか確認するために、Amazon Route 53 コンソールのチェックツールや host, dig, nslookup などのシステム上のツールを異なる位置情報で使用することができます。FQDN global.iot.example.com をどの場所で解決するかによって、北米にいる場合は us-east-1 のエンドポイントに解決し、それ以外の場合は eu-west-1 のエンドポイントに解決される必要があります。

Amazon Route 53 チェックツールを使用する場合、ルックアップを実行したい場所から Resolver IP アドレスを入力します。AWS General Reference から AWSリージョンの IP アドレス範囲の例を取得することができます。

また、AWS CloudShell を使用して、FQDN global.iot.example.com があなたのいる場所に基づいて解決されるかどうかをテストすることができます。例として、us-west-2eu-central-1 で AWS CloudShell を開いてください。

両方の AWS CloudShell 環境に bind-utils パッケージをインストールします。

sudo yum -y install bind-utils

us-west-2 リージョンの AWS CloudShell で global.iot.example.com を解決すると、us-east-1 のIoTエンドポイントに解決されます。eu-central-1 の AWS CloudShell では、eu-west-1 の IoT エンドポイントに解決されます。DNS ルックアップの出力は、以下の例のようになります。

us-west-2 の AWS CloudShell:

$ host global.iot.example.com
global.iot.example.com is an alias for 123456aaaaaaaa-ats.iot.us-east-1.amazonaws.com.
123456aaaaaaaa-ats.iot.us-east-1.amazonaws.com has address 18.213.191.210
123456aaaaaaaa-ats.iot.us-east-1.amazonaws.com has address 34.199.197.35
123456aaaaaaaa-ats.iot.us-east-1.amazonaws.com has IPv6 address 2406:da00:ff00::2cc1:6e4b
123456aaaaaaaa-ats.iot.us-east-1.amazonaws.com has IPv6 address 2406:da00:ff00::3403:e3c

eu-central-1 の AWS CloudShell:

$ host global.iot.example.com 
global.iot.example.com is an alias for 123456aaaaaaaa-ats.iot.eu-west-1.amazonaws.com.
123456aaaaaaaa-ats.iot.eu-west-1.amazonaws.com has address 34.246.55.152
123456aaaaaaaa-ats.iot.eu-west-1.amazonaws.com has address 52.214.209.63
123456aaaaaaaa-ats.iot.eu-west-1.amazonaws.com has IPv6 address 2a01:578:3::34d6:9eb8
123456aaaaaaaa-ats.iot.eu-west-1.amazonaws.com has IPv6 address 2a01:578:3::22f3:3c77

プロビジョニング

AWS IoT Core は、デバイスをプロビジョニングするための様々なオプションを提供します。デバイスを事前にプロビジョニングすることも、デバイスが IoT エンドポイントに初めて接続するときにジャストインタイムでプロビジョニングすることも可能です。グローバルデバイスプロビジョニングとデバイスの事前登録を併用する場合、デバイスが接続する可能性のあるすべてのリージョンでデバイスリソースを作成する必要があります。

デバイスがオンラインになったときだけプロビジョニングを行い、デバイスが動作する地域でのみプロビジョニングを行いたい場合は、ジャストインタイムプロビジョニングを使用することができます。このブログ記事では、フリートプロビジョニングとジャストインタイムプロビジョニング (JITP) という2つのプロビジョニングアプローチについて説明します。フリーとプロビジョニングではデバイスが初めて AWS に接続する際にデバイス証明書と秘密鍵を生成してデバイスに保存することができます。一方、ジャストインタイムプロビジョニング (JITP) では、初回接続時にデバイスから証明書を送付し、プロビジョニングテンプレートにより証明書の登録、ポリシーの作成が行われます。

プロビジョニングプロセスを体験するために、AWS IoT Device Management ワークショップのフリートプロビジョニングとジャストインタイムプロビジョニング (JITP) の演習を使用することができます。2つのワークショップ環境を1つは米国リージョン、もう1つは米国以外のリージョンで起動し、グローバル IoT エンドポイントでのプロビジョニングシナリオをテストすることができます。

フリートプロビジョニングをセットアップ

AWS IoT のフリートプロビジョニングでは、デバイスが初めて AWS IoT に接続する際に、デバイス証明書と秘密鍵を生成して安全に配布することができます。このブログでは、クレームによるプロビジョニングの方法について説明します。各デバイスは、同じクレーム証明書と秘密鍵を保存することができます。デバイスが AWS IoT Core に初めて接続すると、プロビジョニングが行われ、個別のキーと証明書を受け取ることができます。

複数のリージョンで同じクレーム証明書を使用するには、RegisterCertificateWithoutCA Application Programming Interface (API) を使用します。この API を使用すると、認証局(CA)なしでクレーム証明書を登録できます。ファイル provision-claim.certificate.pem にクレーム証明書を追加すると、以下の AWS Command Line Interface (AWS CLI) コマンドを使用して、両方のリージョンで証明書を登録することができます。

eu-west-1:

aws iot register-certificate-without-ca \
    --certificate-pem \
    file://provision-claim.certificate.pem \
    --region eu-west-1

us-east-1:

aws iot register-certificate-without-ca \
    --certificate-pem \
    file://provision-claim.certificate.pem \
    --region us-east-1

ワークショップでのインストラクションとの相違点

  • 両方のリージョンでクレーム証明書を登録する。
  • 両方のリージョンでモノのグループプロビジョニングテンプレートIoT ポリシーのリソースを作成する。IoT ポリシーは AWS リージョンを含むので、ポリシーを作成する際に、AWS リージョンを作成しているリージョンに置き換える。
  • fleetprovisioning.py のコマンドでフリートプロビジョニングを開始する際に、$IOT_ENDPOINT をグローバル IoT エンドポイントに置き換える。このブログでは global.iot.example.com

演習のステップを実行後、IoT デバイスはデバイスの位置情報に従って AWS IoT Core に自動的に登録されます。

ジャストインタイムプロビジョニング (JITP) を使用する

デバイスが初めて AWS IoT に接続しようとするときに、JITP を使用してデバイスを登録することができます。JITP を使用するには、独自の認証局を用意し、AWS IoT Core に登録する必要があります。その後、認証局の自動登録を有効にし、プロビジョニングテンプレートを関連付ける必要があります。

両方のリージョンで CA を登録する必要があります。デバイスには、接続リージョンに関係なく、ご自身の CA から発行された1つのデバイス証明書が保存されます。

ワークショップでのインストラクションとの相違点

  • CA は 1 つだけ必要で、どのグローバルプロビジョニングリージョンにおいても使用されていないものである必要がある。
  • 両方のグローバルリージョンで CA を登録する。
  • 両方のリージョンの CA の JITP を有効化する。
  • AWS IoT Core に mosquitto_pub コマンドで接続する際、$IOT_ENDPOINT をグローバル IoT エンドポイントに置き換える。このブログでは global.iot.example.com

演習のステップを実行後、IoT デバイスはデバイスの位置情報に従って AWS IoT Core に自動的に登録されます。

まとめ

この投稿では、Amazon Route 53 トラフィックポリシー、AWS IoT Core 設定可能なエンドポイント、自動プロビジョニングオプションを使用して、IoT デバイスをグローバルにプロビジョニングする方法を学びました。このアプローチは、2つの AWS リージョンに限定されるものではなく、ユースケースに基づいてより多くのリージョンを使用することができます。Amazon Router 53 で位置情報ベースのルーティングを使用するか、他のトラフィックポリシーを使用するかを選択することができます。この投稿で説明したアーキテクチャを使用すると、ジャストインタイムデバイス登録の実装時間を短縮し、IoT ソリューションの市場投入までの時間を短縮することができます。詳しくは、AWS IoT 製品ページまたは AWS IoT Device Management ワークショップを参照してください。

執筆者について

Philipp Sacha は、Amazon Web Services の IoT 分野のスペシャリストソリューションアーキテクトとして、IoT分野のお客様をサポートしています。2015年にソリューションアーキテクトとしてAWSに入社し、2018年から IoT のスペシャリストとして従事しています。

この記事はプロフェッショナルサービス本部 IoT コンサルタントの小林が翻訳しました。