

支援終止通知：2026 年 10 月 7 日 AWS 將停止 的支援 AWS IoT Greengrass Version 1。2026 年 10 月 7 日之後，您將無法再存取 AWS IoT Greengrass V1 資源。如需詳細資訊，請造訪[從 遷移 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

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

# 將資料串流匯出至 AWS 雲端 （主控台）
<a name="stream-manager-console"></a>

本教學課程說明如何使用 AWS IoT 主控台來設定和部署已啟用串流管理員的 AWS IoT Greengrass 群組。群組包含使用者定義的 Lambda 函數，可寫入串流管理員中的串流，然後自動匯出至 AWS 雲端。

串流管理員可讓擷取、處理和匯出大量資料串流更有效率且更可靠。在本教學課程中，您會建立使用 IoT 資料的 `TransferStream` Lambda 函數。Lambda 函數使用 AWS IoT Greengrass 核心 SDK 在串流管理員中建立串流，然後讀取和寫入該串流。串流管理員接著會將串流匯出至 Kinesis Data Streams。下圖顯示此工作流程。

![\[串流管理工作流程圖\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/stream-manager-scenario.png)


本教學課程的重點是展示使用者定義的 Lambda 函數如何使用 AWS IoT Greengrass Core SDK 中的 `StreamManagerClient` 物件與串流管理員互動。為了簡化，您為此教學課程建立的 Python Lambda 函數會產生模擬的裝置資料。

## 先決條件
<a name="stream-manager-console-prerequisites"></a>

為完成此教學課程您需要：<a name="stream-manager-howto-prereqs"></a>
+ Greengrass 群組和 Greengrass 核心 (1.10 版或更新版本）。如需如何建立 Greengrass 群組和核心的詳細資訊，請參閱 [入門 AWS IoT Greengrass](gg-gs.md)。入門教學課程也包含安裝 AWS IoT Greengrass 核心軟體的步驟。
**注意**  <a name="stream-manager-not-supported-openwrt"></a>
<a name="stream-manager-not-supported-openwrt-para"></a>OpenWrt 發行版本不支援串流管理員。
+ 在核心裝置上安裝 Java 8 執行時間 (JDK 8)。<a name="install-java8-runtime-general"></a>
  + 針對以 Debian 為基礎的發行版本 (包括 Raspbian) 或以 Ubuntu 為基礎的發行版本，請執行下列命令：

    ```
    sudo apt install openjdk-8-jdk
    ```
  + 針對以 Red Hat 為基礎的發行版本 (包括 Amazon Linux)，請執行下列命令：

    ```
    sudo yum install java-1.8.0-openjdk
    ```

    如需詳細資訊，請參閱 OpenJDK 文件上的[如何下載和安裝預先建置的 OpenJDK 套件](https://openjdk.java.net/install/)。
+ AWS IoT Greengrass 適用於 Python 1.5.0 版或更新版本的核心 SDK。若要在適用於 Python AWS IoT Greengrass 的核心 SDK `StreamManagerClient`中使用 ，您必須：
  + 在核心裝置上安裝 Python 3.7 或更新版本。
  + 在 Lambda 函數部署套件中包含 SDK 及其相依性。本教學課程提供相關指示。
**提示**  
您可以搭配使用 `StreamManagerClient` 與 Java 或 NodeJS。如需程式碼範例，請參閱 GitHub 上的[AWS IoT Greengrass 適用於 Java 的 Core SDK](https://github.com/aws/aws-greengrass-core-sdk-java/blob/master/samples/StreamManagerKinesis/src/main/java/com/amazonaws/greengrass/examples/StreamManagerKinesis.java) 和[AWS IoT Greengrass 適用於 Node.js 的 Core SDK](https://github.com/aws/aws-greengrass-core-sdk-js/blob/master/greengrassExamples/StreamManagerKinesis/index.js)。
+ 在與 Greengrass 群組相同的 Amazon Kinesis Data Streams 中**MyKinesisStream**建立名為 AWS 區域 的目的地串流。如需詳細資訊，請參閱《*Amazon Kinesis 開發人員指南*》中的[建立串流](https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html#create-stream)。
**注意**  
在本教學課程中，串流管理員會將資料匯出至 Kinesis Data Streams，這會向您的 收取費用 AWS 帳戶。如需定價的相關資訊，請參閱 [Kinesis Data Streams 定價](https://aws.amazon.com/kinesis/data-streams/pricing/)。  
若要避免產生費用，您可以執行本教學課程而不建立 Kinesis 資料串流。在此情況下，您會檢查日誌，以查看串流管理員嘗試將串流匯出至 Kinesis Data Streams。
+ 新增至 的 IAM 政策[Greengrass 群組角色](group-role.md)，允許對目標資料串流執行 `kinesis:PutRecords`動作，如下列範例所示：

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "kinesis:PutRecords"
              ],
              "Resource": [
              "arn:aws:kinesis:us-east-1:123456789012:stream/MyKinesisStream"
              ]
          }
      ]
  }
  ```

------

本教學課程所述以下高階執行步驟：

1. [建立 Lambda 函數部署套件](#stream-manager-console-create-deployment-package)

1. [建立 Lambda 函式](#stream-manager-console-create-function)

1. [將函數新增到群組](#stream-manager-console-create-gg-function)

1. [啟用串流管理員](#stream-manager-console-enable-stream-manager)

1. [設定本機記錄](#stream-manager-console-configure-logging)

1. [部署群組](#stream-manager-console-create-deployment)

1. [測試應用程式。](#stream-manager-console-test-application)

此教學課程需約 20 分鐘完成。

## 步驟 1：建立 Lambda 函數部署套件
<a name="stream-manager-console-create-deployment-package"></a>

在此步驟中，您會建立包含 Python 函數程式碼和相依性的 Lambda 函數部署套件。您稍後在其中建立 Lambda 函數時上傳此套件 AWS Lambda。Lambda 函數使用 AWS IoT Greengrass 核心 SDK 來建立本機串流並與之互動。

**注意**  
 使用者定義的 Lambda 函數必須使用 [AWS IoT Greengrass 核心 SDK](lambda-functions.md#lambda-sdks-core) 與串流管理員互動。如需有關 Greengrass 串流管理員需求的詳細資訊，請參閱 [Greengrass 串流管理員需求](stream-manager.md#stream-manager-requirements)。

1.  下載[AWS IoT Greengrass 適用於 Python 的 核心 SDK](lambda-functions.md#lambda-sdks-core) 1.5.0 版或更新版本。

1. <a name="unzip-ggc-sdk"></a>解壓縮下載的封裝，以取得軟體開發套件。SDK 為 `greengrasssdk` 資料夾。

1. <a name="install-python-sdk-dependencies-stream-manager"></a>安裝套件相依性，以在 Lambda 函數部署套件中包含 開發套件。<a name="python-sdk-dependencies-stream-manager"></a>

   1. 前往包含 `requirements.txt` 檔案的軟體開發套件目錄。這個檔案會列出相依性。

   1. 安裝軟體開發套件相依性。例如，執行下列 `pip` 命令，將它們安裝在目前的目錄中：

      ```
      pip install --target . -r requirements.txt
      ```

1. 將以下 Python 程式碼函數儲存在名為 `transfer_stream.py` 的本機檔案中。
**提示**  
 如需使用 Java 和 NodeJS 的範例程式碼，請參閱 GitHub 上的[AWS IoT Greengrass 適用於 Java 的核心開發套件](https://github.com/aws/aws-greengrass-core-sdk-java/blob/master/samples/StreamManagerKinesis/src/main/java/com/amazonaws/greengrass/examples/StreamManagerKinesis.java)和[AWS IoT Greengrass 適用於 Node.js 的核心開發套件](https://github.com/aws/aws-greengrass-core-sdk-js/blob/master/greengrassExamples/StreamManagerKinesis/index.js)。

   ```
   import asyncio
   import logging
   import random
   import time
   
   from greengrasssdk.stream_manager import (
       ExportDefinition,
       KinesisConfig,
       MessageStreamDefinition,
       ReadMessagesOptions,
       ResourceNotFoundException,
       StrategyOnFull,
       StreamManagerClient,
   )
   
   
   # This example creates a local stream named "SomeStream".
   # It starts writing data into that stream and then stream manager automatically exports  
   # the data to a customer-created Kinesis data stream named "MyKinesisStream". 
   # This example runs forever until the program is stopped.
   
   # The size of the local stream on disk will not exceed the default (which is 256 MB).
   # Any data appended after the stream reaches the size limit continues to be appended, and
   # stream manager deletes the oldest data until the total stream size is back under 256 MB.
   # The Kinesis data stream in the cloud has no such bound, so all the data from this script is
   # uploaded to Kinesis and you will be charged for that usage.
   
   
   def main(logger):
       try:
           stream_name = "SomeStream"
           kinesis_stream_name = "MyKinesisStream"
   
           # Create a client for the StreamManager
           client = StreamManagerClient()
   
           # Try deleting the stream (if it exists) so that we have a fresh start
           try:
               client.delete_message_stream(stream_name=stream_name)
           except ResourceNotFoundException:
               pass
   
           exports = ExportDefinition(
               kinesis=[KinesisConfig(identifier="KinesisExport" + stream_name, kinesis_stream_name=kinesis_stream_name)]
           )
           client.create_message_stream(
               MessageStreamDefinition(
                   name=stream_name, strategy_on_full=StrategyOnFull.OverwriteOldestData, export_definition=exports
               )
           )
   
           # Append two messages and print their sequence numbers
           logger.info(
               "Successfully appended message to stream with sequence number %d",
               client.append_message(stream_name, "ABCDEFGHIJKLMNO".encode("utf-8")),
           )
           logger.info(
               "Successfully appended message to stream with sequence number %d",
               client.append_message(stream_name, "PQRSTUVWXYZ".encode("utf-8")),
           )
   
           # Try reading the two messages we just appended and print them out
           logger.info(
               "Successfully read 2 messages: %s",
               client.read_messages(stream_name, ReadMessagesOptions(min_message_count=2, read_timeout_millis=1000)),
           )
   
           logger.info("Now going to start writing random integers between 0 and 1000 to the stream")
           # Now start putting in random data between 0 and 1000 to emulate device sensor input
           while True:
               logger.debug("Appending new random integer to stream")
               client.append_message(stream_name, random.randint(0, 1000).to_bytes(length=4, signed=True, byteorder="big"))
               time.sleep(1)
   
       except asyncio.TimeoutError:
           logger.exception("Timed out while executing")
       except Exception:
           logger.exception("Exception while running")
   
   
   def function_handler(event, context):
       return
   
   
   logging.basicConfig(level=logging.INFO)
   # Start up this sample code
   main(logger=logging.getLogger())
   ```

1. 將下列項目壓縮成名為 `transfer_stream_python.zip` 的檔案。這是您的 Lambda 函數部署套件。
   + **transfer\$1stream.py**。應用程式邏輯。
   + **greengrasssdk**。發佈 MQTT 訊息的 Python Greengrass Lambda 函數所需的程式庫。

     [串流管理員操作](work-with-streams.md)可在適用於 Python 的核心 AWS IoT Greengrass SDK 1.5.0 版或更新版本中使用。
   + 您為適用於 Python AWS IoT Greengrass 的核心 SDK 安裝的相依性 （例如， `cbor2`目錄）。

   當您建立 `zip` 檔案時，請只包含這些項目，而非包含的資料夾。

## 步驟 2：建立 Lambda 函數
<a name="stream-manager-console-create-function"></a>

在此步驟中，您會使用 AWS Lambda 主控台來建立 Lambda 函數，並將其設定為使用您的部署套件。然後，您會發佈函數版本和建立別名。

1. 首先，建立 Lambda 函數。

   1. <a name="lambda-console-open"></a>在 中 AWS 管理主控台，選擇**服務**，然後開啟 AWS Lambda 主控台。

   1. <a name="lambda-console-create-function"></a>選擇**建立函數**，然後選擇**從頭開始撰寫**。

   1. 在 **Basic information (基本資訊)** 區段中，使用下列值：
      + 針對**函數名稱**，請輸入 **TransferStream**。
      + 針對**執行期**，選擇 **Python 3.7**。
      + 對於**許可**，請保留預設設定。這會建立授予基本 Lambda 許可的執行角色。不會使用此角色 AWS IoT Greengrass。

   1. <a name="lambda-console-save-function"></a>請在頁面底部，選擇**建立函式**。

1. 接著，註冊處理常式並上傳您的 Lambda 函數部署套件。

   1. <a name="lambda-console-upload"></a>在**程式碼**索引標籤的**程式碼來源**下，選擇**上傳來源**。從下拉式清單中，選擇 **.zip 檔案**。  
![\[從下拉式清單上傳，並反白顯示 .zip 檔案。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

   1. 選擇**上傳**，然後選擇您的`transfer_stream_python.zip`部署套件。然後選擇 **Save (儲存)**。

   1. <a name="lambda-console-runtime-settings-para"></a>在函數的**程式碼**索引標籤的**執行時間設定**下，選擇**編輯**，然後輸入下列值。
      + 針對**執行期**，選擇 **Python 3.7**。
      + 對於 **Handler (處理常式)**，輸入 **transfer\$1stream.function\$1handler**。

   1. <a name="lambda-console-save-config"></a>選擇**儲存**。
**注意**  
 AWS Lambda 主控台上的**測試**按鈕不適用於此函數。 AWS IoT Greengrass 核心 SDK 不包含在 AWS Lambda 主控台中獨立執行 Greengrass Lambda 函數所需的模組。這些模組 （例如 `greengrass_common`) 會在部署到您的 Greengrass 核心之後提供給函數。

1. 現在，發佈 Lambda 函數的第一個版本，並為[該版本建立別名](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)。
**注意**  
Greengrass 群組可以依別名 （建議） 或版本參考 Lambda 函數。使用別名可讓您更輕鬆地管理程式碼更新，因為您不必在更新函數程式碼時變更訂閱資料表或群組定義。反之，您只需將別名指向新的函數版本。

   1. <a name="shared-publish-function-version"></a>請從**操作**功能表中選擇**發行新版本**。

   1. <a name="shared-publish-function-version-description"></a>針對 **Version description (版本描述)**，輸入 **First version**，然後選擇 **Publish (發佈)**。

   1. 從 **TransferStream: 1** 組態頁面上的 **Actions (動作)** 選單中選擇 **Create alias (建立別名)**。

   1. 在**建立警示**頁面上使用下列值：
      + 對於**名稱**，輸入 **GG\$1TransferStream**。
      + 對於**版本**，選擇 **1**。
**注意**  
AWS IoT Greengrass 不支援 **\$1LATEST** 版本的 Lambda 別名。

   1. 選擇**建立**。

現在您已準備好將 Lambda 函數新增至 Greengrass 群組。

## 步驟 3：將 Lambda 函數新增至 Greengrass 群組
<a name="stream-manager-console-create-gg-function"></a>

在此步驟中，您將 Lambda 函數新增至 群組，然後設定其生命週期和環境變數。如需詳細資訊，請參閱[使用群組特定的組態控制 Greengrass Lambda 函數的執行](lambda-group-config.md)。

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. <a name="group-choose-target-group"></a>選擇目標群組。

1. <a name="choose-add-lambda"></a>在群組組態頁面上，選擇 **Lambda 函數**索引標籤。

1. 在**我的 Lambda 函數**下，選擇**新增**。

1. 在**新增 Lambda 函數**頁面上，為您的 **Lambda 函數**選擇 Lambda 函數。

1. 針對 **Lambda 版本**，選擇**別名：GG\$1TransferStream**。

   現在，設定屬性來決定 Greengrass 群組中 Lambda 函數的行為。

1. 在 **Lambda 函數組態**區段中，進行下列變更：
   + 將 **Memory limit (記憶體限制)** 設為 32 MB。
   + 針對**固定**，選擇 **True**。
**注意**  
<a name="long-lived-lambda"></a>*長期 *（或*固定*) Lambda 函數會在啟動後自動 AWS IoT Greengrass 啟動，並在自己的容器中繼續執行。這與*隨需* Lambda 函數相反，該函數會在叫用時啟動，並在沒有剩餘的任務執行時停止。如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。

1. 選擇**新增 Lambda 函數**。

## 步驟 4：啟用串流管理員
<a name="stream-manager-console-enable-stream-manager"></a>

在此步驟中，您將確定串流管理員已啟用。

1. 在群組組態頁面上，選擇 **Lambda 函數**索引標籤。

1. 在 **System Lambda 函數**下，選取**串流管理員**，然後檢查狀態。如果是已停用，請選擇 **Edit (編輯)**。然後，選擇 **Enable (啟用)** 並 **Save (儲存)**。您可以使用本教學課程的預設參數設定。如需詳細資訊，請參閱[設定 AWS IoT Greengrass 串流管理員](configure-stream-manager.md)。

**注意**  <a name="ggstreammanager-function-config-console"></a>
當您使用主控台啟用串流管理員並部署群組時，串流管理員的記憶體大小預設為 4194304 KB (4 GB)。我們建議您將記憶體大小設定為至少 128000 KB。

## 步驟 5：設定本機記錄
<a name="stream-manager-console-configure-logging"></a>

在此步驟中，您可以設定 群組中的 AWS IoT Greengrass 系統元件、使用者定義的 Lambda 函數和連接器，將日誌寫入核心裝置的檔案系統。您可以使用記錄檔針對可能遇到的任何問題進行疑難排解。如需詳細資訊，請參閱[使用 AWS IoT Greengrass 日誌監控](greengrass-logs-overview.md)。

1. <a name="shared-group-settings-local-logs-configuration"></a>在 **Local logs configuration (本機日誌組態)** 下，檢查是否已設定本機記錄。

1. <a name="shared-group-settings-local-logs-edit"></a>如果未針對 Greengrass 系統元件或使用者定義的 Lambda 函數設定日誌，請選擇**編輯**。

1. <a name="shared-group-settings-local-logs-event-source"></a>選擇**使用者 Lambda 函數日誌層級**和 **Greengrass 系統日誌層級**。

1. <a name="shared-group-settings-local-logs-save"></a>保留記錄層級和磁碟空間限制的預設值，然後選擇 **Save (儲存)**。

## 步驟 6：部署 Greengrass 群組
<a name="stream-manager-console-create-deployment"></a>

將群組部署到核心裝置。

1. <a name="shared-deploy-group-checkggc"></a>確定 AWS IoT Greengrass 核心正在執行。如果需要，請在您的 Raspberry Pi 終端機執行以下命令。

   1. 檢查精靈是否有在運作：

      ```
      ps aux | grep -E 'greengrass.*daemon'
      ```

      若輸出的 `root` 含有 `/greengrass/ggc/packages/ggc-version/bin/daemon` 項目，則精靈有在運作。
**注意**  
路徑中的版本取決於核心裝置上安裝的核心 AWS IoT Greengrass 軟體版本。

   1. 若要啟動協助程式：

      ```
      cd /greengrass/ggc/core/
      sudo ./greengrassd start
      ```

1. <a name="shared-deploy-group-deploy"></a>在群組組態頁面上，選擇**部署**。

1. <a name="shared-deploy-group-ipconfig"></a>

   1. 在 **Lambda 函數**索引標籤**的系統 Lambda 函數**區段下，選取 **IP 偵測器**，然後選擇**編輯**。

   1. 在**編輯 IP 偵測器設定**對話方塊中，選取**自動偵測和覆寫 MQTT 代理程式端點**。

   1. 選擇**儲存**。

      這可讓裝置自動取得核心的連接資訊，例如 IP 位址、DNS、連接埠編號。建議自動偵測，但 AWS IoT Greengrass 也支援手動指定的端點。只會在第一次部署群組時收到復原方法的提示。
**注意**  
如果出現提示，請授予許可來建立 [Greengrass 服務角色](service-role.md)，並將其與目前 AWS 帳戶 中的 建立關聯 AWS 區域。此角色允許 AWS IoT Greengrass 存取 AWS 服務中的資源。

      此**部署**頁面會顯示部署時間戳記、版本 ID 和狀態。完成後，部署顯示的狀態應為**已完成**。

      如需故障診斷協助，請參閱[故障診斷 AWS IoT Greengrass](gg-troubleshooting.md)。

## 步驟 7：測試應用程式
<a name="stream-manager-console-test-application"></a>

`TransferStream` Lambda 函數會產生模擬的裝置資料。它會將資料寫入串流管理員匯出至目標 Kinesis 資料串流的串流。

1. <a name="stream-manager-howto-test-open-kinesis-console"></a>在 Amazon Kinesis 主控台的 **Kinesis 資料串流**下，選擇 **MyKinesisStream**。
**注意**  
如果您在沒有目標 Kinesis 資料串流的情況下執行教學課程，[請檢查串流管理員的日誌檔案](stream-manager-cli.md#stream-manager-cli-logs) (`GGStreamManager`)。如果日誌檔案包含錯誤消息中的 `export stream MyKinesisStream doesn't exist`，則測試成功。此錯誤表示服務嘗試匯出至串流，但串流不存在。

1. <a name="stream-manager-howto-view-put-records"></a>在 **MyKinesisStream** 頁面上，選擇 **Monitoring (監控)**。如果測試成功，您應該會看到 **Put Records (Put 記錄)** 圖表中的資料。視您的連線而定，可能需要一分鐘才會顯示資料。
**重要**  
完成測試後，請刪除 Kinesis 資料串流以免產生更多費用。  
或者，執行下列命令來停止 Greengrass 協助程式。這樣可以防止核心傳送訊息，直到您準備好繼續測試為止。  

   ```
   cd /greengrass/ggc/core/
   sudo ./greengrassd stop
   ```

1. 從核心移除 **TransferStream** Lambda 函數。

   1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

   1. 在 **Greengrass 群組**下，選擇您的群組。

   1. 在 **Lambdas** 頁面上，選擇 **TransferStream** 函數的省略符號 (**...**)，然後選擇**移除函數**。

   1. 從 **Actions (動作)** 中，選擇 **Deploy (部署)**。

若要檢視記錄資訊或針對串流問題進行疑難排解，請檢查 `TransferStream` 和 `GGStreamManager` 函數的記錄。您必須具有讀取檔案系統 AWS IoT Greengrass 日誌的`root`許可。
+ `TransferStream` 會將日誌項目寫入 `greengrass-root/ggc/var/log/user/region/account-id/TransferStream.log`。
+ `GGStreamManager` 會將日誌項目寫入 `greengrass-root/ggc/var/log/system/GGStreamManager.log`。

如果您需要更多疑難排解資訊，您可以將 **User Lambda 日誌**的記錄[層級設定為](#stream-manager-console-configure-logging)**偵錯日誌**，然後再次部署群組。

## 另請參閱
<a name="stream-manager-console-see-also"></a>
+ [管理 AWS IoT Greengrass 核心上的資料串流](stream-manager.md)
+ [設定 AWS IoT Greengrass 串流管理員](configure-stream-manager.md)
+ [使用 StreamManagerClient 搭配串流](work-with-streams.md)
+ [匯出支援 AWS 雲端 目的地的組態](stream-export-configurations.md)
+ [將資料串流匯出至 AWS 雲端 (CLI)](stream-manager-cli.md)