有没有办法指定AWS lambda记录到的CloudWatch日志组?它似乎是直接从lambda名称生成的;但是,例如,将多个lambda聚合到单个日志组会特别方便。我们特别感兴趣的是在CloudFormation模板创建lambda时指定日志组。
答案 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函数将首先检查使用此名称的日志组是否存在。
因此,如果您要添加设置,例如RetentionInDays
和SubscriptionFilter
,请确保您的CloudFormation或SAM模板在Lambda之前 前创建了LogGroup
功能。如果首先创建了lambda函数,则在创建LogGroup时将引发错误,指出LogGroup已经存在。因此,lambda函数应具有DependsOn: LogGroup
而不是相反。
此外,请确保未使用Ref
或GetAtt
来引用LogGroup中的lambda函数,因为这会导致对lambda函数的隐式依赖,从而导致在LogGroup之前创建lambda函数。