Aws lambda 如何使用CloudFormation添加订阅筛选器?

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/"

我正在用几个AWS Lambda函数生成一个CloudFormation模板。作为CloudFormation模板的一部分,我还想添加订阅过滤器,以便将CloudWatch日志发送到不同的帐户。 然而,由于我事先不知道日志组的名称,也找不到任何方法来引用它们,所以我无法解决这个问题


有办法吗?

您可以使用函数获取日志组名称。例如:

"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