Amazon Web Services ブログ

自動車向け iOS アプリを AWS IoT Core に接続して認証する

はじめに

自動車アプリケーションをクラウドに接続して IoT (モノのインターネット)データを交換することで、自動車に多くの利点をもたらすことができます。安全に認証を行なった接続は、リアルタイムの診断や予防保全のためにクラウドに継続的な遠隔計測データを送信して車両の監視を行う OEM メーカーにとって不可欠です。ソフトウェア、インフォテイメント、マップなどの車載ナビゲーションサービスへの OTA アップデートを OEM が提供できると、車両を修理工場に持って来てもらわなくとも最新の状態に保つのに役立ちます。さらに、クラウドからリアルタイムの交通渋滞や駐車情報などのナビゲーションデータにアクセスすることで、利用者は最適な経路を選択でき、より良い運転体験を得られます。したがって、車載アプリとクラウド間で安全にデータを交換するメカニズムを持つことが、利用者と自動車 OEM の両方にとって重要です。

概要

このブログでは、IoT デバイスからデータを送受信するために、iOS アプリを AWS IoT Core に安全に接続する方法を紹介します。AWS IoT での認証方法はさまざまで、AWSMobileClient と統合された AWS Cognito ユーザープールの利用や、 X.509 証明書の使用などが可能です。しかし、グローバルに展開されたユーザー数が多数になるアプリケーションの場合、これらの認証方式では現実的ではなくなる可能性があります。Cognito ユーザープールではユーザー毎のプロビジョニングが必要になるため、スケーラビリティの問題が生じるかもしれません。一方、X.509 証明書の場合は、大規模な環境でキーの配布と更新が課題となります。したがって、グローバルなアプリデプロイのためには、他の大規模展開に適した認証方式を評価する必要があります。

従来、車両モジュールでは Bluetooth Low Energy (BLE) を使用してモバイルアプリにテレメトリデータを送信していました。ここから、テレメトリデータの分析のためにクラウドハイパースケーラーに安全に接続する必要があります。これは、AWS IoT SDK for iOS を使用して実現できます。この SDK には、iOS アプリから AWS IoT Core と簡単に対話できるようサポートするライブラリセットが含まれています。このブログでは、MQTT over WebSocket プロトコルを使って iOS アプリを AWS IoT に接続する方法について説明します。これにより、ユーザーはアプリを配布する際に個別の X.509 証明書を発行する必要がなくなります。

AWS IoT Core は、自動車業界の顧客が IoT アプリケーションの開発と管理で幅広く利用されている、多機能で強力なサービスです。AWS IoT Core には、自動車業界の顧客に次のことを支援する機能がいくつかあります。1/ AWS IoT Jobs を使用した車両向けの Over-The-Air ファームウェアやソフトウェアのアップデート、2/ 車両の診断データの収集と分析、3/ 接続された車両、アプリケーション、顧客のデータを保護するための認証と認可機能。Amazon Cognito Identity Pools は、モバイルや Web アプリケーションが特定の AWS リソースにアクセスするためのゲストユーザーアクセスを提供することを目的としています。これにより、非認証ユーザーに限定的なアクセスを許可できます。具体的に、Cognito Identity Pools は、アプリケーションがユーザー認証を必要とせずに、許可されたリソースに事前に定義された権限でアクセスできるように一時的な AWS 認証情報を取得できるようにすることで、ゲストアクセスをサポートしています。このようなゲストアクセスに、顧客が実装するボット検出などの制御を組み合わせることで、より機密性の高いデータや機能へのアクセスは制限しつつ、アプリケーションの一部をログインしていないゲストでも利用できるようになります。全体として、ゲストユーザーアクセスは Identity Pools の重要な機能であり、アプリケーションのアクセシビリティとセキュリティを両立させるのに役立ちます。

前提条件

ブログで説明する認証ソリューションの前提条件は以下の通りです。

  • 動作する iOS アプリケーション
  • Amazon Cognito および AWS IoT Core の基本的な知識
  • Amazon Cognito で作成されたユーザープール

ソリューション概要

Figure 1 – High level architecture for authenticating and connecting iOS app to AWS IoT Services図 1 – iOS アプリを AWS IoT サービスに認証および接続するためのハイレベルアーキテクチャ

手順

Amazon Cognito ユーザープールの初期設定については、新しいユーザープールを作成するのステップ 7 までを参照してください。ユーザープールを作成したら、以下の手順に従って iOS アプリケーションを統合できます。

ステップ 1: アプリを Amazon Cognito に統合する

1.1 ユーザープールの名前 (図 2 を参照)

セットアップガイドで作成したユーザープールを参照してください。このブログ記事では example-user-pool を使用します。

Figure 2 Integrate the app to previously created user pool図 2: 作成したユーザープールにアプリを統合

1.2 ホストされた認証ページ (図 3 参照)

ユーザー登録/ログインフローには、Cognito が提供する UI と OAuth 2.0 サーバーを使用できます。この機能を有効にすると、Cognito が提供する UI と OAuth 2.0 エンドポイントのドメインを構成できるドメインペインが表示されます。

このシナリオでは、独自のカスタムフロントエンド UI を使用するため、チェックボックスを選択を外した状態のままにします。この項目は、ユーザープール名のテキストボックスの下にあります。下図を参照してください。

Figure 3 Hosted Authentication pages図 3: ホストされた認証ページ

1.3 初期アプリクライアント (図 4 を参照)

OAuth 2.0 標準では、Public と Confidential の 2 種類のクライアントタイプが定義されています。アプリのクライアントに最適な設定は、作成するアプリの種類によって異なります。Public client または Confidential client のデフォルト設定を選択できます。あるいは、必要に応じて設定をカスタマイズすることもできます。
この例では、「Public client」を利用します。

アプリクライアント名には、example-app-client を利用します。

クライアントシークレットについては、この例のアプリケーションでは認証を使用する必要がないため、デフォルトの Don’t generate a client secret オプションを選択したままにします。

Figure 4 Initial app client図 4: app clientの設定

次のデプロイステップに進む準備ができたら、Next を選択してください。

ステップ 2: レビューと作成

選択内容を確認し、すべて正しければ (図 5 を参照)、ページの下部にある Create user pool を選択します。

Figure 5 Review ; Create User pool

図 5: ユーザープールの確認と作成

Amazon Cognito の ユーザープールページ内で、作成したユーザープールを確認できます(図 6 を参照)

Figure 6 User pool 6: User pool

注意: ユーザープールの作成後は、「user pool ID」と「app Client ID」を次のセクションのステップ 2 で利用するために保存してください。ID の見つけ方については、この資料を参照してください。

AWS IoT との iOS 統合

次のステップは、テレメトリデータを送信するために iOS アプリを AWS IoT に接続することです。このサンプルでは、Xcode v15.1 で Swift プログラミング言語 (v5.9.2) を使用して、AWS SDK for iOS で AWS IoT に接続します。

Step 1: 開発 IDE に AWS IoT モジュールをインストールする

iOS プロジェクトに AWS IoT フレームワークを追加するには、CocoaPods を利用するか、AWS IoT モジュールを手動でインストールしてください。
これで、AWS IoT に接続するためのクライアントライブラリが追加されます。
関数ヘッダに import 文を追加してください。

Import AWSIoT

Step 2: AWS 認証情報を Amazon Cognito Identity PoolAWSIoTDataManagerを使用して初期化する

  1. AWS Cognito で Identity Poolを作成し、pool ID を取得します。
    1. Amazon Cognito コンソールで、左側のパネルから Identity pools を選択し、Create identity pool を選びます。
    2. 認証済みアクセスのボックスをチェックしてください。
    3. Authentication providerの項目を開き、Cognito タブを選択して進んでください。
    4. Create a new IAM roleを選択してください。注記: 初期の最小限の許可と identity poolとの信頼関係を持つIAM ロールを作成します。ID プールを作成した後、IAM コンソールで許可を追加します。
    5. 前の手順で作成した ユーザープール IDアプリケーションクライアント ID を入力してください。
    6. Identity プール名testpool と入力し、次へ をクリックしてください。
    7. Create Identity Pool を選択します。
    8. Edit identity pool を選択します。ID プールの ID を控えてください (例: us-east-1:xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx)。
  2. AWS Mobile SDK の CognitoCredentialsProvider クラスを使用して、認証情報プールから AWS の認証情報を取得します。
let session = try await Amplify.Auth.fetchAuthSession()
 if let identityProvider = session as ? AuthCognitoIdentityProvider {
    let identityId = try identityProvider.getIdentityId().get()
    print("Identity ID: \(identityId)")
}

Step 3: AWS IoT で認証するためのクライアント ID の取得

  1. AWS IoT にクライアントを識別するための一意のクライアント ID を生成します。
  2. これは、getIdentityId() メソッドを使用して AWSCredentialsProvider オブジェクトから取得できます。

Step 4: 前のステップで取得した認証情報を使用して AWSIoTDataManager のインスタンスを作成します。このマネージャーが MQTT 接続を処理します。

let iotEndPoint = AWSEndpoint(
 urlString: "wss://a123456789012-ats.iot.us-west-2.amazonaws.com/mqtt"
)

 let iotDataConfiguration = AWSServiceConfiguration(
 region: AWSRegionType.uswest2,
 endpoint: iotEndPoint,
 credentialsProvider: CredentialsProxy()
)

 AWSIoTDataManager.register(with: iotDataConfiguration !, forKey: "MyAWSIoTDataManager")

 let iotDataManager = AWSIoTDataManager(forKey: "MyAWSIoTDataManager")

Step 5: WebSocket を使用して AWS IoTにMQTT 接続を作成

  1. AWSIoTDataManager を使用して、AWS IoT プラットフォームエンドポイントへの WebSocket 接続を作成します。
  2. エンドポイントは、利用している AWS リージョンに依存します。たとえば、xxxxxxxxxx-ats.iot.us-east-1.amazonaws.com
    1. エンドポイント情報は IoT Core コンソールの設定ページから取得できます (図 7 を参照)。

Figure 7 Device Data Endpoint Location in IoT Console図 7: IoT コンソールのデバイスデータエンドポイントの位置

AWS IoT のパブリッシュとサブスクライブ機能を利用するには、AWS IoT コンソールで必要な IAM ポリシーを作成し、Amazon Cognito Identity にアタッチする必要があります。次の手順を参照してください。

  1. IoT ポリシーを作成するには、IoT Core コンソールに移動し、左側のナビゲーションペインから [Secure] を選択してから、ドロップダウンメニューから [Policies] を選択します。次に [Create] をクリックします。以下の myIOTPolicy ポリシーは、すべてのトピックに対する完全なアクセス権を許可します。

Figure 8 IoT Policy for publish and subscribe図 8: publishとsubscribeを許可するIoT Policy

  1. Cognito ID にポリシーをアタッチするには、まず AWSMobileClient から Cognito Identity Id を取得します。

AWSMobileClient.default().getIdentityId();

  1. 次に、次の AWS CLI コマンドで、myIOTPolicy ポリシーをユーザーの Cognito Identity Id に割り当てる必要があります。

aws iot attach-principal-policy --policy-name 'myIOTPolicy' --principal '<YOUR_COGNITO_IDENT

Step 6: テスト トピックへのパブリッシング/サブスクリプション (オプション)

  1. AWS IoT コンソールページの MQTT テストクライアントで、トピックにパブリッシュするセクション に移動し、モバイルアプリにメッセージをパブリッシュします。
  2. メッセージを受信するために、MQTT のトピックに購読します。
    1. AWS IoT コンソールを開きます。
    2. ナビゲーションペインで [Test] を選択してください。
    3. 「Subscribe to a topic」で「#」を入力すると、すべてのトピックに購読できます。
    4. Subscribe を選択してください。

この時点で、テレメトリ接続のための iOS アプリと IoT の統合を設定しました。

クリーンアップ

本ブログで説明した推奨ソリューションに従った場合、AWS アカウントへの不要な課金を避けるため、以下のステップを実行してください。

Amazon Cognito

  • ユーザープール example-user-pool とクライアントアプリ example-app-client を削除します。
    • Amazon Cognito > Userpools > ユーザープールを削除 をクリックします。これによりクライアントアプリとユーザープールが削除されます。
  • identity poolの testpool を削除します。
    • Amazon Cognito > identity pools > 対象の identity poolを選択 > delete

AWS IAM

  • ロール testrole を削除する
    • IAM > ロールに移動し、作成したロールを削除します

利点

この解決策のお客様へのメリットは以下のようなものが含まれます。

  1. このソリューションは、iOS アプリケーション、特に自動車業界のアプリケーションをAWS IoT Coreに接続する際に、スケーラブルかつシンプルな認証を可能にします。個別のユーザープロビジョニングや X.509 証明書の管理が大規模な場合は困難になりますが、この必要性を回避します。
    代わりに、Amazon Cognito Identity Pools を利用して、ログインなしで一時的かつ限定的なゲストアクセスを提供します。
  2. このソリューションは、iOS アプリのための総合的で安全な IoT 統合を提供するため、いくつかの AWS サービスを使用しています。AWS IoT SDK for iOS は、AWS IoT Core とシームレスに対話するためのライブラリを提供します。
  3. この解決策は、自動車メーカーが IoT のユースケース、例えば車両のソフトウェアアップデート、使用状況に基づく保険モデル、車両の診断、接続された車両、アプリケーション、ユーザーデータのセキュリティ確保に役立つために利用できます。

まとめ

自動車アプリケーションをクラウドに安全に接続することは、自動車メーカーがリモート診断、OTA (Over-the-Air) アップデート、より正確な車両ナビゲーションなどの最新の自動車機能を実現するための重要な課題です。このブログ記事では、自動車メーカーが AWS Cognito Identity Pools を使用して AWS IoT Core に接続する iOS アプリに、よりスケーラブルかつ安全な認証メカニズムを実現する方法を示しました。この記事では、Cognito Identity Pools と iOS アプリを統合する方法、WebSocket 経由で AWS IoT Core との MQTT 接続を確立する方法、IoT トピックのパブリッシュ/サブスクライブに適切な IAM ポリシーを設定する方法を説明しています。全体として、このアーキテクチャにより、自動車用の iOS アプリと AWS クラウドの間で双方向に IoT データを交換するためのセキュアでスケーラブルな接続が実現できます。Amazon Cognito の実践的な経験を積むには、このワークショップを参照してください。また、AWS IoT Core に接続するエンドツーエンドのモバイル iOS アプリを構築するには、このガイドを参照してください。

Chirayu Parikh

Chirayu Parikh

Chirayu Parikhはペンシルベニア州コレッジビルに拠点を置くシニアテクニカルアカウントマネージャーです。彼はAWSエンタープライズサポートの自動車戦略産業組織に所属し、大手自動車メーカーのクラウドジャーニーをサポートしています。AWSに入社する前は、10年以上にわたってエンタープライズネットワーキングソリューションの顧客をサポートしていました。

Vanshaj Kochar

Vanshaj Kochar

Vanshaj Kocharは、自動車および製造業界向けビジネスユニットのソリューションアーキテクトであり、AWSクラウド上で安全で、スケーラブルで、堅牢なクラウドソリューションを構築するお客様をサポートしています。電子工学および組み込み工学の経験を持ち、自動車およびIoT技術分野のコミュニティにも積極的に貢献しています。また、AWSEducateイニシアチブにも関わり、カナダの大学生にクラウドスキルを身につけてもらう活動も行っています。

この記事は Chirayu Parikh と Vanshaj Kochar によって書かれた Connecting and Authenticating Automotive iOS App to AWS IoT Core の日本語訳です。

この記事は シニア プロトタイピング ソリューション アーキテクトの市川 純が翻訳しました。