License:AttributionNonCommercialShareAlike4。0International 本文出自SuzfBlog。如未注明,均为SUZF。NET原创。 转载请注明:https:suzf。netpost1460 这篇文章演示了如何使用AmazonCloudWatchlogsubscription自动对特定AWSLambda函数错误发出警报通知。CloudWatchLogs让您可以在日志条目与模式匹配时调用Lambda函数。AmazonCloudWatchalarms用于在错误发生时发出通知Lambda函数;这个通知不会提供有关错误任何的细节。对于您需要在通知中显示具体说明错误的情况,您可以使用CloudWatchLogssubscription来实现。CloudWatchLogs订阅让您可以匹配日志中具有特定错误模式的条目,并收到有关这些错误详细信息的通知。这为您节省了额外的步骤解析日志。当在您的Lambda函数中检测到该错误模式时,您还可以将其用作构建自动反应措施的蓝图。 这篇文章将向您介绍如何配置触发AWSLambda函数来处理匹配日志的CloudWatch日志订阅。Lambda函数使用AmazonSNS发送包含特定错误详细信息和日志位置的电子邮件。解决方案架构图 此解决方案的架构相对简单。您有一堆Lambda函数,您希望收到有关其特定严重错误的通知。CloudWatchLogs从这些Lambda函数中过滤特定模式的日志。例如ERROR、CRITICAL或自定义错误。错误处理Lambda函数依次向AmazonSNS主题发布消息,可以订阅该主题以在发生错误时收到电子邮件。 出于本文的目的,我们将使用以下示例Lambda函数生成错误日志:importloggingimportoslogging。basicConfig(levellogging。DEBUG)loggerlogging。getLogger(name)deflambdahandler(event,context):logger。setLevel(logging。DEBUG)logger。debug(ThisisasampleDEBUGmessage。。!!)logger。error(ThisisasampleERRORmessage。。。。!!)logger。info(ThisisasampleINFOmessage。。!!)logger。critical(Thisisasample5xxerrormessage。。!!)部署教程前置条件登陆AWSManagementConsole。具有权限创建以下资源:IAMrolesandpolicies,SNStopics,Lambdafunctions,andCloudWatcheventrules。 要实施此解决方案,您必须创建:SNStopicIAMroleLambdafunctionCloudWatchlogtrigger步骤1:创建SNStopic 要创建SNS主题,请完成以下步骤:打开AmazonSNSconsole在左侧导航栏选择Topics选择创建topic。选择Standard类型,输入topicnameMySNSTopic点击Createtopic。创建成功后自动跳转到MySNSTopic页面。详细信息部分显示主题的名称、ARN、显示名称(可选)和主题所有者的AWS账户ID。在详情页面,拷贝topicARN到粘贴板,比如:arn:aws:sns:useast1:123456789012:MySNSTopic在做了导航,选择SubscriptionsandCreatesubscription。在Createsubscription页面,做一下操作:输入之前拷贝的topicARN:arn:aws:sns:useast1:123456789012:MySNSTopicProtocol选择EmailEndpoint,输入可以接受邮件的邮件地址选择Createsubscription。请注意,对于电子邮件订阅,您必须通过点击电子邮件收到的确认订阅链接来确认订阅。确认订阅后,您就可以接收电子邮件通知了。步骤2:创建IAMrole 创建IAMrole,需要完成一下操作。获取更多信息,请看CreatinganIAMrole。在IAMconsole页面,在左侧导航栏选择Policies,之后选择CreatePolicy。选择JSON选项卡输入下面IAMpolicy,用之前创建的SNStopicARN替换TopicARN:{Version:20121017,Statement:〔{Effect:Allow,Action:sns:Publish,Resource:arn:partition:sns:region::nameoftheSNStopicfrompreviousstep},{Effect:Allow,Action:〔logs:CreateLogGroup,logs:CreateLogStream,logs:PutLogEvents〕,Resource:arn:partition:logs:region::loggroup:awslambdanameofthelambdafunctionyouaregoingtocreateinnextstep:}〕}选择Reviewpolicy。给这个policy输入name(MyCloudWatchRole)并Createpolicy。记下此策略的名称以供后续步骤使用在左侧导航栏,选择Roles点击Createrole。在Selectroletype页面,选择AWS服务作为您的可信实体,并在常见用例下选择Lambda。选择Next:Permissions。过滤刚刚创建的策略名称,然后选中该复选框。选择Next:Tags,并给它一个合适的标签。选择Next:Review。为这个IAM角色指定一个合适的名称,并记下来以备将来使用。选择Createrole。步骤3:创建Lambdafunction 要创建Lambda函数,请完成以下步骤。获取更多信息,参见CreateaLambdaFunctionwiththeconsole。在Lambdaconsole,选择Authorfromscratch。FunctionName,输入函数名称。Runtime,选择Python3。7。Executionrole,选择Useanexistingrole,选择之间创建的IAMrole。选择CreateFunction,移除defaultfunction,拷贝下列代码到FunctionCode窗口:Copyright2020Amazon。com,Inc。oritsaffiliates。AllRightsReserved。LicensedundertheApacheLicense,Version2。0(theLicense)。YoumaynotusethisfileexceptincompliancewiththeLicense。AcopyoftheLicenseislocatedathttp:aws。amazon。comapache2。0orinthelicensefileaccompanyingthisfile。ThisfileisdistributedonanASISBASIS,WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied。SeetheLicenseforthespecificlanguagegoverningpermissionsandlimitationsundertheLicense。Description:ThisLambdafunctionsendsanemailnotificationtoagivenAWSSNStopicwhenaparticularpatternismatchedinthelogsofaselectedLambdafunction。TheemailsubjectisExecutionerrorforLambdainsertLambdafunctionname。TheJSONmessagebodyoftheSNSnotificationcontainsthefulleventdetails。Author:SudhanshuMalhotraimportbase64importboto3importgzipimportjsonimportloggingimportosfrombotocore。exceptionsimportClientErrorlogging。basicConfig(levellogging。INFO)loggerlogging。getLogger(name)deflogpayload(event):logger。setLevel(logging。DEBUG)logger。debug(event〔awslogs〕〔data〕)compressedpayloadbase64。b64decode(event〔awslogs〕〔data〕)uncompressedpayloadgzip。decompress(compressedpayload)logpayloadjson。loads(uncompressedpayload)returnlogpayloaddeferrordetails(payload):errormsglogeventspayload〔logEvents〕logger。debug(payload)loggrouppayload〔logGroup〕logstreampayload〔logStream〕lambdafuncnameloggroup。split()logger。debug(fLogGroup:{loggroup})logger。debug(fLogstream:{logstream})logger。debug(fFunctionname:{lambdafuncname〔3〕})logger。debug(logevents)forlogeventinlogevents:errormsglogevent〔message〕logger。debug(Message:serrormsg。split())returnloggroup,logstream,errormsg,lambdafuncnamedefpublishmessage(loggroup,logstream,errormsg,lambdafuncname):snsarnos。environ〔snsARN〕GettingtheSNSTopicARNpassedinbytheenvironmentvariables。snsclientboto3。client(sns)try:messagemessageLambdaerrorsummarymessagemessageLogGroupName:str(loggroup)messageLogStream:str(logstream)messageLogMessage:messagestr(errormsg。split())messageSendingthenotification。。。snsclient。publish(TargetArnsnsarn,SubjectfExecutionerrorforLambda{lambdafuncname〔3〕},Messagemessage)exceptClientErrorase:logger。error(Anerroroccured:se)deflambdahandler(event,context):ploadlogpayload(event)lgroup,lstream,errmessage,lambdanameerrordetails(pload)publishmessage(lgroup,lstream,errmessage,lambdaname)在Environmentvariables中,输入以下键值对:KeysnsARNValuetheARNoftheMySNSTopiccreatedearlier点击Save。步骤4。创建CloudWatchlogtrigger要添加触发器,请选择添加触发器,然后从下拉列表中选择CloudWatchLogs。在Loggroup下拉列表,选择要获取错误通知的Lambda函数的CloudWatch日志组名称。在我们的例子中,这将是上面讨论的示例错误生成Lambda函数的日志组。在过滤器名称输入适当的值,并在过滤器模式下,输入您希望收到通知的日志的过滤器值。例如?ERROR?WARN?5xx将过滤日志中包含ERROR、WARN或5xx的日志。Logfilterandpatternsyntax中包含更多其他复杂模式的示例。启用trigger添加解决方案验证 为验证我的解决方案,我将运行生成错误日志Lambda函数并过滤日志中包含?ERROR?WARN?5xx的日志进行邮件通知,如下所示: 同样,我可以为任何特定错误创建一个过滤器模式,例如过包含5xx的日志,并仅针对该错误日志获得以下通知: 卸载 为了避免持续收费,删除在前面的步骤中创建的资源,包括CloudWatchEventsruleLambdafunction和SNStopic结论 这篇文章演示了如何使用CloudWatchLog过滤器来解析Lambda函数的日志并通过电子邮件通知过滤到的错误信息。有关进一步阅读,请参阅:UsingAmazonCloudWatchandAmazonSNStonotifywhenAWSXRaydetectselevatedlevelsoflatency,errors,andfaultsinyourapplicationCloudWatchLogsfilterandpatternsyntax此文为翻译源链接为https:aws。amazon。comblogsmtgetnotifiedspecificlambdafunctionerrorpatternsusingcloudwatch 感谢SudhanshuMalhotra和RajatMathur的分享