AWS Event Bus 无法将日志写入来自 AWS Lambda 的自定义日志组上的 CloudWatch

问题描述

我有一个 AWS lambda,它的工作是使用来自外部源的日志并将这些日志写入自定义 CloudWatch 日志组。请注意,此 lambda 已经将日志写入其自己的日志组,这不是我的问题。我想要的是将外部派生的日志写入另一个 CloudWatch 组。

按照 AWS 文档并使用 CloudFormation,我创建了一个事件总线和一个针对 CloudWatch 的规则:

redacted

为了清楚起见,我省略了大部分 CloudFormation 模板,只留下看起来相关的部分。

我发现 Lambda 接收日志(通过 Kinesis),处理它们并将它们发送到以下代码片段中的事件总线:

redacted

上面最后一行表示事件发送到事件总线:

redacted

然而,我相信事件总线接收到事件,并没有将事件发送到 CloudWatch。即使我手动创建日志组:${AWS::StackName}-form-log-batch-function(我已将堆栈引用作为参数保留以保持匿名)。

我已检查 CloudFormation 创建并且所有资源都存在(由 Lambda 确认在尝试发送事件时未出现任何异常)。

有人明白我在这里遗漏了什么吗?

解决方法

不能使用您的 WebLogsEventBusLoggingRole 角色写入到 CloudWatch Logs (CWL)。正如 AWS docs 解释的那样,您必须使用基于 CWL 资源的权限:

当 CloudWatch Logs 是规则的目标时,EventBridge 创建日志流,CloudWatch Logs 将来自触发事件的文本存储为日志条目。要允许 EventBridge 创建日志流并记录事件,CloudWatch Logs 必须包含基于资源的策略,以允许 EventBridge 写入 CloudWatch Logs。

遗憾的是,您无法从 vanila CloudFormation (CFN) 设置此类权限。这是不支持

要从 CFN 执行此操作,您必须以 lambda 函数的形式创建 custom resource。该函数将使用 AWS SDK 设置 CWL 权限。