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

Posted

技术标签:

【中文标题】为 Lambda 函数设置 CloudWatch 日志组的过期时间【英文标题】:Set expiration of CloudWatch Log Group for Lambda Function 【发布时间】:2018-01-04 00:29:00 【问题描述】:

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


更新#1

感谢@jens walter answer这是如何解决问题的代码sn-p

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]]

【问题讨论】:

不确定 AWS 在发布 sn-p 后是否更改了某些内容,但这对我不起作用。我收到The following resource(s) failed to create: [CloudwatchLogsGroup]. /aws/lambda/cloud-watch-monitoring-log-filter already exists 唯一的区别可能是原始CFN模板不包含这个日志组(因此日志组是由lambda隐式创建的)。现在我正在尝试更新 CFN 堆栈并尝试为日志组添加保留。遗憾的是,这种方法不起作用 尝试使用控制台删除lambda创建的日志组,然后使用模板创建堆栈,它应该可以工作。 此 sn-p 不起作用的可能原因是 Lambda 函数在创建 LogGroup 之前正在运行。当 Lambda 函数运行时,它会自动创建一个与 LogGroup 同名的日志组。在我的情况下,Lambda 函数被用作自定义资源,我设法通过在 CustomResource 中使用 DependsOn 来修复它,这样在创建 LogGroup 之前不会创建 CustomResource(这会导致 Lambda 运行)。跨度> “Updated#1”中的解决方案有效。这应该被标记为问题的正确答案。 【参考方案1】:

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

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

【讨论】:

你能提供一个示例模板 sn-p 吗?我知道如何创建日志组(AWS::Logs::LogGroup),但不确定如何将其连接到 lambda 函数。 自 2021 年起,可以选择通过控制台编辑保留。 cloud watch -> 日志组 -> [您的日志组]-> 操作 -> 编辑保留设置【参考方案2】:

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

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

【讨论】:

我知道您可以使用控制台更改创建后的保留时间。这个想法是不使用控制台。【参考方案3】:

从 2021 年起,可以选择通过控制台编辑保留。

cloud watch -> 日志组 -> [您的日志组] -> 操作 -> 编辑保留设置

【讨论】:

【参考方案4】:

您可以在 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

【讨论】:

Lambda 函数如何知道要使用这个新创建的日志组? @FelipeAlvarez 如您所见,在 LambdaFunction 块中,有一个引用“LambdaLogGroup”的“DependsOn”,因此 Lambda 会知道使用新创建的日志组。 以上DependsOn的解释不正确。请参阅文档here。它的真正目的是强制堆栈内资源的创建顺序。对于上面的示例,DependsOn 仅强制首先创建 LambdaLogGroup 资源。但是,在此示例中,lambda 不会向其写入任何内容。要使其正常工作,您需要进行以下更改 LogGroupName: !Sub "/aws/lambda/$LambdaFunction"

以上是关于为 Lambda 函数设置 CloudWatch 日志组的过期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何为在 Cloudformation 中创建的 Lambda 设置 Cloudwatch 日志

访问 AWS Lambda 的 Amazon CloudWatch 日志

在 AWS Cloudwatch 中查找 lambda 函数错误的日志?

禁用 CloudWatch 以监控 Lambda 函数的日志

如何将值传递给 CloudWatch 中的 Lambda 函数?

AWS Lambda函数由CloudWatch事件触发两次