1

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

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

redacted

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

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

redacted

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

redacted

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

我已经检查了 CloudFormation 创建并且所有资源都存在(由 Lambda 确认,当它尝试发送事件时没有遇到任何异常)。

有人明白我在这里缺少什么吗?

4

3 回答 3

2

无法WebLogsEventBusLoggingRole使用您的角色写入CloudWatch Logs (CWL) 。正如AWS 文档所解释的,您必须使用 CWL 基于资源的权限:

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

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

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

于 2021-03-02T23:00:01.700 回答
0

只需创建一个loggroup名称/aws/events/<yourgroupname>,它就可以正常工作并设置logs:*

于 2021-12-27T07:17:29.880 回答
0

我希望这对仍在寻找答案的其他人有所帮助。

问题#1 我希望 Cloudformation 正常工作

您可以使用来自https://serverlessland.com/patterns/eventbridge-cloudwatchterraform的云形成

问题#2 为什么 EventBridge 通常无法写入 Cloudwatch 日志

就像上面所说的那样,为了让 aws 事件桥写入 cloudwatch,需要有一个资源策略(在目标上设置的策略,在本例中为 Cloudwatch 日志)。不过请注意

  • 如果您在控制台中创建 cloudwatch logs 目标,则会为您自动生成资源策略,但自动生成的有一个 Twist
    {
        "Version": "2012-10-17",
        "Statement":
        [
            {
                "Sid": "TrustEventsToStoreLogEvent",
                "Effect": "Allow",
                "Principal":
                {
                    "Service":
                    [
                        "events.amazonaws.com",
                        "delivery.logs.amazonaws.com"
                    ]
                },
                "Action":
                [
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": "arn:aws:logs:us-east-1:777777777:log-group:/*:*"
            }
        ]
    }

您会注意到资源采用/*: * 的形式,这意味着如果您要使用自动生成的日志组,则日志组必须以 / 开头。因此,如果您的日志组不是 /event/myloggroup/ 格式,那么该策略将无法帮助您。

所以例如

目标日志组名称 ARN 它有效吗?
事件桥规则 2 arn:aws:logs:us-east-1:281458815962:log-group:event-bridge-rule2:* 注意 arn 缺少开始 /
/aws/事件/帮助我 arn:aws:logs:us-east-1:281458815962:log-group:/aws/events/helpme:* 奇迹般有效

我的建议是制定一项对您有意义且不依赖于自动的政策。

于 2021-09-24T04:42:22.480 回答