

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

# 自定义事件总线的通用目标
<a name="eb-custom-bus-universal-targets"></a>

*通用目标直接从订阅者那里*调 Amazon 用 API 操作，中间没有函数。与其将队列、主题或函数命名为目标，不如命名服务和 API 操作，然后编写 EventBridge 发送的 API 请求，可以是固定的 JSON，也可以是根据事件生成请求的 JSONata 表达式。订阅者可以将项目写入 DynamoDB 表、将对象放入 Amazon S3 存储桶、发布到 Amazon SNS 主题或在路径中没有 Lambda 函数的情况下开始执行步进函数。

## 目标 ARN
<a name="eb-custom-bus-universal-targets-arn"></a>

通用目标采用固定形式，`TargetArn`没有地区也没有账户：

```
arn:aws:events:::aws-sdk:{{service}}:{{apiAction}}
```
+ {{service}}是 Amazon SDK 服务标识符，它并不总是服务熟悉的名称。例如，步进函数不是`sfn``states`。有效的示例：`sqs`、`sns`、`s3`、`dynamodb`、`bedrockagentcore`。
+ {{apiAction}}是 camelCase 中的 API 操作名称，首字母为小写：`putItem`，不是。`PutItem` EventBridge 按你在操作索引（CamelCase 中）中所写的名称来查找名称，因此`PutItem`被拒绝，`CreateSubscriber`并显示消息 * “api 对服务 PutItem dynam * odb 无效”。相同的消息表示该服务不存在该操作。

例如，`arn:aws:events:::aws-sdk:dynamodb:putItem`调用 DynamoDB，然后`arn:aws:events:::aws-sdk:sns:publish`调用 Amazon SN `PutItem` S。`Publish`

## 不支持的操作
<a name="eb-custom-bus-universal-targets-unsupported"></a>

两种操作不能成为订阅者的目标，它们`CreateSubscriber`会通过一条说不支持 API 或整个服务的消息来拒绝他们。
+ 读取而不是更改状态的操作，例如名称以`get``list`、或开头的操作`describe`。事件携带已发生的事情，因此目标操作必须更改状态。 EventBridge 保留被屏蔽的操作名称和服务列表并可以添加到该列表中，例如，当某个操作未按目标的要求运行时，因此不能保证曾经被接受的操作永远无法保证；将创建时消息视为权限。
+  EventBridge 发布操作`eventbridge:putEvents`和`eventbridge:putPartnerEvents`。要将事件传送到另一个事件总线，请将总线 ARN 设置为`TargetArn`；自定义事件总线和自定义事件总线-Classic 本身都支持作为目标。请参阅[事件总线目标：总线到总线](eb-custom-bus-target-bus.md)。

## 参数
<a name="eb-custom-bus-universal-targets-parameters"></a>

一个普遍的目标需要`InvokeConfiguration.UniversalTargetParameters`。`CreateSubscriber`拒绝省略该参数或提供其他参数块（例如）的订阅者。`SqsParameters`消息说`UniversalTargetParameters`是预料之中的。调整请求`Input`；通用目标订阅者不使用订阅者的请求`Transformer`，因此请进行任何 JSonata 转换。`Input`

`Input`（必需）  
API 请求，以 JSON 字符串或包装在其中的 JSONata 表达式`{% %}`的形式生成请求。使用目标 API 自己的参考中的成员名称；对于 Amazon SQS`SendMessage`，则为`QueueUrl`和`MessageBody`。最多 262,144 个字符。  
当您根据 API 要求的字段创建订阅者时，系统会检查固定的 JSON`Input`，缺失的字段会按名称拒绝。`Input`仅检查 JSonata 的语法，因为其结果取决于事件，因此目标 API 拒绝的请求会在交付时出现。

`InvocationTimeoutSeconds`  
 EventBridge 等待一次 API 调用需要多长时间，从 1 到 30 秒不等。默认值为 30。这必须是文字整数；这里不接受 JSonata 表达式。

中的交付角色`RoleArn`需要对您调用的 API 执行 IAM 操作`dynamodb:PutItem`，例如和`sqs:SendMessage`对死信队列执行 IAM 操作。有关该角色的信任策略及其余权限，请参阅[自定义事件总线的访问控制](eb-custom-bus-access.md)。

## 批处理和 `$` events 数组
<a name="eb-custom-bus-universal-targets-batching"></a>

EventBridge 每批调用一次 API，而不是每个事件调用一次。`BatchConfiguration`设置批次：`MaxBatchSize`从 1 到 500，`MaxBatchWindowInSeconds`从 0 到 300。当批次达到相应大小或窗口期满时（以先到者为准）即关闭。

在 Jsonata 中`Input`，`$events`是批处理：其中的事件数组。批量大小为 1 时，`$events.Data.orderId`生成一个事件的值。对于较大的批次，可以显式地对数组进行寻址`$join`，例如使用 `$map` and，或者表达式会生成 API 需要字符串但传送失败的数组。

设置`MaxBatchSize`为 1 和 `MaxBatchWindowInSeconds` 0 可为每个事件调用一次 API。只要`Input`是固定的 JSON，就执行此操作，因为批处理中每个事件的固定请求都是相同的，并且批处理会生成一个调用。

## 示例：每个事件一个 DynamoDB 项目
<a name="eb-custom-bus-universal-targets-example"></a>

以下订阅者为发布的每个事件向 DynamoDB 表写入一个项目`PutRawEvents`，从事件字段中获取分区键。`orderId`交付角色需要摆在桌面`dynamodb:PutItem`上。

```
aws eventsv2 create-subscriber \
    --name orders-to-dynamodb \
    --event-bus-arn arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef \
    --invoke-configuration '{
        "TargetArn": "arn:aws:events:::aws-sdk:dynamodb:putItem",
        "RoleArn": "arn:aws:iam::111122223333:role/EventBusDeliveryRole",
        "UniversalTargetParameters": {
            "Input": "{% { \"TableName\": \"orders\", \"Item\": { \"pk\": { \"S\": $events.Data.orderId }, \"total\": { \"N\": $string($events.Data.total) } } } %}"
        }
    }' \
    --batch-configuration MaxBatchSize=1,MaxBatchWindowInSeconds=0 \
    --on-failure-configuration '{ "Arn": "arn:aws:sqs:us-east-1:111122223333:orders-to-dynamodb-dlq" }'
```

对于使用发布的活动`PutEvents`，相同的字段位于下方`detail`：`$events.Data.detail.orderId`。请参阅[事件结构：数据、元数据和系统元数据](eb-custom-bus-addressing.md)。

## 当 API 调用失败时
<a name="eb-custom-bus-universal-targets-failures"></a>

创建订阅者时， EventBridge 检查 ARN 的形状、操作是否存在且未被阻止、固定值是否`Input`包含操作的必填字段，对于 JsoNata`Input`，还要检查表达式是否解析。它不会检查请求中命名的资源是否存在，也不会检查交付角色是否可以调用该操作。这些失败发生在交付时，每次交付失败都会在订阅者下重试`RetryPolicy`，默认情况下，在 300 秒内最多重试 5 次。当达到限制时， EventBridge 将记录写入最后一次失败的死信`errorCode`队列。通用目标最常生成的代码：
+ `CUSTOMER_VALIDATION`: 目标 API 拒绝了请求，例如缺少必填字段或值超出范围。该记录带有目标 API 自己的错误消息。
+ `ACCESS_DENIED`: EventBridge 无法担任交付角色，或者不允许该角色对资源调用操作。记录在命名角色或资源的 EventBridge 消息中说明了哪个。
+ `RESOURCE_NOT_FOUND`：请求中指定的表、主题或其他资源不存在。
+ `INPUT_TRANSFORMATION_FAILURE`: 中的 Jsonata 表达式`Input`出现错误或未生成任何值。
+ `THROTTLING`: 目标 API 限制了调用。`REQUEST_TOO_LARGE`：请求超过了操作的大小限制；下限`MaxBatchSize`。`EXECUTION_TIMEOUT`: 呼叫未在超时内返回。

有关错误代码的完整列表、每个错误代码携带的信息以及如何重新驾驶，请参阅[重试策略和死信队列](eb-custom-bus-retry.md)。打开订阅者日志，查看每次尝试和发送的确切请求；请参阅[自定义事件总线的可观察性：指标、日志和 CloudTrail](eb-custom-bus-observability.md)。