为 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 函数的日志