Aws lambda 如何使用CloudFormation添加订阅筛选器?
我正在用几个AWS Lambda函数生成一个CloudFormation模板。作为CloudFormation模板的一部分,我还想添加订阅过滤器,以便将CloudWatch日志发送到不同的帐户。 然而,由于我事先不知道日志组的名称,也找不到任何方法来引用它们,所以我无法解决这个问题Aws lambda 如何使用CloudFormation添加订阅筛选器?,aws-lambda,amazon-cloudformation,amazon-cloudwatch,Aws Lambda,Amazon Cloudformation,Amazon Cloudwatch,我正在用几个AWS Lambda函数生成一个CloudFormation模板。作为CloudFormation模板的一部分,我还想添加订阅过滤器,以便将CloudWatch日志发送到不同的帐户。 然而,由于我事先不知道日志组的名称,也找不到任何方法来引用它们,所以我无法解决这个问题 有办法吗?您可以使用函数获取日志组名称。例如: "LogGroupName": { "Fn::Join": [ "", [ "/aws/lambda/"
有办法吗?您可以使用函数获取日志组名称。例如:
"LogGroupName": {
"Fn::Join": [
"",
[
"/aws/lambda/",
{
"Ref": "MyLambdaFunction"
}
]
]
}
请注意,MyLambdaFunction
是CloudFormation模板中Lambda函数块的名称。您可以尝试使用调用Lambda,而Lambda反过来可以使用测试负载或类似的内容运行Lambda,它最终将创建一个日志流,然后您可以引用该日志组进行订阅,如praveen前面所述。它应该适合您。它创建一个日志组资源,其名称与Lambda函数将使用的名称匹配。然后,您可以在需要时引用该日志组。您必须为Lambda函数指定一个名称,而不是使用默认的命名行为。可以使用堆栈名称使其唯一
比如:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"FunctionLogGroup": {
"Type": "AWS::Logs::LogGroup",
"Properties": {
"LogGroupName": {
"Fn::Sub": "/aws/lambda/MyFunction-${AWS::StackName}"
}
}
},
"MyFunctionNameRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"ManagedPolicyArns": ["arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"],
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Action": ["sts:AssumeRole"],
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
}
}]
}
}
},
"MyFunction": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": "def index():\n return 'hello world'\n"
},
"FunctionName": {
"Fn::Sub": "MyFunction-${AWS::StackName}"
},
"Handler": "handler.index",
"MemorySize": 128,
"Role": {
"Fn::GetAtt": [
"MyFunctionNameRole",
"Arn"
]
},
"Runtime": "python3.6"
},
"DependsOn": [
"FunctionLogGroup"
]
},
"MySubscriptionFilter": {
"Type" : "AWS::Logs::SubscriptionFilter",
"Properties" : {
"DestinationArn": "TODO TODO",
"FilterPattern": "",
"LogGroupName": {"Ref": "FunctionLogGroup"},
"RoleArn": "TODO TODO"
}
}
}
}
谢谢你,普拉文。这对我很有帮助,但现在我进入了下一步,在创建堆栈的过程中,我得到了一个错误:指定的日志组不存在。(服务:AWSLogs;状态代码:400;错误代码:ResourceNotFoundException;请求ID:e4a3ffd1-0b19-4c83-b172-9f19737e2e8b)可能只有在第一次调用后才创建日志?我们可以在这里做些什么吗?您可以使用Lambda函数期望的名称在CloudFormation中创建日志组。然后,您可以依靠该日志组资源进行订阅。谢谢kichik。我试图遵循您的指导原则,但在构建堆栈时,从函数定义中删除这一行时,我从AWS:NullNullNull(服务:AWSLambdaInternal;状态代码:400;错误代码:null;请求ID:null):{“FunctionName”:“{“Fn::Sub”:“/AWS/lambda/FunctionName-${AWS::StackName}”中得到了一个奇怪的错误},我能够创建堆栈。有什么想法吗?似乎只是使用了:“FunctionName”:{“Fn::Sub”:“/FunctionName-${AWS::StackName}”}就成功了。再次感谢。是的,那是个打字错误。函数名不应包含
/aws/lambda
。