有没有办法指定 AWS lambda 记录到的 CloudWatch 日志组?它似乎是直接从 lambda 名称生成的;然而,例如,将多个 lambda 聚合到单个日志组会特别方便。我们对在 CloudFormation 模板创建 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 函数运行时,它会在该组中创建日志流。然而,当我删除堆栈时,日志组似乎“没有”被删除,并且保留现在设置为“永不过期”。也许这已经足够好了,所以流不会变得太失控...... 我认为这是不可能的。
因此,你必须有一个聚合多个日志流的工具。如果是这样,让它更通用一点有什么问题,以便它可以聚合来自不同日志组的日志流?
我发现@lingrlongr的答案部分正确。
首先,要回答原来的问题,您不能为要写入的 lambda 函数指定自定义日志组名称。lambda 日志组名称始终遵循以下模式:
/aws/lambda/<function-name>
lambda 函数将首先检查是否存在具有该名称的日志组。
如果存在,那么它将使用它。
如果不存在,它将创建具有该模式的日志组。
因此,如果您想要添加设置,例如
RetentionInDays
SubscriptionFilter
LogGroup
before
。如果先创建 lambda 函数,则在创建 LogGroup 时会抛出错误,指出 LogGroup 已存在。因此,lambda 函数应该具有
DependsOn: LogGroup
,而不是相反。
此外,请确保您没有使用
Ref
或 GetAtt
来引用 LogGroup 内的 lambda 函数,因为这会创建对 lambda 函数的隐式依赖关系,导致 lambda 函数在 LogGroup 之前创建。
创建作为答案之一提到的日志组是可行的。要在删除堆栈后保留保留策略,只需添加 DeletionPolicy 即可。
"MyLambdaFunctionLogGroup": {
"Type": "AWS::Logs::LogGroup",
"DependsOn": "MyLambdaFunction",
"DeletionPolicy": "Retain",
"Properties": {
"LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
"RetentionInDays": 14
}
}
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'
...
一些用户提到了 /aws/lambda/<FunctionName>
此外,如果要将 LogGroup 添加到现有函数中,只需使用上面的 LogGroup 资源更新 template.yaml 并将 FunctionName 属性添加到函数资源中即可。显然,FunctionName 应与 lambda ARN 中出现的现有 lambda 函数名称不同。
警告:FunctionName 属性需要替换。您现有的 lambda 将被删除,并创建新的 lambda。
好吧,所以我必须自己做这件事,@pat-myron 在答案下面评论了一个指向你如何做的链接。
他发布了一个功能请求,其中 @benbridts 概述了模板这里。
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
自 2023 年 11 月起,您现在可以在创建 Lambda 函数时指定 CloudWatch Logs 日志组名称。
在您的
Lambda 函数的 CloudFormation 中,您可以指定日志组名称,如下所示: