为Lambda函数设置CloudWatch日志组的过期时间

46

默认情况下,当我创建Lambda函数时,CloudWatch日志组被设置为永不过期。是否可以将其设置为过期(比如说14天),这样我就不必在控制台上手动设置了?


更新#1

感谢@jens walter答案,这里是解决问题的代码片段。

Resources:
  LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs6.10
      CodeUri: <your code uri>
      Policies: <your policies> 


  LambdaFunctionLogGroup:
    Type: "AWS::Logs::LogGroup"
    DependsOn: "LambdaFunction"
    Properties: 
      RetentionInDays: 14
      LogGroupName: !Join ["", ["/aws/lambda/", !Ref LambdaFunction]]

2
不确定AWS是否自代码片段发布以来进行了更改,但对我来说似乎不起作用。我得到了以下资源无法创建:[CloudwatchLogsGroup]。/aws/lambda/cloud-watch-monitoring-log-filter已经存在的错误提示。 - Sergei M
2
唯一的区别可能是原始的CFN模板没有包含这个日志组(因此日志组是由Lambda隐式创建的)。现在我正在尝试更新CFN堆栈,并尝试为日志组添加保留。可悲的是,这种方法并没有起作用。 - Sergei M
2
尝试在控制台中删除由Lambda创建的日志组,然后使用模板创建堆栈,应该可以正常工作。 - niqui
"Updated#1"中的解决方案有效。应将其标记为该问题的正确答案。 - Bruno Negrão Zica
1
不需要使用“DependsOn”子句,因为“!Ref LambdaFunction”已经设置了依赖关系。 - Bruno Negrão Zica
显示剩余3条评论
4个回答

16

如果您通过控制台创建Lambda函数,则无法相应地设置日志保留期限。也不能为所有CloudWatch日志设置默认保留期。

您唯一可以影响日志保留期的方式是通过 CloudFormation。在这种情况下,您需要通过 CloudFormation 部署 Lambda 函数,然后在该模板中定义一个匹配的 LogGroup,并设置自定义保留期。


11
你能提供一个模板片段的例子吗?我知道如何创建一个日志组(AWS::Logs::LogGroup),但不确定如何将其连接到Lambda函数。 - Mark.ewd
1
截至2021年,现在可以通过控制台编辑保留选项。 CloudWatch -> 日志组 -> [您的日志组] -> 操作 -> 编辑保留设置 - Anil_M

14

您实际上可以在控制台创建Lambda后更改日志保留时间,但需要从CloudWatch控制台中执行。

如果您前往CloudWatch控制台并查看日志(CloudWatch > 日志组),您会注意到“过期事件后”列中的数据是链接。通过单击其中一个,您可以更改过期时间。


6
我知道你可以用控制台在创建后更改保留时间。但是我们不打算使用控制台。 - niqui

0
截至2021年,现在可以通过控制台编辑保留选项。
云监控 -> 日志组 -> [您的日志组] -> 操作 -> 编辑保留设置。

-8

您可以在 CloudFormation 中使用 Depends On。像这样做:

Resources:
LambdaFunction:
    Type: AWS::Serverless::Function
    DependsOn: LambdaLogGroup
    Properties:
      FunctionName: 'LambdaName'
      Handler: <handlerPath>
      Runtime: java8
      MemorySize: 512
LambdaLogGroup:
       Type: AWS::Logs::LogGroup
       Properties:
             LogGroupName: '/aws/lambda/LambdaLogGroup'
             RetentionInDays: 30

2
Lambda函数如何知道使用这个新创建的日志组? - Felipe Alvarez
@FelipeAlvarez,正如你所看到的,在LambdaFunction块中有一个"DependsOn"引用了"LambdaLogGroup",因此Lambda将知道使用新创建的日志组。 - Kartik Goyal
11
上述关于DependsOn的解释是错误的。请参见此处的文档(https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)。它真正的目的是强制堆栈内资源的创建顺序。对于上面的示例,DependsOn仅强制创建LambdaLogGroup资源。但是,在此示例中,Lambda函数永远不会向其写入任何内容。要使其工作,您需要进行以下更改 LogGroupName:!Sub“/aws/lambda/${LambdaFunction}” - c0pp3rt0p

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接