Amazon web services 为AWS lambda指定日志组?

Amazon web services 为AWS lambda指定日志组?,amazon-web-services,aws-lambda,amazon-cloudformation,amazon-cloudwatch,Amazon Web Services,Aws Lambda,Amazon Cloudformation,Amazon Cloudwatch,有没有办法指定AWS lambda登录到的CloudWatch日志组?它似乎是直接从lambda名称生成的;但是,将多个lambda聚合到单个日志组尤其方便。当lambda由CloudFormation模板创建时,我们特别感兴趣的是指定日志组。我认为这是不可能的 即使有可能,每个AWS Lambda实例仍将写入其自己的日志流。尽管相同lambda的不同调用可以写入相同的日志流(当lambda实例被重用时),但对于不同的lambda,情况肯定不是这样(因为它们必须使用不同的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>
/aws/lambda/
lambda函数将首先检查是否存在具有此名称的日志组

  • 如果它存在,那么它将使用它
  • 如果不存在,它将使用该模式创建日志组
因此,如果要添加设置,例如
retentionDays
SubscriptionFilter
,请确保CloudFormation或SAM模板在
lambda函数之前创建
LogGroup
。如果首先创建lambda函数,则在创建日志组时会抛出一个错误,说明该日志组已经存在。因此,lambda函数应该具有
DependsOn:LogGroup
,而不是相反


此外,请确保您没有使用
Ref
GetAtt
引用日志组内的lambda函数,因为这会创建对lambda函数的隐式依赖,导致lambda函数在日志组之前创建。

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

此外,如果要将日志组添加到现有函数中,只需使用如上所述的日志组资源更新template.yaml并将FunctionName属性添加到函数资源中即可。显然,FunctionName应该与lambda的ARN中显示的现有lambda函数名不同


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

您是正确的。我要求AWS支持同样的事情,并被告知这是不可能的,而且可能永远都不可能。但是,Lambda函数的多个实例不记录到同一个日志流的原因是存在。因此,即使您试图从多个Lambda实例手动写入单个日志流,您也很快会遇到该限制。遗憾的是,无法为单个Lambda函数指定日志组。像这样的工具(),它可以从一个特定的日志组中对聚合的多个日志流进行流式处理,将无法利用它。。。对不起,我无法抗拒。但是非常严肃地说,如果你看最初的问题,这会更多地关注最后的用例,而不是实际的问题,IMHO@CraigBrett问题的答案在第一句。答案的本质是,它不允许任何细化(也不可能通过链接到文档来提供证据,因为文档中通常只缺少不支持的特性,并且只有在特殊情况下才明确说明这些事实)。答案的其余部分是一些额外的想法,以使其符合答案的标准(否则,它宁愿作为一个评论来写,也不可能被接受)。@Leon也许我有点开玩笑,因为你拒绝了其他人的答案。我道歉。但当我遇到这个问题时,这些答案实际上对我有用。不完全是日志聚合的附加功能,但希望日志组至少具有云格式化和保留的日志。所以这是可能的。我对这个答案非常乐观,但是遇到了LogGroup失败的问题,因为LogGroupName已经存在了exists@Purefan它可能已经存在了,因此无法再次创建。您可以删除DependsOn,因为我们在组名中使用lambda的ARN,所以它是隐式的。@Purefan我在更新堆栈时得到了相同的结果。我通过删除整个堆栈并再次创建来解决这个问题。必须首先创建日志组。羔羊