在 Step Functions 中使用 CloudWatch Logs 记录执行历史记录 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 Step Functions 中使用 CloudWatch Logs 记录执行历史记录

标准工作流在 Amazon Step Functions 中记录执行历史记录,但您也可以选择将其配置为记录到 Amazon CloudWatch Logs 中。

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

日志传输保障

系统将以最大努力传输 Amazon CloudWatch Logs。无法保证日志条目的完整性和及时性。如果您需要在快速工作流中保证工作流历史记录,我们建议您实施工作流步骤,在适合的数据存储服务(例如 Amazon DynamoDB)中记录数据。或者,您可以考虑使用标准工作流来保证执行历史记录。

定价信息

配置日志记录时,将收取 CloudWatch Logs 费用,并且将按照公开日志费率计费。有关更多信息,请参阅 CloudWatch 定价页面上日志选项卡下的公开日志

配置日志记录

使用 Step Functions 控制台创建标准工作流程时,该状态机将会配置为向 CloudWatch Logs 发送日志。使用 Step Functions 控制台创建快速工作流程时,该状态机默认情况下将配置为向 CloudWatch Logs 发送日志。

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

对于从控制台启动的每个执行,Step Functions 都会提供一个指向 CloudWatch Logs 的链接,并配置了正确的筛选器,以获取该执行特定的日志事件。

可以选择配置客户自主管理型 Amazon KMS 密钥来加密您的日志。有关详细信息和权限设置,请参阅静态数据加密

要配置日志记录,可以在使用 CreateStateMachineUpdateStateMachine 时传递 LoggingConfiguration 参数。您可以使用 CloudWatch Logs Insights 进一步分析 CloudWatch Logs 中的数据。有关更多信息,请参阅使用 CloudWatch Logs Insights 分析日志数据

CloudWatch Logs 有效负载

执行历史事件的定义中可能包含输入或输出属性。如果发送到 CloudWatch Logs 的转义输入或转义输出超过 248 KiB,则会因为 CloudWatch Logs 配额而被截断。

用于记录到 CloudWatch Logs 的 IAM 策略

您还需要配置状态机的执行 IAM 角色,使其拥有记录到 CloudWatch Logs 的适当权限,如下例所示。

IAM 策略示例

以下是可用于配置权限的示例策略。如以下示例所示,您需要在 Resource 字段中指定 *。CloudWatch API 操作(例如 CreateLogDelivery 和 DescribeLogGroups)不支持 Resource types defined by Amazon CloudWatch Logs。有关更多信息,请参阅 Amazon CloudWatch Logs 定义的操作

  • 有关 CloudWatch 资源的信息,请参阅《Amazon CloudWatch 用户指南》中的 CloudWatch Logs 资源和操作

  • 有关设置向 CloudWatch Logs 发送日志所需权限的信息,请参阅《发送到 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 执行事件的日志级别

日志级别的范围从 ALLERRORFATALOFF。对于 ALL,将记录所有事件类型;而当设置为 OFF 时,不会记录任何事件类型。对于 ERRORFATAL,请参阅下表。

有关根据这些日志级别为快速工作流执行显示的执行数据的更多信息,请参阅标准和快速控制台体验的差别

事件类型 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 Logs 日志记录进行故障排除

如果状态机无法向 CloudWatch Logs 发送日志,或您收到以下错误:“AccessDeniedException : The state machine IAM Role is not authorized to access the Log Destination”,请尝试执行以下步骤:

  1. 验证状态机的执行角色是否具有将日志记录到 CloudWatch Logs 的权限。

    在调用 CreateStateMachineUpdateStateMachine API 端点时,请确保在 roleArn 参数中指定的 IAM 角色提供了必要的权限,如前面的 IAM 策略示例所示。

  2. 验证 CloudWatch Logs 资源策略未超过 5120 个字符的限制。

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

    在 Step Functions 控制台中创建日志组时,建议的日志组名称已经具有前缀 /aws/vendedlogs/states。有关日志记录最佳实践的更多信息,请参阅 避免 CloudWatch 资源策略大小限制

  3. 验证账户中 CloudWatch Logs 日志资源策略的数量是否少于十个

    CloudWatch Logs 针对每个区域、每个账户提供十个资源策略的配额。如果您尝试在已有十个资源策略的状态机上启用日志记录,则不会创建或更新状态机,且会出现错误。有关日志记录配额的更多信息,请参阅 CloudWatch Logs 配额

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

    aws logs describe-resource-policies

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

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

    aws logs put-delivery-source

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

    aws logs delete-resource-policy --policy-name <PolicyNameToBeDeleted>