为AWS lambda指定日志组?

Joh*_*hnJ 39 amazon-web-services aws-cloudformation amazon-cloudwatch aws-lambda

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

小智 28

实际上,也许你至少可以达到一定程度.我也在寻找答案并尝试了一下.这是两个资源的片段; 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
    }
},
Run Code Online (Sandbox Code Playgroud)

我发现日志组的创建时间为14天,如图所示.当lambda函数运行时,它会在此组中创建日志流.但是,当我删除堆栈时,似乎没有删除日志组,并且保留现在设置为永不过期.也许这足够好所以流不会太失控......

  • 您可以删除 DependsOn,因为我们在组名称中使用 lambda 的 ARN,因此它是隐式的。 (5认同)
  • 设置日志过期的不错的解决方法! (3认同)
  • @Purefan更新堆栈时我得到的是相同的。我通过删除整个堆栈并再次创建来解决它。 (3认同)
  • 这个答案没有解决所提出的问题 (3认同)
  • 必须首先创建日志组。Lambda 函数必须**依赖**日志组。 (3认同)
  • 我对这个答案非常乐观,但是遇到了LogGroup失败的问题,因为LogGroupName已经存在 (2认同)

Leo*_*eon 12

我不认为这是可能的.

即使可能的,每一个AWS实例LAMBDA仍然写信给自己的日志流.虽然同一个lambda的不同调用可以写入同一个日志流(当重用lambda实例时),但对于不同的lambda来说肯定不是这种情况(因为它们必须使用不同的lambda实例).

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

  • 你是对的.我向AWS支持同样的事情并被告知这是不可能的,而且可能永远不可能.但是,Lambda函数的多个实例不会记录到同一个日志流的原因是[有5个请求/秒/日志流的限制](https://docs.aws.amazon.com/AmazonCloudWatch/latest /logs/cloudwatch_limits_cwl.html).因此,即使您尝试从多个Lambda实例手动写入单个日志流,您也很快就会遇到该限制. (3认同)

Tan*_*vir 7

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

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

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

/aws/lambda/<function-name>
Run Code Online (Sandbox Code Playgroud)

lambda 函数将首先检查是否存在具有此名称的日志组。

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

因此,如果您想要添加设置,例如RetentionInDaysand SubscriptionFilter,请确保您的 CloudFormation 或 SAM 模板在 lambda 函数LogGroup 之前创建。如果先创建了 lambda 函数,则在创建 LogGroup 时会抛出错误,说 LogGroup 已存在。所以,lambda 函数应该有,DependsOn: LogGroup而不是相反。

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


小智 6

如上所述创建日志组作为答案之一.要在删除堆栈后保留保留策略,只需添加DeletionPolicy即可.

"MyLambdaFunctionLogGroup": {
  "Type": "AWS::Logs::LogGroup",
  "DependsOn": "MyLambdaFunction",
  "DeletionPolicy": "Retain",
  "Properties": {
    "LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
    "RetentionInDays": 14
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有解决所提出的问题 (2认同)

szi*_*qui 5

我将 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'
            ...
Run Code Online (Sandbox Code Playgroud)

有些用户提到了属性的要求DependsOn,但根据我使用 SAM 的经验,这不是必需的。唯一的要求是 LogGroupName 必须是/aws/lambda/<FunctionName>只要您没有在 LogGroup 中引用函数的逻辑 ID, SAM 就会在 lambda 函数之前创建日志组

此外,如果您要将 LogGroup 添加到现有函数,则只需使用上面的 LogGroup 资源更新 template.yaml 并将 FunctionName 属性添加到函数资源即可实现此目的。显然,FunctionName 应与 lambda 的 ARN 中显示的现有 lambda 函数名称不同。

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


Noa*_*ary 5

好吧,所以我必须自己做这件事,@pat-myron 在答案下面评论了一个指向你如何做的链接。

他发布了一个功能请求,其中 @benbridts 概述了此处的模板。

以下是我的 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
Run Code Online (Sandbox Code Playgroud)