

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

# coreHTTP 基本 S3 ダウンロードのデモ
<a name="core-http-s3-download-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-s3-download-demo-intro"></a>

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

この例で使用する[ネットワークトランスポートインターフェイス](https://freertos.org/network-interface.html)は、mbedTLS を使用して、coreHTTP を実行する IoT デバイスクライアントと Amazon S3 HTTP サーバー間に相互認証された接続を確立します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

### シングルスレッドとマルチスレッド
<a name="core-http-s3-download-demo-threads"></a>

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

## ソースコードの編成
<a name="core-http-s3-download-demo-source-code"></a>

デモプロジェクトの名前は `http_demo_s3_download.c` です。このプロジェクトは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c) ウェブサイトにあります。

## Amazon S3 HTTP サーバー接続の設定
<a name="core-http-s3-download-demo-configure-server"></a>

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

1.  AWS アカウントをセットアップします。

   1. まだ作成していない場合は、[AWS アカウントを作成してアクティブ化します](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)。

   1. アカウントとアクセス許可は AWS Identity and Access Management (IAM) を使用して設定されます。IAM では、アカウント内の各ユーザーのアクセス権限を管理できます。デフォルトでは、ルート所有者によって付与されるまで、ユーザーにはアクセス権限がありません。

      1.  AWS アカウントにユーザーを追加するには、[IAM ユーザーガイド](https://docs.aws.amazon.com/IAM/latest/UserGuide/)を参照してください。

      1. これらのポリシー AWS IoT を追加して、FreeRTOS および にアクセスするためのアクセス許可を AWS アカウントに付与します。
         + AmazonS3FullAccess

1. Amazon Simple Storage Service Console ユーザーガイドの [S3 バケットを作成する方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)に従って、S3 にバケットを作成します。**

1. [S3 バケットにファイルとフォルダをアップロードする方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)のステップに従って、S3 にファイルをアップロードします。

1. `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`」を参照してください。

## 機能
<a name="core-http-s3-download-demo-functionality"></a>

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

デモのソースコードは [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c) ウェブサイトに記載されています。

### Amazon S3 HTTP サーバーに接続する
<a name="core-http-s3-download-demo-connecting"></a>

[connectToServerWithBackoffRetries()](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) 関数は HTTP サーバへの TCP 接続を試みます。接続が失敗すると、タイムアウト後に接続を再試行します。タイムアウト値は、最大試行回数に達するか、最大タイムアウト値に達するまで、指数関数的に増加します。`connectToServerWithBackoffRetries()` は、設定された試行回数に達してもサーバーへの TCP 接続を確立できない場合に、失敗ステータスを返します。

`prvConnectToServer()` 関数は、サーバー認証のみを使用して Amazon S3 HTTP サーバーへの接続を確立する方法を示します。この関数は、[FreeRTOS-Plus/Source/Application-Protocols/network\$1transport/freertos\$1plus\$1tcp/using\$1mbedtls/using\$1mbedtls.c](https://github.com/FreeRTOS/FreeRTOS/blob/202012.00/FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c) ファイルに実装されている mbedTLS ベースのトランスポートインターフェイスを使用します。

`prvConnectToServer()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L273-L333) に記載されています。

### 範囲リクエストを作成する
<a name="core-http-s3-download-demo-creating-range-request"></a>

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

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

`prvGetS3ObjectFileSize()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L337-L502) に記載されています。

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

### 範囲リクエストの送信とレスポンスの受信
<a name="core-http-s3-download-demo-send-request"></a>

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

`prvDownloadS3ObjectFile()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L506-L651) に記載されています。