Joh*_*hnJ 39 amazon-web-services aws-cloudformation amazon-cloudwatch aws-lambda
有没有办法指定AWS lambda记录到的CloudWatch日志组?它似乎是直接从lambda名称生成的; 但是,例如,将多个lambda聚合到单个日志组会特别方便.我们特别感兴趣的是在CloudFormation模板创建lambda时指定日志组.
小智 28
实际上,也许你至少可以达到一定程度.我也在寻找答案并尝试了一下.这是两个资源的片段; 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
}
},
Run Code Online (Sandbox Code Playgroud)
我发现日志组的创建时间为14天,如图所示.当lambda函数运行时,它会在此组中创建日志流.但是,当我删除堆栈时,似乎没有删除日志组,并且保留现在设置为永不过期.也许这足够好所以流不会太失控......
Leo*_*eon 12
我不认为这是可能的.
即使是可能的,每一个AWS实例LAMBDA仍然写信给自己的日志流.虽然同一个lambda的不同调用可以写入同一个日志流(当重用lambda实例时),但对于不同的lambda来说肯定不是这种情况(因为它们必须使用不同的lambda实例).
因此,您必须拥有一个聚合多个日志流的工具.如果是这样,那么使它更通用的问题是什么,以便它可以聚合来自不同日志组的日志流?
我发现@lingrlongr 的回答部分正确。
首先,要回答原始问题,您不能为要写入的 lambda 函数指定自定义日志组名称。
lambda 日志组名称始终遵循以下模式:
/aws/lambda/<function-name>
Run Code Online (Sandbox Code Playgroud)
lambda 函数将首先检查是否存在具有此名称的日志组。
因此,如果您想要添加设置,例如RetentionInDaysand SubscriptionFilter,请确保您的 CloudFormation 或 SAM 模板在 lambda 函数LogGroup 之前创建。如果先创建了 lambda 函数,则在创建 LogGroup 时会抛出错误,说 LogGroup 已存在。所以,lambda 函数应该有,DependsOn: LogGroup而不是相反。
此外,请确保您没有在 LogGroup 中使用Ref或GetAtt引用 lambda 函数,因为这会创建对 lambda 函数的隐式依赖,导致在 LogGroup 之前创建 lambda 函数。
小智 6
如上所述创建日志组作为答案之一.要在删除堆栈后保留保留策略,只需添加DeletionPolicy即可.
"MyLambdaFunctionLogGroup": {
"Type": "AWS::Logs::LogGroup",
"DependsOn": "MyLambdaFunction",
"DeletionPolicy": "Retain",
"Properties": {
"LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref": "MyLambdaFunction"}]]},
"RetentionInDays": 14
}
}
Run Code Online (Sandbox Code Playgroud)
我将 LogGroup 添加到 SAM 模板中的 Serverless 函数,如下所示:
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'
...
Run Code Online (Sandbox Code Playgroud)
有些用户提到了属性的要求DependsOn,但根据我使用 SAM 的经验,这不是必需的。唯一的要求是 LogGroupName 必须是/aws/lambda/<FunctionName>。只要您没有在 LogGroup 中引用函数的逻辑 ID, SAM 就会在 lambda 函数之前创建日志组
此外,如果您要将 LogGroup 添加到现有函数,则只需使用上面的 LogGroup 资源更新 template.yaml 并将 FunctionName 属性添加到函数资源即可实现此目的。显然,FunctionName 应与 lambda 的 ARN 中显示的现有 lambda 函数名称不同。
警告:FunctionName 属性需要替换。您现有的 lambda 将被删除,并创建新的 lambda。
好吧,所以我必须自己做这件事,@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20007 次 |
| 最近记录: |