

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

# 與元件生命週期互動
<a name="ipc-component-lifecycle"></a>

使用元件生命週期 IPC 服務來：
+ 更新核心裝置上的元件狀態。
+ 訂閱元件狀態更新。
+ 防止核心在部署期間停止元件以套用更新。
+ 暫停和繼續元件程序。

**Topics**
+ [最低 SDK 版本](#ipc-component-lifecycle-sdk-versions)
+ [Authorization](#ipc-component-lifecycle-authorization)
+ [UpdateState](#ipc-operation-updatestate)
+ [SubscribeToComponentUpdates](#ipc-operation-subscribetocomponentupdates)
+ [DeferComponentUpdate](#ipc-operation-defercomponentupdate)
+ [PauseComponent](#ipc-operation-pausecomponent)
+ [ResumeComponent](#ipc-operation-resumecomponent)

## 最低 SDK 版本
<a name="ipc-component-lifecycle-sdk-versions"></a>

下表列出 AWS IoT Device SDK 您必須用來與元件生命週期互動的 最低版本。


| SDK | 最低版本 | 
| --- | --- | 
|  [AWS IoT Device SDK for Java v2](https://github.com/aws/aws-iot-device-sdk-java-v2)  |  v1.2.10  | 
|  [AWS IoT Device SDK for Python v2](https://github.com/aws/aws-iot-device-sdk-python-v2)  |  1.5.3 版  | 
|  [AWS IoT Device SDK 適用於 C\$1\$1 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2)  |  1.17.0 版  | 
|  [AWS IoT Device SDK for JavaScript v2](https://github.com/aws/aws-iot-device-sdk-js-v2)  |  v1.12.0  | 

## Authorization
<a name="ipc-component-lifecycle-authorization"></a>

若要暫停或繼續自訂元件中的其他元件，您必須定義授權政策，以允許元件管理其他元件。如需定義授權政策的資訊，請參閱 [授權元件執行 IPC 操作](interprocess-communication.md#ipc-authorization-policies)。

元件生命週期管理的授權政策具有下列屬性。

**IPC 服務識別符：** `aws.greengrass.ipc.lifecycle`


| 作業 | Description | Resources | 
| --- | --- | --- | 
|  `aws.greengrass#PauseComponent`  |  允許元件暫停您指定的元件。  |  元件名稱，或 `*` 允許存取所有元件。  | 
|  `aws.greengrass#ResumeComponent`  |  允許元件繼續您指定的元件。  |  元件名稱，或 `*` 允許存取所有元件。  | 
|  `*`  |  允許元件暫停和繼續您指定的元件。  |  元件名稱，或 `*` 允許存取所有元件。  | 

### 授權政策範例
<a name="ipc-component-lifecycle-authorization-policy-examples"></a>

您可以參考下列授權政策範例，協助您設定元件的授權政策。

**Example 範例授權政策**  
下列範例授權政策允許元件暫停和繼續所有元件。  

```
{
  "accessControl": {
    "aws.greengrass.ipc.lifecycle": {
      "com.example.MyLocalLifecycleComponent:lifecycle:1": {
        "policyDescription": "Allows access to pause/resume all components.",
        "operations": [
          "aws.greengrass#PauseComponent",
          "aws.greengrass#ResumeComponent"
        ],
        "resources": [
          "*"
        ]
      }
    }
  }
}
```

## UpdateState
<a name="ipc-operation-updatestate"></a>

更新核心裝置上的元件狀態。

### 請求
<a name="ipc-operation-updatestate-request"></a>

此操作的請求具有下列參數：

`state`  
要設定的狀態。此列舉 `LifecycleState`具有下列值：  
+ `RUNNING`
+ `ERRORED`

### 回應
<a name="ipc-operation-updatestate-response"></a>

此操作不會在其回應中提供任何資訊。

### 範例
<a name="ipc-operation-updatestate-examples"></a>

下列範例示範如何在自訂元件程式碼中呼叫此操作。

------
#### [ Rust ]

**Example 範例：更新狀態**  

```
use gg_sdk::{ComponentState, Sdk};

fn main() {
    let sdk = Sdk::init();
    sdk.connect().expect("Failed to establish IPC connection");

    // Update component state to RUNNING
    sdk.update_state(ComponentState::Running)
        .expect("Failed to update component state");

    println!("Successfully updated component state to RUNNING.");
}
```

------
#### [ C ]

**Example 範例：更新狀態**  

```
#include <gg/error.h>
#include <gg/ipc/client.h>
#include <gg/sdk.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    gg_sdk_init();

    GgError err = ggipc_connect();
    if (err != GG_ERR_OK) {
        fprintf(stderr, "Failed to establish IPC connection.\n");
        exit(-1);
    }

    // Update component state to RUNNING
    err = ggipc_update_state(GG_COMPONENT_STATE_RUNNING);
    if (err != GG_ERR_OK) {
        fprintf(stderr, "Failed to update component state.\n");
        exit(-1);
    }

    printf("Successfully updated component state to RUNNING.\n");
}
```

------
#### [ C\$1\$1 (Component SDK) ]

**Example 範例：更新狀態**  

```
#include <gg/ipc/client.hpp>
#include <iostream>

int main() {
    auto &client = gg::ipc::Client::get();

    auto error = client.connect();
    if (error) {
        std::cerr << "Failed to establish IPC connection.\n";
        exit(-1);
    }

    // Update component state to RUNNING
    error = client.update_component_state(GG_COMPONENT_STATE_RUNNING);
    if (error) {
        std::cerr << "Failed to update component state.\n";
        exit(-1);
    }

    std::cout << "Successfully updated component state to RUNNING.\n";
}
```

------

## SubscribeToComponentUpdates
<a name="ipc-operation-subscribetocomponentupdates"></a>

在 AWS IoT Greengrass Core 軟體更新元件之前訂閱以接收通知。通知會指定是否要在更新時重新啟動 核。

只有當部署的元件更新政策指定 通知元件時， 核才會傳送更新通知。預設行為是通知元件。如需詳細資訊，請參閱 [建立部署](create-deployments.md)和您可以在呼叫 [CreateDeployment](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_CreateDeployment.html) 操作時提供的 [DeploymentComponentUpdatePolicy](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_DeploymentComponentUpdatePolicy.html) 物件。

**重要**  
本機部署不會在更新之前通知元件。

<a name="ipc-subscribe-operation-note"></a>此操作是您訂閱事件訊息串流的訂閱操作。若要使用此操作，請使用處理事件訊息、錯誤和串流關閉的函數來定義串流回應處理常式。如需詳細資訊，請參閱[訂閱 IPC 事件串流](interprocess-communication.md#ipc-subscribe-operations)。

**事件訊息類型：** `ComponentUpdatePolicyEvents`

**提示**  
您可以遵循教學課程，了解如何開發有條件延遲元件更新的元件。如需詳細資訊，請參閱[教學課程：開發可延遲元件更新的 Greengrass 元件](defer-component-updates-tutorial.md)。

### 請求
<a name="ipc-operation-subscribetocomponentupdates-request"></a>

此操作的請求沒有任何參數。

### 回應
<a name="ipc-operation-subscribetocomponentupdates-response"></a>

此操作的回應包含下列資訊：

`messages`  
通知訊息的串流。此物件 `ComponentUpdatePolicyEvents`包含下列資訊：    
`preUpdateEvent` (Python：`pre_update_event`)  
（選用） 表示核心想要更新元件的事件。您可以使用 [DeferComponentUpdate](#ipc-operation-defercomponentupdate)操作來回應，以確認或延遲更新，直到您的元件準備好重新啟動為止。此物件 `PreComponentUpdateEvent`包含下列資訊：    
`deploymentId` (Python：`deployment_id`)  
更新元件的 AWS IoT Greengrass 部署 ID。  
`isGgcRestarting` (Python：`is_ggc_restarting`)  
是否需要重新啟動核心，才能套用更新。  
`postUpdateEvent` (Python：`post_update_event`)  
（選用） 指出核心已更新元件的事件。此物件 `PostComponentUpdateEvent`包含下列資訊：    
`deploymentId` (Python：`deployment_id`)  
更新元件的 AWS IoT Greengrass 部署 ID。  
此功能需要 2.7.0 版或更新版本的 Greengrass 核元件。

## DeferComponentUpdate
<a name="ipc-operation-defercomponentupdate"></a>

使用 確認或延遲您探索的元件更新[SubscribeToComponentUpdates](#ipc-operation-subscribetocomponentupdates)。如果您的元件已準備好讓元件更新繼續，您可以指定在核心再次檢查之前等待的時間量。您也可以使用此操作來告知 nucleus 您的元件已準備好進行更新。

如果元件未回應元件更新通知，則 nucleus 會等待您在部署的元件更新政策中指定的時間量。逾時之後，核會繼續進行部署。預設元件更新逾時為 60 秒。如需詳細資訊，請參閱 [建立部署](create-deployments.md)和您可以在呼叫 [CreateDeployment](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_CreateDeployment.html) 操作時提供的 [DeploymentComponentUpdatePolicy](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_DeploymentComponentUpdatePolicy.html) 物件。

**提示**  
您可以遵循教學課程，了解如何開發有條件延遲元件更新的元件。如需詳細資訊，請參閱[教學課程：開發可延遲元件更新的 Greengrass 元件](defer-component-updates-tutorial.md)。

### 請求
<a name="ipc-operation-defercomponentupdate-request"></a>

此操作的請求具有下列參數：

`deploymentId` (Python：`deployment_id`)  
要延遲的 AWS IoT Greengrass 部署 ID。

`message`  
（選用） 要延遲更新的元件名稱。  
預設為發出請求的元件名稱。

`recheckAfterMs` (Python：`recheck_after_ms`)  
延遲更新的時間量，以毫秒為單位。核會等待這段時間，然後傳送另一個`PreComponentUpdateEvent`您可以使用 探索的時間[SubscribeToComponentUpdates](#ipc-operation-subscribetocomponentupdates)。  
指定 `0` 以確認更新。這會通知 nucleus 您的元件已準備好進行更新。  
預設為零毫秒，這表示 確認更新。

### 回應
<a name="ipc-operation-defercomponentupdate-response"></a>

此操作不會在其回應中提供任何資訊。

## PauseComponent
<a name="ipc-operation-pausecomponent"></a>

此功能適用於 [Greengrass 核元件](greengrass-nucleus-component.md)的 v2.4.0 和更新版本。目前 AWS IoT Greengrass 不支援 Windows 核心裝置上的此功能。

在核心裝置上暫停元件的程序。若要繼續元件，請使用 [ResumeComponent](#ipc-operation-resumecomponent) 操作。

您只能暫停一般元件。如果您嘗試暫停任何其他類型的元件，此操作會擲回 `InvalidRequestError`。

**注意**  
此操作無法暫停容器化程序，例如 Docker 容器。若要暫停和繼續 Docker 容器，您可以使用 [docker pause](https://docs.docker.com/engine/reference/commandline/pause/) 和 [docker unpause](https://docs.docker.com/engine/reference/commandline/unpause/) 命令。

此操作不會暫停元件相依性，或取決於您暫停之元件的元件。當您暫停屬於另一個元件相依性的元件時，請考慮此行為，因為相依元件可能會在其相依性暫停時遇到問題。

當您重新啟動或關閉暫停的元件時，例如透過部署，Greengrass 核會繼續該元件並執行其關機生命週期。如需重新啟動元件的詳細資訊，請參閱 [RestartComponent](ipc-local-deployments-components.md#ipc-operation-restartcomponent)。

**重要**  
若要使用此操作，您必須定義授權政策，授予使用此操作的許可。如需詳細資訊，請參閱[Authorization](#ipc-component-lifecycle-authorization)。

### 最低 SDK 版本
<a name="ipc-operation-pausecomponent-sdk-versions"></a>

下表列出 AWS IoT Device SDK 您必須用來暫停和繼續元件的 最低版本。


| SDK | 最低版本 | 
| --- | --- | 
|  [AWS IoT Device SDK for Java v2](https://github.com/aws/aws-iot-device-sdk-java-v2)  |  1.4.3 版  | 
|  [AWS IoT Device SDK for Python v2](https://github.com/aws/aws-iot-device-sdk-python-v2)  |  1.6.2 版  | 
|  [AWS IoT Device SDK 適用於 C\$1\$1 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2)  |  V1.13.1  | 
|  [AWS IoT Device SDK for JavaScript v2](https://github.com/aws/aws-iot-device-sdk-js-v2)  |  v1.12.0  | 

### 請求
<a name="ipc-operation-defercomponentupdate-request"></a>

此操作的請求具有下列參數：

`componentName` (Python：`component_name`)  
要暫停的元件名稱，必須是一般元件。如需詳細資訊，請參閱[元件類型](develop-greengrass-components.md#component-types)。

### 回應
<a name="ipc-operation-defercomponentupdate-response"></a>

此操作不會在其回應中提供任何資訊。

## ResumeComponent
<a name="ipc-operation-resumecomponent"></a>

此功能適用於 [Greengrass 核元件](greengrass-nucleus-component.md)的 v2.4.0 和更新版本。目前 AWS IoT Greengrass 不支援 Windows 核心裝置上的此功能。

在核心裝置上繼續元件的程序。若要暫停元件，請使用 [PauseComponent](#ipc-operation-pausecomponent) 操作。

您只能繼續暫停的元件。如果您嘗試繼續未暫停的元件，此操作會擲回 `InvalidRequestError`。

**重要**  
若要使用此操作，您必須定義授予許可的授權政策。如需詳細資訊，請參閱[Authorization](#ipc-component-lifecycle-authorization)。

### 最低 SDK 版本
<a name="ipc-operation-resumecomponent-sdk-versions"></a>

下表列出 AWS IoT Device SDK 您必須用來暫停和繼續元件的 最低版本。


| SDK | 最低版本 | 
| --- | --- | 
|  [AWS IoT Device SDK for Java v2](https://github.com/aws/aws-iot-device-sdk-java-v2)  |  1.4.3 版  | 
|  [AWS IoT Device SDK for Python v2](https://github.com/aws/aws-iot-device-sdk-python-v2)  |  1.6.2 版  | 
|  [AWS IoT Device SDK 適用於 C\$1\$1 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2)  |  V1.13.1  | 
|  [AWS IoT Device SDK for JavaScript v2](https://github.com/aws/aws-iot-device-sdk-js-v2)  |  v1.12.0  | 

### 請求
<a name="ipc-operation-defercomponentupdate-request"></a>

此操作的請求具有下列參數：

`componentName` (Python：`component_name`)  
要繼續的元件名稱。

### 回應
<a name="ipc-operation-defercomponentupdate-response"></a>

此操作不會在其回應中提供任何資訊。