为 AWS lambda 指定日志组?

有没有指定 AWS lambda 所登录的 CloudWatch 日志组的方法?它似乎是直接从 lambda 名称生成的; 但是,将多个 lambda 聚合到一个日志组尤其方便。当 lambda 由 CloudForm 模板创建时,我们特别感兴趣的是指定日志组。

59652 次浏览

我觉得这不可能。

即使 曾经是成为可能,每个 AWS Lambda 实例仍然会写入自己的日志流。虽然不同的调用 同一个波长可以写入相同的日志流(当 lambda 实例被重用时) ,但是对于不同的 lambda 实例来说肯定不是这种情况(因为它们必须使用不同的 lambda 实例)。

因此,您必须拥有一个聚合多个日志流的工具。如果是这样,那么让它更通用一点,以便它能够聚合来自不同日志组的日志流有什么问题吗?

事实上,也许你可以,至少在某种程度上。我也在寻找答案,并尝试了这一点。下面是两个资源的片段: lambda 函数和日志组:

"MyLambdaFunction": {
"Type": "AWS::Lambda::Function",
"DependsOn": "ReadWriteRole",
"Properties": {
//snip
}
},


"MyLambdaFunctionLogGroup": {
"Type": "AWS::Logs::LogGroup",
"DependsOn": "MyLambdaFunction",
"Properties": {
"LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
"RetentionInDays": 14
}
},

我发现日志组是按照指示创建的,保留时间为14天。当 lambda 函数运行时,它会在这个组中创建日志流。然而,当我删除堆栈时,似乎日志组被 没有删除了,并且保留现在被设置为 永不过期。也许这样就足够了,这样溪流就不会失去控制。

按照其中一个答案创建日志组是可行的。要在删除堆栈后保留保留策略,只需添加一个 DeletionPolicy。

"MyLambdaFunctionLogGroup": {
"Type": "AWS::Logs::LogGroup",
"DependsOn": "MyLambdaFunction",
"DeletionPolicy": "Retain",
"Properties": {
"LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
"RetentionInDays": 14
}
}

我发现@lingrlongr 的答案有一部分是正确的。

首先,要回答最初的问题,您不能为要写入的 lambda 函数指定自定义日志组名称。

Lambda 日志组名总是遵循以下模式:

/aws/lambda/<function-name>

Lambda 函数将首先检查是否存在具有此名称的日志组。

  • 如果它存在,那么它将使用。
  • 如果它不存在,它将创建一个具有该模式的日志组。

因此,如果您想要添加设置,比如 RetentionInDaysSubscriptionFilter,请确保 CloudForm 或 SAM 模板创建了 LogGroup 之前 the lambda 函数。如果先创建了 lambda 函数,则在创建 LogGroup 时将抛出一个错误,表明 LogGroup 已经存在。因此,lambda 函数应该是 DependsOn: LogGroup,而不是反过来。

另外,请确保您没有使用 RefGetAtt来引用 LogGroup 内部的 lambda 函数,因为这会创建对 lambda 函数的隐式依赖,从而导致在 LogGroup 之前创建 lambda 函数。

我将 LogGroup 附加到 SAM 模板中的 Serverless 函数,如下所示:

    MyFuncLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: '/aws/lambda/stackName-env-myFunc-v1'
RetentionInDays: 30


MyFunc:
Type: AWS::Serverless::Function
Properties:
FunctionName: 'stackName-env-myFunc-v1'
...

有些用户提到了 DependsOn属性的要求,但在我使用 SAM 时并不需要。唯一的要求是 LogGroupName 必须是 /aws/lambda/<FunctionName>。SAM 将在 lambda 函数 只要不在 LogGroup 中引用函数的逻辑 ID之前创建日志组

另外,如果要将 LogGroup 添加到现有函数中,只需像上面那样使用 LogGroup 资源更新 template.yaml 并将 FunctionName 属性添加到函数资源中即可。显然,FunctionName 应该不同于出现在 lambda 的 ARN 中的现有 lambda 函数名。

警告 : FunctionName 属性需要替换。您现有的 lambda 将被删除,新的 lambda 将被创建。

好吧,所以我不得不自己做这件事,@Pat-myron 在答案下面评论了一个链接,指出了你做这件事的方式。

他发布了一个功能请求@benbridts 概述了模板 给你

以下是在我的云形成模板中起作用的要点:

HelloWorldLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: "/aws/lambda/HelloWorld"
RetentionInDays: 30


HelloWorldFunction:
Type: AWS::Lambda::Function
DependsOn: HelloWorldLogGroup
Properties:
FunctionName: HelloWorld
Role:
Fn::GetAtt:
- LambdaExecRole
- Arn


LambdaExecRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: LambdaLogging
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- logs:CreateLogStream
- logs:PutLogEvents
Resource: !GetAtt HelloWorldLogGroup.Arn