为AWS lambda指定日志组?

时间:2016-08-30 15:28:44

标签: amazon-web-services aws-lambda amazon-cloudformation amazon-cloudwatch

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

5 个答案:

答案 0 :(得分:20)

实际上,也许你至少可以达到一定程度。我也在寻找答案并尝试了一下。这是两个资源的片段; 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函数运行时,它会在此组中创建日志流。但是,当我删除堆栈时,似乎日志组已删除,并且保留现在设置为永不过期。也许这很好,所以这些流不会失控......

答案 1 :(得分:11)

我认为这是不可能的。

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:2)

我将 LogGroup 附加到 SAM 模板中的无服务器功能,如下所示:

    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>。 SAM 将在 lambda 函数之前创建日志组只要您没有在 LogGroup 中引用函数的逻辑 ID

此外,如果您要将 LogGroup 添加到现有函数,您可以通过简单地使用上述 LogGroup 资源更新 template.yaml 并将 FunctionName 属性添加到函数资源来实现。显然,FunctionName 应该与出现在 lambda 的 ARN 中的现有 lambda 函数名称不同。

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

答案 4 :(得分:0)

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

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

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

/aws/lambda/<function-name>

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

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

因此,如果您要添加设置,例如RetentionInDaysSubscriptionFilter,请确保您的CloudFormation或SAM模板在Lambda之前 前创建了LogGroup功能。如果首先创建了lambda函数,则在创建LogGroup时将引发错误,指出LogGroup已经存在。因此,lambda函数应具有DependsOn: LogGroup而不是相反。

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