

終止支援通知：在 2025 年 12 月 15 日， AWS 將終止對 的支援 AWS IoT Analytics。2025 年 12 月 15 日之後，您將無法再存取 AWS IoT Analytics 主控台或 AWS IoT Analytics 資源。如需詳細資訊，請參閱[AWS IoT Analytics 終止支援](https://docs.aws.amazon.com/iotanalytics/latest/userguide/iotanalytics-end-of-support.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Docker 容器
<a name="automate-proceed"></a>

本節包含如何建置您自己的 Docker 容器的相關資訊。如果您重複使用第三方建置的 Docker 容器，有安全風險：這些容器可以使用您的使用者許可來執行任意程式碼。在使用任何第三方容器之前，請確定您信任其撰寫者。

以下是您對最後一次執行分析後抵達的資料，設定定期資料分析所要採取的步驟：

1. 建立 Docker 容器，其中包含您的資料應用程式以及任何必要的程式庫或其他相依性。

   IotAnalytics Jupyter 擴充功能提供容器化 API 來協助容器化程序。您也可以執行自己的建立映像，在其中建立或組合應用程式工具集，以執行所需的資料分析或運算。 AWS IoT Analytics 可讓您透過變數定義 Docker 容器之輸出資料的輸入資料來源和目的地。([自訂 Docker 容器輸入/輸出變數](https://docs.aws.amazon.com/iotanalytics/latest/userguide/automate.html#aws-iot-analytics-automate-custom-docker)包含有關搭配自訂容器使用變數的詳細資訊。)

1. 將容器上傳至 [Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-basics.html#use-ecr) 登錄檔。

1. 建立資料存放區以接收和存放來自裝置 () 的訊息 （資料`iotanalytics: [CreateDatastore](https://docs.aws.amazon.com/iotanalytics/latest/userguide/api.html#cli-iotanalytics-createdatastore)`)

1. 建立傳送訊息的頻道 (`iotanalytics: [CreateChannel](https://docs.aws.amazon.com/iotanalytics/latest/userguide/api.html#cli-iotanalytics-createchannel)`)。

1. 建立管道，將頻道連線至資料存放區 (`iotanalytics: [CreatePipeline](https://docs.aws.amazon.com/iotanalytics/latest/userguide/api.html#cli-iotanalytics-createpipeline)`)。

1. 建立 IAM 角色，授予將訊息資料傳送至 AWS IoT Analytics 頻道的許可 (`iam: [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html).`)

1. 建立使用 SQL 查詢將頻道連線至訊息資料來源的 IoT 規則 (`iot: [CreateTopicRule](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html)` 欄位 `topicRulePayload:actions:iotAnalytics`)。當裝置使用適當的主題 Visa MQTT 傳送訊息時，它會路由到您的頻道。或者，您可以使用 從能夠使用 AWS SDK 或 的裝置，`iotanalytics: [BatchPutMessage](https://docs.aws.amazon.com/iotanalytics/latest/userguide/api.html#cli-iotanalytics-batchputmessage)`將訊息直接傳送到頻道 AWS CLI。

1. 建立由時間排程 (`iotanalytics: [CreateDataset,](https://docs.aws.amazon.com/iotanalytics/latest/userguide/api.html#cli-iotanalytics-createdataset)` 欄位 ) 觸發建立的 SQL 資料集`actions: queryAction:sqlQuery`。

   您也可以指定要套用到訊息資料的預先篩選條件，以協助限制訊息為那些自上次執行動作後抵達的資料。（欄位`actions:queryAction:filters:deltaTime:timeExpression`提供可決定訊息時間的表達式。 欄位`actions:queryAction:filters:deltaTime:offsetSeconds`指定訊息到達時的可能延遲。)

   預先篩選與觸發排程會決定您的差異時段。每個新的 SQL 資料集都是使用自上次建立 SQL 資料集以來收到的訊息來建立。（第一次建立 SQL 資料集會如何？ 上次建立資料集的估計時間是根據排程和預先篩選。)

1. 建立另一個由建立第一個 ( [CreateDataset](https://docs.aws.amazon.com/iotanalytics/latest/userguide/api.html#cli-iotanalytics-createdataset) 欄位 `trigger:dataset`) 觸發的資料集。對於此資料集，您可以指定容器動作 （已提交 `actions:containerAction`)，指向您在第一個步驟中建立的 Docker 容器，並提供執行所需的資訊。您還可以指定：
   + 存放在您帳戶中之 Docker 容器的 ARN (`image`.)
   + 提供系統存取所需資源之許可的角色 ARN，以便執行容器動作 (`executionRoleArn`)。
   + 執行容器動作的資源組態 (`resourceConfiguration`.)
   + 如果運算資源用於執行容器動作 (`computeType`具有可能值：)，則為 類型`ACU_1 [vCPU=4, memory=16GiB] or ACU_2 [vCPU=8, memory=32GiB]`。
   + 用於執行容器動作 () 的資源執行個體可用的持久性儲存體大小 (GB`volumeSizeInGB`)。
   + 在應用程式執行內容中使用的變數值 （基本上是傳遞給應用程式的參數） ()`variables`。

     這些變數會在執行容器時進行替換。這可讓您執行具有不同變數 （參數） 的相同容器，這些變數會在建立資料集內容時提供。IotAnalytics Jupyter 擴充功能簡化了此程序，方式是透過自動識別筆記本中的變數，並讓這些變數可在容器化程序中使用。您可以選擇已是別的變數或新增您自己的自訂變數。在其執行容器之前，系統會在執行時以當時的值取代每一個這些變數。
   + 其中一個變數是資料集的名稱，其最新內容會用作應用程式的輸入 （這是您在上一個步驟中建立的資料集名稱） ()`datasetContentVersionValue:datasetName`。

使用 SQL 查詢和差異視窗產生資料集，以及使用應用程式的容器， AWS IoT Analytics 會建立排程生產資料集，以您在差異視窗中指定的資料間隔執行，產生所需的輸出和傳送通知。

您可以暫停生產資料集應用程式，並在選擇這麼做時繼續執行。當您繼續生產資料集應用程式時 AWS IoT Analytics，根據預設， 會追上自上次執行後抵達但尚未分析的所有資料。您也可以透過執行一系列的連續執行，設定您希望繼續生產資料集任務時段長度的方式）。或者，您可以僅擷取符合差異視窗指定大小的新到達資料，以繼續生產資料集應用程式。

建立或定義由建立另一個資料集所觸發的資料集時，請注意下列限制：
+ SQL 資料集只能觸發容器資料集。
+ SQL 資料集最多可以觸發 10 個容器資料集。

建立由 SQL 資料集觸發的容器資料集時，可能會傳回下列錯誤：
+ 「觸發資料集只能在容器資料集新增」
+ 「只能有一個觸發資料集」

  如果您嘗試定義由兩個不同的 SQL 資料集觸發的容器資料集，就會發生此錯誤。
+ 「觸發資料集 <dataset-name> 無法由容器資料集觸發」

  如果您嘗試定義由另一個容器資料集觸發的另一個容器資料集，就會發生此錯誤。
+ 「<N> 資料集已相依於 <dataset-name> 資料集。」

  如果您嘗試定義另一個由已觸發 10 個容器資料集的 SQL 資料集觸發的容器資料集，則會發生此錯誤。
+ 「應該只提供一個觸發類型」

  發生此錯誤時，您嘗試定義由排程觸發和資料集觸發觸發的資料集。

## 自訂 Docker 容器輸入/輸出變數
<a name="automate-custom-docker"></a>

本章節示範透過您的自訂 Docker 影像執行的程式，如何讀取輸入變數和上傳其輸出。

**程式檔案**

輸入變數和您要上傳輸出的目的地都儲存在 JSON 檔案中，此檔案位在執行您的 Docker 影像的執行個體上的 `/opt/ml/input/data/iotanalytics/params`。以下是該檔案內容的範例。

```
{
   "Context": {
       "OutputUris": {
           "html": "s3://aws-iot-analytics-dataset-xxxxxxx/notebook/results/iotanalytics-xxxxxxx/output.html",
           "ipynb": "s3://aws-iot-analytics-dataset-xxxxxxx/notebook/results/iotanalytics-xxxxxxx/output.ipynb"
       }
   },
   "Variables": {
       "source_dataset_name": "mydataset",
       "source_dataset_version_id": "xxxx",
       "example_var": "hello world!",
       "custom_output": "s3://aws-iot-analytics/dataset-xxxxxxx/notebook/results/iotanalytics-xxxxxxx/output.txt"
   }
}
```

除了您的資料集的名稱和版本 ID 外，`Variables` 區段還包含在 `iotanalytics:CreateDataset` 叫用中指定的變數，在此範例中，變數 `example_var` 取得了值 `hello world!`。`custom_output` 變數中也提供自訂輸出 URI。`OutputUris` 欄位包含容器可以上傳其輸出的預設位置，在這個範例中，對於 ipynb 和 html 輸出都會提供預設輸出 URI。

**輸入變數**

由您的 Docker 影像啟動的程式可以讀取來自 `params` 檔案的變數。以下是開啟 `params` 檔案、剖析檔案，以及列印 `example_var`變數值的範例程式。

```
import json

with open("/opt/ml/input/data/iotanalytics/params") as param_file:
    params = json.loads(param_file.read())
example_var = params["Variables"]["example_var"]
print(example_var)
```

**上傳輸出**

Docker 映像啟動的程式也可能將其輸出存放在 Amazon S3 位置。輸出必須使用 "bucket-owner-full-control" [存取控制清單](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html)載入。存取清單會授予對上傳輸出 AWS IoT Analytics 的服務控制。在此範例中，我們延伸先前的 ，將 的內容上傳至 `params` 檔案中由 `example_var` 定義的 Amazon S3 `custom_output` 位置。

```
import boto3
import json
from urllib.parse import urlparse

ACCESS_CONTROL_LIST = "bucket-owner-full-control"

with open("/opt/ml/input/data/iotanalytics/params") as param_file:
    params = json.loads(param_file.read())
example_var = params["Variables"]["example_var"]

outputUri = params["Variables"]["custom_output"]
# break the S3 path into a bucket and key
bucket = urlparse(outputUri).netloc
key = urlparse(outputUri).path.lstrip("/")

s3_client = boto3.client("s3")
s3_client.put_object(Bucket=bucket, Key=key, Body=example_var, ACL=ACCESS_CONTROL_LIST)
```