为 AWS lambda 指定日志组?

Specify log group for an AWS lambda?

有没有办法指定 AWS lambda 记录到的 CloudWatch 日志组?它似乎是直接从 lambda 名称生成的;但是,例如,将多个 lambda 聚合到一个日志组会特别方便。当 lambda 由 CloudFormation 模板创建时,我们对指定日志组特别感兴趣。

我认为这是不可能的。

即使 可能,每个 AWS Lambda 实例仍会写入自己的日志流。尽管对同一个 lambda 的不同调用 可以写入同一个日志流(当 lambda 实例被重用时),但对于不同的 lambda 肯定不是这种情况(因为它们必须使用不同的 lambda 实例)。

因此,您必须有一个聚合多个日志流的工具。如果是这样,让它更通用一点有什么问题,以便它可以聚合来自不同日志组的日志流?

实际上,至少在某种程度上,也许你可以。我也在寻找答案并试一试。这是两个资源的片段; lambda 函数和日志组:

"MyLambdaFunction": {
    "Type": "AWS::Lambda::Function",
    "DependsOn": "ReadWriteRole",
    "Properties": {
        //snip
    }
},

"MyLambdaFunctionLogGroup": {
    "Type": "AWS::Logs::LogGroup",
    "DependsOn": "MyLambdaFunction",
    "Properties": {
        "LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
        "RetentionInDays": 14
    }
},

我发现创建的日志组按照指示保留 14 天。当 lambda 函数运行时,它会在该组中创建日志流。但是,当我删除堆栈时,日志组似乎 被删除,保留现在设置为 永不过期 。也许这已经足够好了,所以流不会变得太失控......

如答案之一所述创建日志组。要在删除堆栈后保留保留策略,只需添加一个 DeletionPolicy。

"MyLambdaFunctionLogGroup": {
  "Type": "AWS::Logs::LogGroup",
  "DependsOn": "MyLambdaFunction",
  "DeletionPolicy": "Retain",
  "Properties": {
    "LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
    "RetentionInDays": 14
  }
}

我发现@lingrlongr 的回答部分正确。

首先,回答原问题,您不能为要写入的 lambda 函数指定自定义日志组名称。

lambda 日志组名称始终遵循以下模式:

/aws/lambda/<function-name>

lambda 函数将首先检查是否存在同名的日志组。

  • 如果它存在,那么它将使用它。
  • 如果不存在,它将创建一个具有该模式的日志组。

因此,如果您想添加 RetentionInDaysSubscriptionFilter 等设置,请确保您的 CloudFormation 或 SAM 模板在 [=] 之前创建 LogGroup 36=] lambda 函数。如果先创建 lambda 函数,则在创建 LogGroup 时会抛出一个错误,指出 LogGroup 已经存在。所以,lambda 函数应该有 DependsOn: LogGroup 而不是相反。

此外,请确保您没有使用 RefGetAtt 来引用 LogGroup 中的 lambda 函数,因为这会创建对 lambda 函数的隐式依赖,导致 lambda 函数在日志组。

我将 LogGroup 附加到 SAM 模板中的 Serverless 函数,如下所示:

    MyFuncLogGroup:
        Type: AWS::Logs::LogGroup
        Properties:
            LogGroupName: '/aws/lambda/stackName-env-myFunc-v1'
            RetentionInDays: 30

    MyFunc:
        Type: AWS::Serverless::Function
        Properties:
            FunctionName: 'stackName-env-myFunc-v1'
            ...

一些用户提到了 DependsOn 属性 的要求,但根据我使用 SAM 的经验,这不是必需的。唯一的要求是 LogGroupName 必须是 /aws/lambda/<FunctionName>。只要您没有在 LogGroup

中引用函数的逻辑 ID,SAM 就会在 lambda 函数之前创建日志组

此外,如果您要将 LogGroup 添加到现有函数,只需像上面那样用 LogGroup 资源更新 template.yaml 并将 FunctionName 属性 添加到函数资源即可。显然,FunctionName 应该不同于您的 lambda ARN 中出现的现有 lambda 函数名称。

警告:FunctionName 属性 需要替换。您现有的 lambda 将被删除并创建新的。

好的,所以我不得不自己做,@pat-myron 在答案下方评论了 link 你的做法。

他发布了一个功能请求,其中@benbridts 概述了模板 here

这是在我的 cloudformation 模板中起作用的要点:

HelloWorldLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: "/aws/lambda/HelloWorld"
      RetentionInDays: 30

HelloWorldFunction:
  Type: AWS::Lambda::Function
  DependsOn: HelloWorldLogGroup
  Properties:
    FunctionName: HelloWorld
    Role:
      Fn::GetAtt:
        - LambdaExecRole
        - Arn

LambdaExecRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Version: "2012-10-17"
      Statement:
        - Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
          Action: sts:AssumeRole
    Policies:
      - PolicyName: LambdaLogging
        PolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Action:
                - logs:CreateLogStream
                - logs:PutLogEvents
              Resource: !GetAtt HelloWorldLogGroup.Arn