如何用CloudFormation YAML更新CloudWatch中Lambda现有日志组的保留期?
如何通过CloudFormation更新现有Lambda日志组的保留期?
你当前的方案无效,是因为AWS::Logs::LogGroup资源不支持用通配符/aws/lambda/*匹配多个日志组,而且CloudFormation默认会尝试创建新资源,而非修改现有资源。以下是两种可行的解决方法:
方法一:使用自定义资源(批量处理)
通过Lambda-backed自定义资源,批量遍历所有Lambda日志组并设置保留期,同时能自动处理后续新创建的Lambda日志组。
完整CloudFormation模板示例
AWSTemplateFormatVersion: '2010-09-09' Description: 设置Lambda日志组的保留期为14天 Resources: # 自定义资源Lambda的IAM角色 CustomResourceLambdaRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Policies: - PolicyName: LogRetentionPermissions PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:DescribeLogGroups - logs:PutRetentionPolicy Resource: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/*" # 执行日志保留期设置的Lambda函数 LogRetentionLambda: Type: AWS::Lambda::Function Properties: Runtime: python3.11 Role: !GetAtt CustomResourceLambdaRole.Arn Handler: index.lambda_handler Code: ZipFile: | import boto3 import cfnresponse logs_client = boto3.client('logs') TARGET_RETENTION_DAYS = 14 def lambda_handler(event, context): try: # 分页获取所有Lambda日志组 paginator = logs_client.get_paginator('describe_log_groups') for page in paginator.paginate(logGroupNamePrefix='/aws/lambda/'): for log_group in page['logGroups']: log_group_name = log_group['logGroupName'] # 为日志组设置保留期 logs_client.put_retention_policy( logGroupName=log_group_name, retentionInDays=TARGET_RETENTION_DAYS ) # 通知CloudFormation执行成功 cfnresponse.send(event, context, cfnresponse.SUCCESS, {}) except Exception as e: print(f"执行出错: {str(e)}") cfnresponse.send(event, context, cfnresponse.FAILED, {'Error': str(e)}) # 自定义资源,触发Lambda执行 SetLambdaLogRetention: Type: Custom::SetLogRetention Properties: ServiceToken: !GetAtt LogRetentionLambda.Arn
说明
- 该模板在栈创建或更新时,会自动遍历所有
/aws/lambda/前缀的日志组,统一设置14天保留期 - 后续新创建的Lambda日志组,在下次更新栈时也会被自动设置保留期
- Lambda角色包含了必要的日志操作权限,以及Lambda基础执行权限(用于记录自身日志)
方法二:逐个指定现有日志组(适合少量Lambda)
如果你的Lambda数量不多,可以直接为每个现有日志组定义AWS::Logs::LogGroup资源,添加DeletionPolicy: Retain避免删除日志组,同时设置保留期:
AWSTemplateFormatVersion: '2010-09-09' Description: 为指定Lambda日志组设置保留期 Resources: LambdaLogGroup-OrderProcessor: Type: AWS::Logs::LogGroup Properties: LogGroupName: /aws/lambda/OrderProcessorFunction RetentionInDays: 14 DeletionPolicy: Retain LambdaLogGroup-UserManager: Type: AWS::Logs::LogGroup Properties: LogGroupName: /aws/lambda/UserManagerFunction RetentionInDays: 14 DeletionPolicy: Retain
说明
DeletionPolicy: Retain确保删除CloudFormation栈时,不会删除对应的日志组- 这种方法需要手动维护每个日志组的定义,适合Lambda数量较少的场景
内容的提问来源于stack exchange,提问作者Andrea Cappelletti
相关产品推荐
相关产品推荐

