有没有一种方法可以指定AWS Lambda记录日志的CloudWatch日志组?看起来日志组是直接从Lambda名称生成的,但是,例如将多个Lambda聚合到一个日志组中将特别方便。我们特别希望在CloudFormation模板创建Lambda时指定日志组。
有没有一种方法可以指定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函数运行时,它确实在该组中创建了日志流。但是,当我删除堆栈时,似乎日志组没有被删除,并且保留期设置为永不过期。也许这已足够,以避免流变得太混乱...
我认为这不可能。
即使它是可能的,每个AWS Lambda实例仍将写入其自己的日志流。虽然同一Lambda的不同调用可以写入相同的日志流(当重复使用Lambda实例时),但不同的Lambda肯定不能这样做(因为它们必须使用不同的Lambda实例)。
因此,您必须拥有一个聚合多个日志流的工具。如果是这样,那么将它变得更加通用,让它能够聚合来自不同日志组的日志流,会有什么问题呢?
我发现@lingrlongr的回答部分正确。
首先,回答原问题,您无法为Lambda函数指定自定义日志组名称以进行写入。
Lambda日志组名称始终遵循此模式:
/aws/lambda/<function-name>
这个lambda函数首先会检查是否存在一个同名的日志组。
因此,如果你想要添加设置,例如RetentionInDays
和SubscriptionFilter
,请确保你的CloudFormation或SAM模板在lambda函数之前创建LogGroup
。如果先创建lambda函数,则在创建LogGroup时会抛出错误,显示LogGroup已经存在。因此,lambda函数应该有DependsOn: LogGroup
而不是相反。
此外,请确保你没有在LogGroup内部使用Ref
或GetAtt
引用lambda函数,因为这会导致lambda函数被隐含地依赖,从而在LogGroup之前创建lambda函数。
按照答案中提到的方式创建日志组是可行的。如果要在删除堆栈后保留保留策略,只需添加 DeletionPolicy。
"MyLambdaFunctionLogGroup": {
"Type": "AWS::Logs::LogGroup",
"DependsOn": "MyLambdaFunction",
"DeletionPolicy": "Retain",
"Properties": {
"LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
"RetentionInDays": 14
}
}
好的,我必须亲自操作,@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
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>
。只要你没有在LogGroup中引用函数的逻辑ID,则SAM会在lambda函数之前创建日志组。
此外,如果您要向现有函数添加LogGroup,只需像上面那样更新template.yaml文件,并在函数资源中添加FunctionName属性即可。显然,FunctionName应与现有lambda函数名称不同,该名称出现在lambda的ARN中。
警告:FunctionName属性需要进行替换。您的现有lambda将被删除并创建新的lambda。
aws logs put-retention-policy
解决了这个问题,虽然不太美观但是有效! - davegallantType: AWS::Lambda::Function
Properties:
FunctionName: <my function name>
LoggingConfig:
ApplicationLogLevel: TRACE
LogFormat: <optional custom format>
LogGroup: <custom log group name>
SystemLogLevel: WARN
AWS::Lambda::Function
中添加LogGroup
属性:https://github.com/aws-cloudformation/aws-cloudformation-coverage-roadmap/issues/147 - Pat Myron