

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 安排管道运行
<a name="pipeline-eventbridge"></a>

[您可以使用亚马逊安排亚马逊 SageMaker 管道的执行 EventBridge。](https://docs.amazonaws.cn/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)[亚马逊支持将亚马逊 SageMaker 管道作为目标 EventBridge。](https://docs.amazonaws.cn/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)这样，您就可以根据事件总线中的任何事件启动建模管线的执行。借 EventBridge助，您可以自动执行管道并自动响应诸如训练作业或端点状态更改之类的事件。事件包括上传到您的 Amazon S3 存储桶的新文件、由于偏移而导致的 Amazon SageMaker AI 终端节点状态发生变化以及*亚马逊简单通知服务* (SNS) 主题。

可自动启动以下 Pipelines 操作：  
+  `StartPipelineExecution` 

有关安排 SageMaker AI 作业的更多信息，请参阅使用 A [mazon EventBridge 自动化 SageMaker AI](https://docs.amazonaws.cn/sagemaker/latest/dg/automating-sagemaker-with-eventbridge.html)。

**Topics**
+ [向 Amazon 安排管道 EventBridge](#pipeline-eventbridge-schedule)
+ [使用 SageMaker Python 软件开发工具包安排管道](#build-and-manage-scheduling)

## 向 Amazon 安排管道 EventBridge
<a name="pipeline-eventbridge-schedule"></a>

要使用 Amazon Event CloudWatch s 开始管道执行，您必须创建 EventBridge[规则](https://docs.amazonaws.cn/eventbridge/latest/APIReference/API_Rule.html)。在为事件创建规则时，您可以指定在 EventBridge 收到与该规则匹配的事件时要采取的目标操作。当事件与规则匹配时， EventBridge 会将该事件发送到指定的目标并启动规则中定义的操作。

 以下教程展示了如何 EventBridge 使用 EventBridge控制台或来安排管道执行 Amazon CLI。  

### 先决条件
<a name="pipeline-eventbridge-schedule-prerequisites"></a>
+  EventBridge 可以凭`SageMaker::StartPipelineExecution`权限代入的角色。如果您从 EventBridge控制台创建规则，则可以自动创建此角色；否则，您需要自己创建此角色。 有关创建 A SageMaker I 角色的信息，请参阅[SageMaker 角色](https://docs.amazonaws.cn/sagemaker/latest/dg/sagemaker-roles.html)。
+ 有待安排的亚马逊 SageMaker AI 管道。要创建 Amazon SageMaker AI 管道，请参阅[定义管道](https://docs.amazonaws.cn/sagemaker/latest/dg/define-pipeline.html)。

### 使用 EventBridge 控制台创建 EventBridge 规则
<a name="pipeline-eventbridge-schedule-console"></a>

 以下过程说明如何使用 EventBridge 控制台创建 EventBridge 规则。  

1. 导航至 [EventBridge 控制台](https://console.amazonaws.cn/events)。

1. 选择左侧的**规则**。

1.  选择 `Create Rule`。

1. 为您的规则输入名称和描述。

1.  选择启动此规则的方式。您可以为规则提供以下选择：
   + **事件模式**：当发生与模式匹配的事件时，您的规则会启动。您可以选择与特定类型事件相匹配的预定义模式，也可以创建自定义模式。如果选择预定义模式，则可以编辑该模式以对其进行自定义。有关事件模式的更多信息，请参阅[事件中的 CloudWatch 事件模式](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html)。
   + **计划**：您的规则将按指定的计划定期启动。您可以使用固定速率的计划，该计划会定期启动并持续指定的分钟数、小时数或周数。您还可以使用 [cron 表达式](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions)来创建更精细的计划，例如“每月第一个星期一上午 8 点”。自定义或合作伙伴事件总线不支持计划。

1. 选择所需的事件总线。

1. 选择当某个事件与您的事件模式匹配或当计划启动时要调用的目标。最多可为每项规则添加 5 个目标。在目标下拉列表中选择 `SageMaker Pipeline`。

1. 从管道下拉列表中选择要启动的管道。

1. 使用名称和值对添加要传递给管道执行的参数。参数值可以是静态的，也可以是动态的。有关 Amazon A SageMaker I Pipeline 参数的更多信息，请参阅[AWS::Events::Rule SagemakerPipelineParameters](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#aws-resource-sagemaker-pipeline-properties)。
   + 每次启动管道时，都会将静态值传递给管道执行。例如，如果`{"Name": "Instance_type", "Value": "ml.4xlarge"}`在参数列表中指定，则`StartPipelineExecutionRequest`每次 EventBridge 启动管道时都会将其作为参数传递。
   + 动态值是使用 JSON 路径指定的。 EventBridge 解析事件负载中的值，然后将其传递给管道执行。例如：*`$.detail.param.value`*

1. 选择要用于此规则的角色。您可以使用现有角色，也可以创建新的角色。

1. （可选）添加标签。

1. 选择 `Create` 以最终确定您的规则。

 您的规则现已生效，可以启动管道执行了。

### 使用创建 EventBridge 规则 [Amazon CLI](https://docs.amazonaws.cn/cli/latest/reference/events/index.html)
<a name="pipeline-eventbridge-schedule-cli"></a>

 以下过程说明如何使用创建 EventBridge 规则 Amazon CLI。

1. 创建要启动的规则。使用创建 EventBridge 规则时 Amazon 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 来执行管道。
   +  参数：要传递的 SageMaker Amazon AI 管道参数。

1. 运行以下命令，使用 p [ut-](https://docs.amazonaws.cn/cli/latest/reference/events/put-targets.html) targets SageMaker 将 Amazon 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 软件开发工具包安排管道
<a name="build-and-manage-scheduling"></a>

以下各节介绍如何使用 SageMaker Python SDK 设置 EventBridge 资源访问权限和创建管道计划。

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

您需要获得必要的权限才能使用管道调度程序。完成以下步骤设置权限：

1. 将以下最低权限策略附加到用于创建管道触发器或使用 Amazon 托管策略的 IAM 角色`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.  EventBridge 通过将服务主体`scheduler.amazonaws.com`添加到该角色的信任策略中，与建立信任关系。如果您在 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.amazonaws.cn/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.amazonaws.cn/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 传递触发器名称列表来删除触发器。API 传递触发器名称列表，即可删除触发器。下面的代码段演示了如何删除触发器。

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

**注意**  
删除触发器时请注意以下限制：  
通过指定触发器名称来删除触发器的选项仅在 SageMaker Python SDK 中可用。在 CLI 或 `DeletePipeline` API 调用中删除管道不会删除触发器。结果，触发器变成孤立状态， SageMaker AI 会尝试为不存在的管道开始运行。
此外，如果您正在使用另一个 notebook 会话或已经删除了管道目标，请通过调度程序 CL [I](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/scheduler/delete-schedule.html) 或 EventBridge 控制台清理孤立的计划。