为 AWS lambda 指定日志组?
Specify log group for an AWS 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>
lambda 函数将首先检查是否存在同名的日志组。
- 如果它存在,那么它将使用它。
- 如果不存在,它将创建一个具有该模式的日志组。
因此,如果您想添加 RetentionInDays
和 SubscriptionFilter
等设置,请确保您的 CloudFormation 或 SAM 模板在 [=] 之前创建 LogGroup
36=] lambda 函数。如果先创建 lambda 函数,则在创建 LogGroup 时会抛出一个错误,指出 LogGroup 已经存在。所以,lambda 函数应该有 DependsOn: LogGroup
而不是相反。
此外,请确保您没有使用 Ref
或 GetAtt
来引用 LogGroup 中的 lambda 函数,因为这会创建对 lambda 函数的隐式依赖,导致 lambda 函数在日志组。
我将 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'
...
一些用户提到了 DependsOn
属性 的要求,但根据我使用 SAM 的经验,这不是必需的。唯一的要求是 LogGroupName 必须是 /aws/lambda/<FunctionName>
。只要您没有在 LogGroup
中引用函数的逻辑 ID,SAM 就会在 lambda 函数之前创建日志组
此外,如果您要将 LogGroup 添加到现有函数,只需像上面那样用 LogGroup 资源更新 template.yaml 并将 FunctionName 属性 添加到函数资源即可。显然,FunctionName 应该不同于您的 lambda ARN 中出现的现有 lambda 函数名称。
警告:FunctionName 属性 需要替换。您现有的 lambda 将被删除并创建新的。
好的,所以我不得不自己做,@pat-myron 在答案下方评论了 link 你的做法。
他发布了一个功能请求,其中@benbridts 概述了模板 here。
这是在我的 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
有没有办法指定 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>
lambda 函数将首先检查是否存在同名的日志组。
- 如果它存在,那么它将使用它。
- 如果不存在,它将创建一个具有该模式的日志组。
因此,如果您想添加 RetentionInDays
和 SubscriptionFilter
等设置,请确保您的 CloudFormation 或 SAM 模板在 [=] 之前创建 LogGroup
36=] lambda 函数。如果先创建 lambda 函数,则在创建 LogGroup 时会抛出一个错误,指出 LogGroup 已经存在。所以,lambda 函数应该有 DependsOn: LogGroup
而不是相反。
此外,请确保您没有使用 Ref
或 GetAtt
来引用 LogGroup 中的 lambda 函数,因为这会创建对 lambda 函数的隐式依赖,导致 lambda 函数在日志组。
我将 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'
...
一些用户提到了 DependsOn
属性 的要求,但根据我使用 SAM 的经验,这不是必需的。唯一的要求是 LogGroupName 必须是 /aws/lambda/<FunctionName>
。只要您没有在 LogGroup
此外,如果您要将 LogGroup 添加到现有函数,只需像上面那样用 LogGroup 资源更新 template.yaml 并将 FunctionName 属性 添加到函数资源即可。显然,FunctionName 应该不同于您的 lambda ARN 中出现的现有 lambda 函数名称。
警告:FunctionName 属性 需要替换。您现有的 lambda 将被删除并创建新的。
好的,所以我不得不自己做,@pat-myron 在答案下方评论了 link 你的做法。
他发布了一个功能请求,其中@benbridts 概述了模板 here。
这是在我的 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