我正在生成带有几个AWS Lambda函数的CloudFormation模板。作为CloudFormation模板的一部分,我还想添加一个订阅过滤器,以便将CloudWatch日志发送到另一个帐户。 但是,由于我事先不知道日志组的名称,并且找不到任何引用它们的方法,因此无法解决。
有办法吗?
答案 0 :(得分:1)
您可以使用函数来获取日志组名称。例如:
MyLambdaFunction
请注意, interface IMessageHandler<T> {
void Handle(T message);
}
class MessageBus {
private readonly Dictionary<Type, Action<object>> _handlers = new Dictionary<Type, Action<object>>();
void AddHandler<T>(IMessageHandler<T> handler) {
_messageHandlers[typeof(T)] = message => messageHandler.Handle((T)message);
}
public void Handle(object message)
{
_handlers[message.GetType()](message);
}
}
是CloudFormation模板中Lambda功能块的名称。
答案 1 :(得分:0)
您可以尝试使用custom function来调用lambda,而后者又可以使用测试有效负载或类似的东西运行lambda,这最终会创建日志流,然后您可以引用该日志组进行订阅如praveen先前所述。
答案 2 :(得分:-1)
Serverless的工作方式应该对您有用。它创建一个名称与您的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"
}
}
}
}