You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:20:30