

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

# 在 Step Functions 中使用 CloudWatch 日志记录执行历史记录
<a name="cw-logs"></a>

标准工作流程在中记录执行历史记录 AWS Step Functions，但您可以选择配置对 Amazon Logs 的 CloudWatch 日志记录。

与标准工作流不同，快速工作流不会在 AWS Step Functions中记录执行历史记录。要查看 Express Workflow 的执行历史和结果，您必须配置对 Amazon CloudWatch Logs 的日志记录。发布日志不会阻止或减慢执行速度。

**日志传输保障**  
Amazon CloudWatch 日志是在尽力交付的基础上进行的。无法保证日志条目的完整性和及时性。如果您需要在快速工作流中保证工作流历史记录，我们建议您实施工作流步骤，在适合的数据存储服务（例如 Amazon DynamoDB）中记录数据。或者，您可以考虑使用**标准工作流**来保证执行历史记录。

**定价信息**  
配置日志记录时，将[收取CloudWatch 日志费用](https://aws.amazon.com/cloudwatch/pricing)，并按已售日志费率计费。有关更多信息，请参阅 “ CloudWatch 定价” 页面上 “**日**志**” 选项卡下的 Ven** ded Logs。

## 配置 日志记录
<a name="monitoring-logging-configure"></a>

使用 Step Functions 控制台创建标准工作流程时，该状态机**不会**配置为向日志发送 CloudWatch 日志。使用 Step Functions 控制台创建 Express Workflow 时，该状态机将默认配置为向日志发送 CloudWatch 日志。

对于 Express 工作流程，Step Functions 可以创建一个具有必要 AWS Identity and Access Management (IAM) CloudWatch 日志策略的角色。如果您使用 API、CLI 或 CloudFormation创建标准工作流，Step Functions 默认不会启用日志记录，并且您需要确保您的角色具有必要的权限。

对于从控制台启动的每次执行，Step Functions 都会提供一个指向 CloudWatch 日志的链接，该链接配置了正确的过滤器，用于获取特定于该执行的日志事件。

您可以选择配置客户托管 AWS KMS 密钥来加密您的日志。有关详细信息和权限设置，请参阅[静态数据加密](encryption-at-rest.md)。

要配置日志记录，可以在使用[CreateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachine.html)或时传递[LoggingConfiguration](https://docs.aws.amazon.com/step-functions/latest/apireference/API_LoggingConfiguration.html)参数[UpdateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html)。您可以使用 Logs Insights 进一步分析 CloudWatch CloudWatch 日志中的数据。有关更多信息，请参阅使用 Log [ CloudWatchs Insights 分析日志数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)。

## CloudWatch 记录有效负载
<a name="cloudwatch-payload"></a>

执行历史事件的定义中可能包含输入或输出属性。如果发送到 CloudWatch 日志的转义输入或转义输出超过 248 KiB，则会由于日志配额而被截断。 CloudWatch 
+  您可以通过查看 `inputDetails` 和 `outputDetails` 属性来确定有效负载是否已被截断。有关更多信息，请参阅 [`HistoryEventExecutionDataDetails` 数据类型](https://docs.aws.amazon.com/step-functions/latest/apireference/API_HistoryEventExecutionDataDetails.html)。
+  对于标准工作流，您可以使用 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_GetExecutionHistory.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_GetExecutionHistory.html) 查看完整的执行历史记录。
+  `GetExecutionHistory` 不适用于快速工作流。如果您想查看完整的输入和输出，可以使用 Amazon S3 ARNs。有关更多信息，请参阅 [使用 Amazon S3 ARNs 而不是在 Step Functions 中传递大型有效负载](sfn-best-practices.md#avoid-exec-failures)。

## 用于登录日志的 IAM 策略 CloudWatch
<a name="cloudwatch-iam-policy"></a>

您还需要将状态机的执行 IAM 角色配置为具有登录日志的适当权限，如以下示例所示。 CloudWatch 

**IAM 策略示例**  
以下是可用于配置权限的示例策略。如以下示例所示，您需要在`Resource`字段中指定 **\$1**。 CloudWatch API 操作（例如 CreateLogDelivery 和 DescribeLogGroups）不支持[由定义的资源类型Amazon CloudWatch Logs](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatchlogs.html#amazoncloudwatchlogs-resources-for-iam-policies)。有关更多信息，请参阅 [Amazon CloudWatch Logs 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatchlogs.html#amazoncloudwatchlogs-actions-as-permissions)。
+ 有关CloudWatch资源的信息，请参阅 *Amazon CloudWatch 用户指南*中的[CloudWatch Logs资源和操作](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format)。
+ 有关设置向日志发送日志所需的权限的信息，请参阅标题为 “发送到 CloudWatch 的*日志*” 部分中的[用户权限](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-CWL)CloudWatch Logs。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogDelivery",
                "logs:CreateLogStream",
                "logs:GetLogDelivery",
                "logs:UpdateLogDelivery",
                "logs:DeleteLogDelivery",
                "logs:ListLogDeliveries",
                "logs:PutLogEvents",
                "logs:PutResourcePolicy",
                "logs:DescribeResourcePolicies",
                "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        }
    ]
}
```

## Step Functions 执行事件的日志级别
<a name="cloudwatch-log-level"></a>

日志级别的范围从 `ALL`、`ERROR`、`FATAL` 到 `OFF`。对于 `ALL`，将记录所有事件类型；而当设置为 `OFF` 时，不会记录任何事件类型。对于 `ERROR` 和 `FATAL`，请参阅下表。

有关根据这些**日志级别**为快速工作流执行显示的执行数据的更多信息，请参阅[标准和快速控制台体验的差别](concepts-view-execution-details.md#console-exp-differences)。


| 事件类型 | `ALL` | `ERROR` | `FATAL` | `OFF` | 
| --- | --- | --- | --- | --- | 
|  ChoiceStateEntered  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  ChoiceStateExited  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  ExecutionAborted  | 已记录 | 已记录 | 已记录 | 不记录 | 
|  ExecutionFailed  | 已记录 | 已记录 | 已记录 | 不记录 | 
|  ExecutionStarted  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  ExecutionSucceeded  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  ExecutionTimedOut  | 已记录 | 已记录 | 已记录 | 不记录 | 
|  FailStateEntered  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  LambdaFunctionFailed  | 已记录 | 已记录 | 不记录 | 不记录 | 
| LambdaFunctionScheduled | 已记录 | 不记录 | 不记录 | 不记录 | 
|  LambdaFunctionScheduleFailed  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  LambdaFunctionStarted  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  LambdaFunctionStartFailed  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  LambdaFunctionSucceeded  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  LambdaFunctionTimedOut  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  MapIterationAborted  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  MapIterationFailed  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  MapIterationStarted  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  MapIterationSucceeded  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  MapRunAborted  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  MapRunFailed  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  MapStateAborted  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  MapStateEntered  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  MapStateExited  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  MapStateFailed  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  MapStateStarted  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  MapStateSucceeded  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  ParallelStateAborted  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  ParallelStateEntered  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  ParallelStateExited  | 已记录 | 不记录 | 不记录 | 不记录 | 
| ParallelStateFailed | 已记录 | 已记录 | 不记录 | 不记录 | 
|  ParallelStateStarted  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  ParallelStateSucceeded  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  PassStateEntered  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  PassStateExited  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  SucceedStateEntered  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  SucceedStateExited  | 已记录 | 不记录 | 不记录 | 不记录 | 
|  TaskFailed  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  TaskScheduled  | 已记录 | 不记录 | 不记录 | 不记录 | 
| TaskStarted | 已记录 | 不记录 | 不记录 | 不记录 | 
|  TaskStartFailed  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  TaskStateAborted  | 已记录 | 已记录 | 不记录 | 不记录 | 
|  TaskStateEntered  | 已记录 | 不记录 | 不记录 | 不记录 | 
| TaskStateExited | 已记录 | 不记录 | 不记录 | 不记录 | 
| TaskSubmitFailed | 已记录 | 已记录 | 不记录 | 不记录 | 
| TaskSubmitted | 已记录 | 不记录 | 不记录 | 不记录 | 
| TaskSucceeded | 已记录 | 不记录 | 不记录 | 不记录 | 
| TaskTimedOut | 已记录 | 已记录 | 不记录 | 不记录 | 
| WaitStateAborted | 已记录 | 已记录 | 不记录 | 不记录 | 
| WaitStateEntered | 已记录 | 不记录 | 不记录 | 不记录 | 
| WaitStateExited | 已记录 | 不记录 | 不记录 | 不记录 | 

## 对记录到 CloudWatch 日志进行故障排除
<a name="cloudwatch-log-troubleshooting"></a><a name="troubleshooting-logging-to-cloudwatch"></a>

如果您的状态机无法将日志发送到 CloudWatch 日志，或者您收到错误消息：`AccessDeniedException : The state machine IAM Role is not authorized to access the Log Destination`“”，请尝试以下步骤：

1. 验证您的状态机的执行角色是否有权登录到 CloudWatch 日志。

   当您调用[CreateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateStateMachine.html)或 [UpdateStateMachine](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html)API 终端节点时，请确保`roleArn`参数中指定的 IAM 角色提供必要的权限，如前面的 IAM 策略示例所示。

1. 验证 CloudWatch 日志资源策略不超过 5,120 个字符的限制。

   如果策略超过字符限制，请在日志组名称前加上前缀 `/aws/vendedlogs/states`，来授予对状态机的权限并避免该限制。

   在 Step Functions 控制台中创建日志组时，建议的日志组名称已经具有前缀 `/aws/vendedlogs/states`。有关日志记录最佳实践的更多信息，请参阅 [避免 CloudWatch 资源策略大小限制](sfn-best-practices.md#bp-cwl)。

1. 验证账户中 CloudWatch 日志日志资源策略的数量是否少于**十**。

   CloudWatch 每个账户每个区域的日志配额为十个资源策略。如果您尝试在已有十个资源策略的状态机上启用日志记录，则不会创建或更新状态机，且会出现错误。有关日志配额的更多信息，请参阅[CloudWatch 日志配额](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html)

   要验证问题，请使用 CLI 命令检查资源策略的数量：

    [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/describe-resource-policies.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/describe-resource-policies.html)

   要解决问题，请修改现有的资源策略。

   首先，备份现有策略。然后，将类似的操作或资源加入到新策略中，并使用以下 CLI 命令在账户中创建新的传输源：

   [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/put-delivery-source.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/put-delivery-source.html)

   备份和更新策略后，使用以下命令移除所有未使用的策略：

    [https://docs.aws.amazon.com/cli/latest/reference/logs/delete-resource-policy.html](https://docs.aws.amazon.com/cli/latest/reference/logs/delete-resource-policy.html)