【问题标题】:Set expiration of CloudWatch Log Group for Lambda Function为 Lambda 函数设置 CloudWatch 日志组的过期时间
【发布时间】: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”中的解决方案有效。这应该被标记为问题的正确答案。

标签: aws-lambda amazon-cloudwatchlogs


【解决方案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}"
    猜你喜欢
    • 2017-06-19
    • 2016-03-22
    • 2020-06-25
    • 2018-10-27
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2020-05-13
    • 2016-11-19
    相关资源
    最近更新 更多