coreHTTP 基本 S3 ダウンロードのデモ - FreeRTOS

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

coreHTTP 基本 S3 ダウンロードのデモ

重要

これは、FreeRTOS リリース 202210.00 で使用する「FreeRTOS ユーザーガイド」のアーカイブ版です。このドキュメントの最新バージョンについては、FreeRTOS ユーザーガイドを参照してください。

序章

このデモでは、範囲リクエストを使用して Amazon S3 HTTP サーバーからファイルをダウンロードする方法を示します。範囲リクエストは、HTTPClient_AddRangeHeader を使用して HTTP リクエストを作成するときに coreHTTP API でネイティブにサポートされます。マイクロコントローラ環境では、範囲リクエストを使用することを強くお勧めします。単一のリクエストはなく、個別の複数の範囲リクエストで大きなファイルをダウンロードすることで、ネットワークソケットをブロックすることなくファイルの各セクションを処理できます。範囲リクエストを使用すると、パケットがドロップされて TCP 接続での再送が必要になるリスクが低くなるため、デバイスの消費電力が改善されます。

この例で使用するネットワークトランスポートインターフェイスは、mbedTLS を使用して、coreHTTP を実行する IoT デバイスクライアントと Amazon S3 HTTP サーバー間に相互認証された接続を確立します。

注記

FreeRTOS デモをセットアップして実行するには、FreeRTOS の開始方法 の手順に従います。

シングルスレッドとマルチスレッド

coreHTTP には、シングルスレッドとマルチスレッド (マルチタスク) の 2 つの使用モデルがあります。このデモは、このセクションでは 1 つのスレッドで HTTP ライブラリを実行しますが、実際にはシングルスレッド環境で coreHTTP を使用する方法を示しています (このデモでは、1 つのタスクのみが HTTP API を使用します)。シングルスレッドアプリケーションは HTTP ライブラリを繰り返し呼び出す必要がありますが、マルチスレッドアプリケーションは、代わりにエージェント (またはデーモン) タスク内でバックグラウンドで HTTP リクエストを送信できます。

ソースコードの編成

デモプロジェクトの名前は http_demo_s3_download.c です。このプロジェクトは、freertos/demos/coreHTTP/ ディレクトリと GitHub ウェブサイトにあります。

Amazon S3 HTTP サーバー接続の設定

このデモでは、署名付き URL を使用して Amazon S3 HTTP サーバーに接続し、ダウンロードするオブジェクトへのアクセスを許可します。Amazon S3 HTTP サーバーの TLS 接続では、サーバー認証のみが使用されます。アプリケーションレベルでは、オブジェクトへのアクセスは、署名付き URL クエリのパラメータを使用して認証されます。以下のステップに従って、 AWSへの接続を設定します。

にサインアップする AWS アカウント

がない場合は AWS アカウント、次の手順を実行して作成します。

にサインアップするには AWS アカウント
  1. https://portal.aws.amazon.com/billing/signup を開きます。

  2. オンラインの手順に従います。

    サインアップ手順の一部では、電話またはテキストメッセージを受信し、電話のキーパッドに検証コードを入力します。

    にサインアップすると AWS アカウント、 AWS アカウントのルートユーザー が作成されます。ルートユーザーには、アカウントのすべての AWS のサービス とリソースへのアクセス権があります。セキュリティベストプラクティスとして、ユーザーに管理アクセス権を割り当て、ルートユーザーアクセスが必要なタスクの実行にはルートユーザーのみを使用するようにしてください。

AWS サインアッププロセスが完了すると、 から確認メールが送信されます。https://aws.amazon.com/[マイアカウント] をクリックして、いつでもアカウントの現在のアクティビティを表示し、アカウントを管理することができます。

管理アクセスを持つユーザーを作成する

にサインアップしたら AWS アカウント、日常的なタスクにルートユーザーを使用しないように AWS アカウントのルートユーザー、 を保護し AWS IAM Identity Center、 を有効にして管理ユーザーを作成します。

を保護する AWS アカウントのルートユーザー
  1. ルートユーザーを選択し、 AWS アカウント E メールアドレスを入力して、アカウント所有者AWS Management Consoleとして にサインインします。次のページでパスワードを入力します。

    ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドルートユーザーとしてサインインするを参照してください。

  2. ルートユーザーの多要素認証 (MFA) を有効にします。

    手順については、IAM ユーザーガイドの AWS アカウント 「ルートユーザー (コンソール) の仮想 MFA デバイスを有効にする」を参照してください。

管理アクセスを持つユーザーを作成する
  1. IAM アイデンティティセンターを有効にします。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Centerの有効化」を参照してください。

  2. IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。

    を ID ソース IAM アイデンティティセンターディレクトリ として使用する方法のチュートリアルについては、AWS IAM Identity Center 「 ユーザーガイド」の「デフォルトを使用してユーザーアクセスを設定する IAM アイデンティティセンターディレクトリ」を参照してください。

管理アクセス権を持つユーザーとしてサインインする
  • IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。

    IAM Identity Center ユーザーを使用してサインインする方法については、AWS サインイン 「 ユーザーガイド」の AWS 「 アクセスポータルにサインインする」を参照してください。

追加のユーザーにアクセス権を割り当てる
  1. IAM アイデンティティセンターで、最小特権のアクセス許可を適用するというベストプラクティスに従ったアクセス許可セットを作成します。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「権限設定を作成するを参照してください

  2. グループにユーザーを割り当て、そのグループにシングルサインオンアクセス権を割り当てます。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「グループの結合」を参照してください。

アクセス権限を付与するにはユーザー、グループ、またはロールにアクセス許可を追加します。

  1. Amazon Simple Storage Service Console ユーザーガイドの S3 バケットを作成する方法に従って、S3 にバケットを作成します。

  2. S3 バケットにファイルとフォルダをアップロードする方法のステップに従って、S3 にファイルをアップロードします。

  3. FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py ファイルにあるスクリプトを使用して、署名付き URL を生成します。使用手順については、「FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md」を参照してください。

機能

このデモは、まずファイルのサイズを取得します。次に、各バイト範囲をループ内で順番にリクエストします。範囲サイズは democonfigRANGE_REQUEST_LENGTH で指定します。

デモのソースコードは GitHub ウェブサイトに記載されています。

Amazon S3 HTTP サーバーに接続する

connectToServerWithBackoffRetries() 関数は HTTP サーバへの TCP 接続を試みます。接続が失敗すると、タイムアウト後に接続を再試行します。タイムアウト値は、最大試行回数に達するか、最大タイムアウト値に達するまで、指数関数的に増加します。connectToServerWithBackoffRetries() は、設定された試行回数に達してもサーバーへの TCP 接続を確立できない場合に、失敗ステータスを返します。

prvConnectToServer() 関数は、サーバー認証のみを使用して Amazon S3 HTTP サーバーへの接続を確立する方法を示します。この関数は、FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c ファイルに実装されている mbedTLS ベースのトランスポートインターフェイスを使用します。

prvConnectToServer() のソースコードは、GitHub に記載されています。

範囲リクエストを作成する

HTTPClient_AddRangeHeader() API 関数は、バイト範囲を HTTP リクエストヘッダーにシリアル化して、範囲リクエストを形成することをサポートします。このデモでは、範囲リクエストを使用して、ファイルサイズを取得し、ファイルの各セクションをリクエストします。

prvGetS3ObjectFileSize() 関数は、S3 バケットのファイルのサイズを取得します。Amazon S3 へのこの最初のリクエストには、レスポンスの送信後も接続を開いたままにするために Connection: keep-alive ヘッダーが追加されます。S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの Content-Range ヘッダーフィールドに含まれています。206 Partial Content レスポンスがサーバーから返されることが想定されます。受信するその他のレスポンスステータスコードはエラーです。

prvGetS3ObjectFileSize() のソースコードは、GitHub に記載されています。

このデモは、ファイルサイズを取得した後、ダウンロードするファイルのバイト範囲ごとに新しい範囲リクエストを作成します。ファイルの各セクションについて HTTPClient_AddRangeHeader() を使用します。

範囲リクエストの送信とレスポンスの受信

prvDownloadS3ObjectFile() 関数は、ファイル全体がダウンロードされるまで、範囲リクエストをループ内で送信します。HTTPClient_Send() API 関数は、リクエストの送信とレスポンスの受信を同期的に行います。関数からのレスポンスは xResponse で受信されます。その後、ステータスコードが 206 Partial Content であることが検証され、これまでにダウンロードされたバイト数の増加が Content-Length ヘッダー値で表されます。

prvDownloadS3ObjectFile() のソースコードは、GitHub に記載されています。