

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

# 排程管道執行
<a name="pipeline-eventbridge"></a>

您可以使用 [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html) 排程 Amazon SageMaker Pipelines 執行。支援 Amazon SageMaker Pipelines 作為 [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html) 中的目標。這可讓您根據事件匯流排中的任何事件，啟動模型建置管道執行。使用 EventBridge，您可以自動執行管道，並自動回應訓練工作或端點狀態變更等事件。事件包括上傳到 Amazon S3 儲存貯體的新檔案、因漂移而導致 Amazon SageMaker AI 端點狀態發生的變更，以及 *Amazon Simple Notification Service* (SNS) 主題。

可以自動啟動下列 Pipelines 動作：  
+  `StartPipelineExecution` 

如需排程 SageMaker AI 任務的詳細資訊，請參閱[使用 Amazon EventBridge 自動化 SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/automating-sagemaker-with-eventbridge.html)。

**Topics**
+ [使用 Amazon EventBridge 為管道排程](#pipeline-eventbridge-schedule)
+ [使用 SageMaker Python SDK 排程管道](#build-and-manage-scheduling)

## 使用 Amazon EventBridge 為管道排程
<a name="pipeline-eventbridge-schedule"></a>

若要使用 Amazon CloudWatch Events 開始管道執行，您必須建立 EventBridge [規則](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_Rule.html)。當您為事件建立規則時，您可以指定當 EventBridge 收到符合規則的事件時要採取的目標動作。當事件符合規則時，EventBridge 會將事件傳送到指定目標並啟動規則中定義的動作。

 下列教學課程示範如何使用 EventBridge 主控台或 AWS CLI為管道執行排程。  

### 先決條件
<a name="pipeline-eventbridge-schedule-prerequisites"></a>
+ EventBridge 在 `SageMaker::StartPipelineExecution` 許可下可以擔任的角色。如果您從 EventBridge 主控台建立規則，則可以自動建立此角色；否則，您需要自己建立此角色。如需建立 SageMaker AI 角色的相關資訊，請參閱 [SageMaker 角色](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html)。
+ 要排程的 Amazon SageMaker AI 管道。若要建立 Amazon SageMaker AI 管道，請參閱[定義管道](https://docs.aws.amazon.com/sagemaker/latest/dg/define-pipeline.html)。

### 使用 EventBridge 主控台建立 EventBridge 規則
<a name="pipeline-eventbridge-schedule-console"></a>

 下列程序示範如何使用 EventBridge 主控台建立 EventBridge 規則。  

1. 導覽至 [EventBridge 主控台](https://console.aws.amazon.com/events)。

1. 選取左側的**規則**。

1.  選取 `Create Rule`。

1. 輸入規則的名稱和說明。

1.  選取啟動此規則的方式。您有下列規則選擇：
   + **事件模式**：當符合模式的事件發生時，您的規則就會啟動。您可以選擇符合特定事件類型的預先定義模式，也可以建立自訂模式。如果您選取預先定義的模式，可以編輯模式以對其進行自訂。如需有關事件模式的詳細資訊，請參閱 [CloudWatch Events 中的事件模式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html)。
   + **排程**：您的規則會按照指定排程定期啟動。您可以使用固定頻率排程，這類排程會按照指定的分鐘數、小時或週數啟動。您也可以使用 [cron 表達式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions)建立更精細的排程，例如 “每個月的第一個星期一早上 8 點”。自訂或合作夥伴事件匯流排不支援排程。

1. 選取您所需的事件匯流排。

1. 選取當事件符合您的事件模式或排程啟動時要調用的目標。最多可為每個規則新增 5 個目標。在下拉式清單中選取 `SageMaker Pipeline`。

1. 從管道下拉式清單中選取要啟動的管道。

1. 使用名稱和值對新增要傳遞至管道執行的參數。參數值可為靜態或動態。如需 Amazon SageMaker AI 管道參數的詳細資訊，請參閱 [AWS::Events::Rule SagemakerPipelineParameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#aws-resource-sagemaker-pipeline-properties)。
   + 每次啟動管道時，靜態值都會傳遞給管道執行。例如，如果已在參數清單中指定 `{"Name": "Instance_type", "Value": "ml.4xlarge"}`，則每次 EventBridge 啟動管道時，它都會作為參數在 `StartPipelineExecutionRequest` 中傳遞。
   + 動態值是使用 JSON 路徑指定的。EventBridge 會剖析事件承載中的值，然後將其傳遞至管道執行。例如：*`$.detail.param.value`*

1. 選取要用於此規則的角色。您可使用現有的角色或建立新角色。

1. (可選) 新增標籤。

1. 選取 `Create` 以完成規則。

 您的規則現已生效，可用於啟動管道執行了。

### 使用 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/events/index.html) 建立 EventBridge 規則
<a name="pipeline-eventbridge-schedule-cli"></a>

 下列程序示範如何使用 AWS CLI建立 EventBridge 規則。

1. 建立要啟動的規則。使用 建立 EventBridge 規則時 AWS CLI，有兩個啟動規則的選項：事件模式和排程。
   +  **事件模式**：當符合模式的事件發生時，您的規則就會啟動。您可以選擇符合特定事件類型的預先定義模式，也可以建立自訂模式。如果您選取預先定義的模式，可以編輯模式以對其進行自訂。  您可以使用下列命令建立具有事件模式的規則：

     ```
     aws events put-rule --name <RULE_NAME> ----event-pattern <YOUR_EVENT_PATTERN> --description <RULE_DESCRIPTION> --role-arn <ROLE_TO_EXECUTE_PIPELINE> --tags <TAGS>
     ```
   +  **排程**：您的規則會按照指定排程定期啟動。您可以使用固定頻率排程，這類排程會按照指定的分鐘數、小時或週數啟動。您也可以使用 cron 表達式建立更精細的排程，例如 “每個月的第一個星期一早上 8 點”。自訂或合作夥伴事件匯流排不支援排程。您可以使用下列命令建立具有排程的規則：

     ```
     aws events put-rule --name <RULE_NAME> --schedule-expression <YOUR_CRON_EXPRESSION> --description <RULE_DESCRIPTION> --role-arn <ROLE_TO_EXECUTE_PIPELINE> --tags <TAGS>
     ```

1. 新增當事件符合您的事件模式或排程啟動時要調用的目標。最多可為每個規則新增 5 個目標。  對於每個目標，您必須指定以下內容：  
   +  ARN：管道的資源 ARN。
   +  角色 ARN：EventBridge 執行管道所用的角色 ARN。
   +  參數：要傳遞的 Amazon SageMaker AI 管道參數。

1. 執行下列命令，以使用 [put-targets](https://docs.aws.amazon.com/cli/latest/reference/events/put-targets.html) 將 Amazon SageMaker AI 管道作為傳遞至您的規則：

   ```
   aws events put-targets --rule <RULE_NAME> --event-bus-name <EVENT_BUS_NAME> --targets "[{\"Id\": <ID>, \"Arn\": <RESOURCE_ARN>, \"RoleArn\": <ROLE_ARN>, \"SageMakerPipelineParameter\": { \"SageMakerParameterList\": [{\"Name\": <NAME>, \"Value\": <VALUE>}]} }]"] 
   ```

## 使用 SageMaker Python SDK 排程管道
<a name="build-and-manage-scheduling"></a>

下列各節說明如何設定存取 EventBridge 資源的許可，並使用 SageMaker Python SDK 建立管道排程。

### 所需的許可
<a name="build-and-manage-scheduling-permissions"></a>

您需要具有使用管道排程器的必要許可。完成以下步驟來設定您的許可：

1. 將下列最低權限政策連接至用於建立管道觸發條件的 IAM 角色，或使用 AWS 受管政策 `AmazonEventBridgeSchedulerFullAccess`。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement":
       [
           {
               "Action":
               [
                   "scheduler:ListSchedules",
                   "scheduler:GetSchedule",
                   "scheduler:CreateSchedule",
                   "scheduler:UpdateSchedule",
                   "scheduler:DeleteSchedule"
               ],
               "Effect": "Allow",
               "Resource":
               [
                   "*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::*:role/*", 
               "Condition": {
                   "StringLike": {
                       "iam:PassedToService": "scheduler.amazonaws.com"
                   }
               }
           }
       ]
   }
   ```

------

1. 將服務主體 `scheduler.amazonaws.com` 新增至此角色的信任政策，以建立與 EventBridge 的信任關係。如果您在 SageMaker Studio 中啟動筆記本，請確定您將下列信任政策連接至執行角色。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "scheduler.amazonaws.com",
                    "sagemaker.amazonaws.com"
                ]
            },
        "Action": "sts:AssumeRole"
        }
    ]
}
```

------

### 建立管道排程
<a name="build-and-manage-scheduling-create"></a>

使用 `PipelineSchedule` 建構子，您可以將管道排程為執行一次或按預定間隔執行。管道排程的類型必須為 `at`、`rate` 或 `cron`。這個排程類型集是 [EventBridge 排程選項](https://docs.aws.amazon.com/scheduler/latest/UserGuide/schedule-types.html)的延伸。如需如何使用 `PipelineSchedule` 類別的詳細資訊，請參閱 [sagemaker.workflow.triggers.PipelineSchedule](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#pipeline-schedule)。下列範例示範如何使用 `PipelineSchedule` 建立每個排程類型。

```
from sagemaker.workflow.triggers import PipelineSchedule

# schedules a pipeline run for 12/13/2023 at time 10:15:20 UTC
my_datetime_schedule = PipelineSchedule(
    name="<schedule-name>", 
    at=datetime(2023, 12, 13, 10, 15, 20)
)

# schedules a pipeline run every 5 minutes
my_rate_schedule = PipelineSchedule(
    name="<schedule-name>", 
    rate=(5, "minutes")
)

# schedules a pipeline run at 10:15am UTC on the last Friday of each month during the years 2022 to 2023
my_cron_schedule = PipelineSchedule(
    name="<schedule-name>", 
    cron="15 10 ? * 6L 2022-2023"
)
```

**注意**  
如果您建立一次性排程，且需要存取目前時間，請使用 `datetime.utcnow()` 而非 `datetime.now()`。後者不會存放目前的區域內容，並導致不正確的時間傳遞至 EventBridge。

### 將觸發條件連接至您的管道
<a name="build-and-manage-scheduling-attach"></a>

若要將您的 `PipelineSchedule` 連線到您的管道，請使用觸發條件清單，在您建立的管道物件上調用 `put_triggers` 呼叫。如果您得到回應 ARN，表示已成功在您的帳戶中建立排程，而且 EventBridge 會按照指定的時間或速率開始調用目標管道。您必須指定一個角色，其具有將觸發條件連接至父管道的正確許可。如果您未提供一個，Pipelines 會擷取用來從[組態檔案](https://docs.aws.amazon.com/sagemaker/latest/dg/train-remote-decorator-config.html)建立管道的預設角色。

下列範例示範如何將排程連接至管道。

```
scheduled_pipeline = Pipeline(
    name="<pipeline-name>",
    steps=[...],
    sagemaker_session=<sagemaker-session>,
)
custom_schedule = PipelineSchedule(
    name="<schedule-name>", 
    at=datetime(year=2023, month=12, date=25, hour=10, minute=30, second=30)
)
scheduled_pipeline.put_triggers(triggers=[custom_schedule], role_arn=<role>)
```

### 描述目前的觸發條件
<a name="build-and-manage-scheduling-describe"></a>

若要擷取所建立管道觸發條件的相關資訊，您可以使用觸發條件名稱調用 `describe_trigger()` API。此命令會傳回所建立排程運算式的詳細資訊，例如其開始時間、啟用狀態和其他實用資訊。下列程式碼片段顯示範例調用：

```
scheduled_pipeline.describe_trigger(name="<schedule-name>")
```

### 清除觸發條件資源
<a name="build-and-manage-scheduling-clean"></a>

刪除您的管道之前，請先清除現有的觸發條件，以避免您的帳戶中發生資源洩漏。您應該先刪除觸發條件，再摧毀父管道。您可以透過將觸發條件名稱清單傳遞至 `delete_triggers` API 來刪除觸發條件。下列程式碼片段示範如何刪除觸發條件。

```
pipeline.delete_triggers(trigger_names=["<schedule-name>"])
```

**注意**  
刪除觸發條件時，請注意下列限制：  
只有在 SageMaker Python SDK 中才提供透過指定觸發條件名稱刪除觸發條件的選項。在 CLI 或 `DeletePipeline` API 呼叫中刪除管道並不會刪除您的觸發條件。因此，觸發條件會變得孤立，而 SageMaker AI 會嘗試為不存在的管道啟動執行。
此外，如果您使用另一個筆記本工作階段或已刪除管道目標，請透過排程器 [CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/scheduler/delete-schedule.html) 或 EventBridge 主控台清除孤立的排程。