

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

# 將 AWS IoT Greengrass 元件部署至裝置
<a name="manage-deployments"></a>

您可以使用 AWS IoT Greengrass 將元件部署至裝置或裝置群組。您可以使用*部署*來定義傳送至裝置的元件和組態。 會 AWS IoT Greengrass 部署到代表 Greengrass 核心裝置*的目標*、 AWS IoT 物件或物件群組。 AWS IoT Greengrass 會使用[AWS IoT Core 任務](https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html)來部署到您的核心裝置。您可以設定任務如何推展至您的裝置。

## 核心裝置部署
<a name="core-device-deployments"></a>

每個核心裝置都會執行該裝置部署的元件。相同目標的新部署會覆寫目標的先前部署。建立部署時，您可以定義要套用至核心裝置現有軟體的元件和組態。

當您修改目標的部署時，您可以將先前修訂版中的元件取代為新修訂版中的元件。例如，您將 [日誌管理員](log-manager-component.md)和 [秘密管理員](secret-manager-component.md)元件部署到物件群組 `TestGroup`。然後，您可以為 建立另一個部署`TestGroup`，只指定秘密管理員元件。因此，該群組中的核心裝置不再執行日誌管理員。

## 平台相依性解析
<a name="platform-dependency-resolution"></a>

當核心裝置收到部署時，它會檢查以確保元件與核心裝置相容。例如，如果您將 部署[Firehose](kinesis-firehose-component.md)到 Windows 目標，部署將會失敗。

## 元件相依性解析
<a name="component-dependency-resolution"></a>

在元件部署期間，核心裝置會驗證物件群組中所有元件相依性和版本需求的相容性。此驗證可確保在繼續部署之前，所有元件及其相依性的版本限制都受到滿足。

相依性解析程序從識別其配方中沒有相依性的目標元件開始。然後，系統會使用廣度優先搜尋 (BFS) 建構相依性樹狀結構，系統性地探索每個目標節點，並在繼續下一個節點之前先尋找其相依性。每個節點都包含目標元件做為 金鑰，並將版本需求做為 值。

版本需求結合三組限制條件：
+ 已在現有物件群組中建立的版本需求。
+ 部署所需的元件版本。您必須在進行或更新部署時選取元件版本。
+ 在配方相依性區段中定義的任何元件版本限制。

### 解決元件相依性
<a name="resolving-dependencies"></a>

在部署期間，Greengrass 核會先嘗試尋找目前在滿足需求的裝置上執行的本機候選項目。如果執行中的元件滿足需求，則核會從配方資料夾取得儲存的配方路徑，並在本機存放區中找到最新的本機版本。

對於 AWS 雲端 部署，核接著會呼叫 [ResolveComponentCandidates API](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_ResolveComponentCandidates.html)。此 API 將從最新的可用版本開始，並檢查是否符合相依性和要求。當核心從 API 取得回應時，它會選取該最新版本。如果找不到符合 AWS 雲端 需求的 版本，則部署會失敗。如果裝置離線，則會回到找到的原始本機候選項目。如果找不到符合需求的本機候選項目，則部署會失敗。

對於本機部署，如果存在且符合要求，則核只會使用本機候選項目，而不會進行協商 AWS 雲端。如果沒有這類候選項目，則部署會失敗。

**注意**  
所有已解析的配方都會儲存在本機以供日後參考。

如需詳細資訊，請參閱 GitHub 中的[相依性解析](https://github.com/aws-greengrass/aws-greengrass-nucleus/wiki/Deployment#dependency-resolution)一節。

如果 Greengrass 核能夠成功解析所有元件，則核日誌將包含以下行。

```
resolve-all-group-dependencies-finish. Finish resolving all groups dependencies.
```

**Example**  
以下是 核如何解決元件需求的範例。  
+ 您可以部署ComponentAComponentC。
+ 您也可以部署取決於 ComponentC 1.4.0-1.9.5 版的 ComponentBComponentB 。
透過元件相依性解析， 核會部署最新版本的 ComponentC 版本，以滿足 ComponentA 和 ComponentB 的需求。此最新版本的 ComponentC 是 1.9.0 版。

#### 常見元件相依性解析失敗
<a name="w2ab1c24c25b9c11c19"></a>

元件相依性解析可能會因為兩個主要原因失敗：目標版本需求衝突或元件相依性需求衝突。

##### 案例 1：目標版本需求衝突
<a name="w2ab1c24c25b9c11c19b5"></a>
+ 物件存在於一個物件群組中，您也想要將該物件新增至新的物件群組。如果新物件群組需要不同的物件版本，則部署會失敗。
+ 如果物件屬於物件群組，且想要透過物件部署更新元件版本，則部署也可能會失敗。

![\[導致部署失敗的元件相依性。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v2/developerguide/images/dependency-4.png)


*失敗日誌範例：*

```
2025-04-11T06:16:03.315Z [ERROR] (pool-3-thread-27) com.aws.greengrass.componentmanager.ComponentManager: Failed to negotiate version with cloud and no local version to fall back to. {componentName=ComponentC, versionRequirement={thing/ABC==2.0.0, thinggroup/ThingGroupA==1.0.0}}
2025-04-11T06:16:03.316Z [ERROR] (pool-3-thread-26) com.aws.greengrass.deployment.DeploymentService: Error occurred while processing deployment. {deploymentId=fbac24de-4ef9-44b0-a685-fdc63b0f02b8, serviceName=DeploymentService, currentState=RUNNING}
java.util.concurrent.ExecutionException: com.aws.greengrass.componentmanager.exceptions.NoAvailableComponentVersionException: No local or cloud component version satisfies the requirements Check whether the version constraints conflict and that the component exists in your AWS account with a version that matches the version constraints. If the version constraints conflict, revise deployments to resolve the conflict. Component ComponentC version constraints: thing/ABC requires =2.0.0, thinggroup/ThingGroupA requires =1.0.0.
    at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
    at com.aws.greengrass.deployment.DefaultDeploymentTask.call(DefaultDeploymentTask.java:127)
    at com.aws.greengrass.deployment.DefaultDeploymentTask.call(DefaultDeploymentTask.java:50)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: com.aws.greengrass.componentmanager.exceptions.NoAvailableComponentVersionException: No local or cloud component version satisfies the requirements Check whether the version constraints conflict and that the component exists in your AWS account with a version that matches the version constraints. If the version constraints conflict, revise deployments to resolve the conflict. Component ComponentC version constraints: thing/ABC requires =2.0.0, thinggroup/ThingGroupA requires =1.0.0.
    at com.aws.greengrass.componentmanager.ComponentManager.negotiateVersionWithCloud(ComponentManager.java:232)
    at com.aws.greengrass.componentmanager.ComponentManager.resolveComponentVersion(ComponentManager.java:167)
    at com.aws.greengrass.componentmanager.DependencyResolver.lambda$resolveDependencies$0(DependencyResolver.java:134)
    at com.aws.greengrass.componentmanager.DependencyResolver.resolveComponentDependencies(DependencyResolver.java:231)
    at com.aws.greengrass.componentmanager.DependencyResolver.resolveDependencies(DependencyResolver.java:131)
    at com.aws.greengrass.deployment.DefaultDeploymentTask.lambda$call$2(DefaultDeploymentTask.java:125)
    ... 4 more
```

日誌指出版本衝突錯誤，因為核心找不到同時符合兩個衝突需求的元件版本。

##### 如何解決此問題
<a name="w2ab1c24c25b9c11c19b5c13"></a>
+ 如果您想要在每個物件群組中保留元件，請在每個物件群組中選取該元件的相同版本。
+ 選取符合部署需求的元件版本。
+ 如果您想要使用不符合物件群組需求的元件版本，請選取符合物件群組版本需求的元件版本，並僅在該物件群組中使用該元件。

##### 案例 2：元件相依性版本需求衝突
<a name="w2ab1c24c25b9c11c19b7"></a>

如果元件是不同元件的相依性，且元件需要不同版本或該元件的不同版本範圍，則可能沒有可用的版本可滿足所有版本需求。在此案例中，部署將會失敗。

**Example**  
ComponentA (v2.5.0)、 ComponentB (v1.3.0) 和 ComponentC (v1.0.0) 的部署  
+ ComponentA 要求 ComponentB 版本 >=1.0.0。

  ```
  ---
  ...
  ComponentName: ComponentA
  ComponentVersion: "2.5.0"
  ComponentDependencies:
      ComponentB:
          VersionRequirement: ">=1.0.0"
          DependencyType: "HARD"
  ...
  ```
+ ComponentC 需要 ComponentA 版本 <2.0.0。

  ```
  ---
  ...
  ComponentName: ComponentC
  ComponentVersion: "1.0.0"
  ComponentDependencies:
      ComponentA:
          VersionRequirement: "<2.0.0"
          DependencyType: "HARD"
  ...
  ```
ComponentA 的兩個要求之間存在版本衝突：  
+ 此部署中 ComponentA 需要 2.5.0 版
+ ComponentC 需要低於 2.0.0 的 ComponentA 版本
這兩個要求彼此矛盾，使得核心無法找到滿足這兩個要求的 ComponentA 版本。因此，相依性解析會失敗。

![\[導致部署失敗的元件相依性。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v2/developerguide/images/dependency-3.png)


*失敗日誌範例：*

```
2025-04-11T06:07:18.291Z [ERROR] (pool-3-thread-25) com.aws.greengrass.componentmanager.ComponentManager: Failed to negotiate version with cloud and no local version to fall back to. {componentName=ComponentA, versionRequirement={ComponentC=<2.0.0, thinggroup/ThingGroupA==2.5.0}}
2025-04-11T06:07:18.292Z [ERROR] (pool-3-thread-24) com.aws.greengrass.deployment.DeploymentService: Error occurred while processing deployment. {deploymentId=2ffac4df-1ac9-405c-8c11-28494a1b4382, serviceName=DeploymentService, currentState=RUNNING}
java.util.concurrent.ExecutionException: com.aws.greengrass.componentmanager.exceptions.NoAvailableComponentVersionException: No local or cloud component version satisfies the requirements Check whether the version constraints conflict and that the component exists in your AWS account with a version that matches the version constraints. If the version constraints conflict, revise deployments to resolve the conflict. Component ComponentA version constraints: ComponentC requires <2.0.0, thinggroup/ThingGroupA requires =2.5.0.
    at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
    at com.aws.greengrass.deployment.DefaultDeploymentTask.call(DefaultDeploymentTask.java:127)
    at com.aws.greengrass.deployment.DefaultDeploymentTask.call(DefaultDeploymentTask.java:50)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: com.aws.greengrass.componentmanager.exceptions.NoAvailableComponentVersionException: No local or cloud component version satisfies the requirements Check whether the version constraints conflict and that the component exists in your AWS account with a version that matches the version constraints. If the version constraints conflict, revise deployments to resolve the conflict. Component ComponentA version constraints: ComponentC requires <2.0.0, thinggroup/ThingGroupA requires =2.5.0.
    at com.aws.greengrass.componentmanager.ComponentManager.negotiateVersionWithCloud(ComponentManager.java:232)
    at com.aws.greengrass.componentmanager.ComponentManager.resolveComponentVersion(ComponentManager.java:167)
    at com.aws.greengrass.componentmanager.DependencyResolver.lambda$resolveDependencies$0(DependencyResolver.java:134)
    at com.aws.greengrass.componentmanager.DependencyResolver.resolveComponentDependencies(DependencyResolver.java:231)
    at com.aws.greengrass.componentmanager.DependencyResolver.resolveDependencies(DependencyResolver.java:131)
    at com.aws.greengrass.deployment.DefaultDeploymentTask.lambda$call$2(DefaultDeploymentTask.java:125)
    ... 4 more
```

日誌指出 核找不到符合下列需求的 ComponentA 版本。
+ ComponentA 的要求完全是 2.5.0 版 （來自 ThingGroupA)。
+ 使用低於 2.0.0 的 ComponentC 版本的需求。

##### 如何解決此問題
<a name="w2ab1c24c25b9c11c19b7c17"></a>
+ 如果您想要在每個物件群組中保留元件，請在每個物件群組中選取該元件的相同版本。
+ 選取符合部署需求的元件版本。
+ 如果您想要使用不符合物件群組需求的元件版本，請選取符合物件群組版本需求的元件版本，並僅在該物件群組中使用該元件。

**提示**  
如果您在任何 AWS 提供的元件上看到此錯誤，您可以透過將衝突的元件更新到最新版本來解決它。

## 從物件群組移除裝置
<a name="thing-group-removal-behavior"></a>

當您從物件群組移除核心裝置時，元件部署行為取決於核心裝置執行的 [Greengrass 核心](greengrass-nucleus-component.md)版本。

------
#### [ 2.5.1 and later ]

當您從物件群組移除核心裝置時，行為取決於 AWS IoT 政策是否授予`greengrass:ListThingGroupsForCoreDevice`許可。如需核心裝置此許可和 AWS IoT 政策的詳細資訊，請參閱 [的裝置身分驗證和授權 AWS IoT Greengrass](device-auth.md)。
+ **如果 AWS IoT 政策授予此許可**

  <a name="thing-group-removal-behavior-remove-components"></a>當您從物件群組移除核心裝置時，下次對裝置進行部署時， 會 AWS IoT Greengrass 移除物件群組的元件。如果裝置的元件包含在下一次部署中，則該元件不會從裝置中移除。
+ **如果 AWS IoT 政策未授予此許可**

  <a name="thing-group-removal-behavior-no-remove-components"></a>當您從物件群組中移除核心裝置時， AWS IoT Greengrass 不會從裝置刪除該物件群組的元件。

  <a name="thing-group-removal-behavior-no-remove-components-how-to-remove"></a>若要從裝置移除元件，請使用 Greengrass CLI 的[部署建立](gg-cli-deployment.md#deployment-create)命令。使用 `--remove` 引數指定要移除的元件，並使用 `--groupId`引數指定物件群組。

------
#### [ 2.5.0 ]

<a name="thing-group-removal-behavior-remove-components"></a>當您從物件群組移除核心裝置時，下次對裝置進行部署時， 會 AWS IoT Greengrass 移除物件群組的元件。如果裝置的元件包含在下一次部署中，則該元件不會從裝置中移除。

此行為需要核心裝置的 AWS IoT 政策授予 `greengrass:ListThingGroupsForCoreDevice`許可。如果核心裝置沒有此許可，則核心裝置無法套用部署。如需詳細資訊，請參閱[的裝置身分驗證和授權 AWS IoT Greengrass](device-auth.md)。

------
#### [ 2.0.x - 2.4.x ]

<a name="thing-group-removal-behavior-no-remove-components"></a>當您從物件群組中移除核心裝置時， AWS IoT Greengrass 不會從裝置刪除該物件群組的元件。

<a name="thing-group-removal-behavior-no-remove-components-how-to-remove"></a>若要從裝置移除元件，請使用 Greengrass CLI 的[部署建立](gg-cli-deployment.md#deployment-create)命令。使用 `--remove` 引數指定要移除的元件，並使用 `--groupId`引數指定物件群組。

------

## 部署
<a name="deployments"></a>

部署是連續的。當您建立部署時， 會將部署 AWS IoT Greengrass 轉出至線上的目標裝置。如果目標裝置未上線，則下次連線時會接收部署 AWS IoT Greengrass。當您將核心裝置新增至目標物件群組時， 會將該物件群組的最新部署 AWS IoT Greengrass 傳送給裝置。

在核心裝置部署元件之前，預設會通知裝置上的每個元件。Greengrass 元件可以回應通知以延遲部署。如果裝置電池電量低或正在執行無法中斷的程序，建議您延遲部署。如需詳細資訊，請參閱[教學課程：開發可延遲元件更新的 Greengrass 元件](defer-component-updates-tutorial.md)。建立部署時，您可以將其設定為部署，而無需通知元件。

每個目標物件或物件群組一次可以有一個部署。這表示當您為目標建立部署時， AWS IoT Greengrass 不會再部署該目標部署的先前修訂版。

## 部署選項
<a name="deployment-options"></a>

部署提供多種選項，可讓您控制哪些裝置接收更新，以及更新如何部署。建立部署時，您可以設定下列選項：
+ **AWS IoT Greengrass 元件**

  定義要在目標 device. AWS IoT Greengrass components 上安裝和執行的元件是您在 Greengrass 核心裝置上部署和執行的軟體模組。只有在元件支援裝置的平台時，裝置才會接收元件。這可讓您部署至裝置群組，即使目標裝置在多個平台上執行也一樣。如果元件不支援裝置的平台，則元件不會部署到裝置。

  您可以將自訂元件和 AWS提供的元件部署至您的裝置。當您部署元件時， 會 AWS IoT Greengrass 識別任何元件相依性，也會進行部署。如需詳細資訊，請參閱[開發 AWS IoT Greengrass 元件](develop-greengrass-components.md)及[AWS提供的元件](public-components.md)。

  您可以定義要為每個元件部署的版本和組態更新。*組態更新*指定如何在核心裝置上修改元件的現有組態，如果元件不存在於核心裝置上，則修改元件的預設組態。您可以指定要重設為預設值的組態值，以及要合併到核心裝置的新組態值。當核心裝置收到不同目標的部署，且每個部署指定相容的元件版本時，核心裝置會根據您建立部署時的時間戳記，依序套用組態更新。如需詳細資訊，請參閱[更新元件組態](update-component-configurations.md)。
**重要**  <a name="component-patch-update-note"></a>
<a name="component-patch-update"></a>部署元件時， 會 AWS IoT Greengrass 安裝該元件所有相依性的最新支援版本。因此，如果您將新裝置新增至物件群組，或者您更新以這些裝置為目標的部署，則可能會自動將 AWS新修補程式版本的公有元件部署到您的核心裝置。有些自動更新，例如核更新，可能會導致您的裝置意外重新啟動。  
<a name="component-version-pinning"></a>為了防止在您裝置上執行之元件的意外更新，我們建議您[在建立部署](create-deployments.md)時直接包含該元件的偏好版本。如需 AWS IoT Greengrass Core 軟體更新行為的詳細資訊，請參閱 [更新 AWS IoT Greengrass 核心軟體 (OTA)](update-greengrass-core-v2.md)。
+ **部署政策**

  定義何時可以安全地部署組態，以及部署失敗時該怎麼做。您可以指定是否等待元件報告他們可以更新。如果裝置套用失敗的部署，您也可以指定是否要將裝置復原至先前的組態。
+ **停止組態**

  定義停止部署的時間和方式。如果符合您定義的條件，部署會停止並失敗。例如，您可以設定部署，在最小數量的裝置接收後，有一定百分比的裝置無法套用該部署時停止。
+ **推展組態**

  定義部署推展到目標裝置的速率。您可以使用最小和最大速率邊界來設定指數速率增加。
+ **逾時組態**

  定義每個裝置必須套用部署的時間上限。如果裝置超過您指定的持續時間，則裝置無法套用部署。

**重要**  
自訂元件可以在 S3 儲存貯體中定義成品。 AWS IoT Greengrass 核心軟體部署元件時，會從 下載元件的成品 AWS 雲端。根據預設，核心裝置角色不允許存取 S3 儲存貯體。若要部署定義 S3 儲存貯體中成品的自訂元件，核心裝置角色必須授予從該儲存貯體下載成品的許可。如需詳細資訊，請參閱[允許存取元件成品的 S3 儲存貯體](device-service-role.md#device-service-role-access-s3-bucket)。

**Topics**
+ [核心裝置部署](#core-device-deployments)
+ [平台相依性解析](#platform-dependency-resolution)
+ [元件相依性解析](#component-dependency-resolution)
+ [從物件群組移除裝置](#thing-group-removal-behavior)
+ [部署](#deployments)
+ [部署選項](#deployment-options)
+ [建立部署](create-deployments.md)
+ [建立子部署](create-subdeployments.md)
+ [修訂部署](revise-deployments.md)
+ [取消部署](cancel-deployments.md)
+ [檢查部署狀態](check-deployment-status.md)