使用AWS Lambda的CloudWatch事件通知

CloudWatchEvents的主要用例是跟踪整个AWS基础架构中的更改。 当前,它支持在Auto Scaling组,EC2,EBS和其他各种事件中发出的事件。 为了对这些事件进行有意义的处理,我们需要一种消耗它们的方法。 AWS使用术语“ targets来指代任何想要消耗事件并支持AWS Lambda以及其他几个东西的事物。

在本文中,我们将看到如何设置AWS Lambda函数以使用CloudWatch中的事件。 到本文结尾,我们将拥有一个AWS Lambda函数,该函数会将通知发布到Slack通道。 但是,由于该机制是通用的,因此您应该能够根据用例对其进行自定义。 让我们开始吧!

设置和一般信息

可以在这里找到本文的代码存储库。 它具有两个子目录:

  • functions ,其中包含Lambda函数的源代码。
  • terraform ,具有基础结构配置。

要继续,我们将需要:

  • 一个AWS用户账户
  • 地貌
  • Python 3
  • Bash / Powershell /实用程序

AWS用户账户和CLI配置

我们将需要一个具有以下IAM策略的AWS账户:

  • AWSLambdaFullAccess
  • IAMFullAccess

AWS CLI和terraform将使用标准AWS配置,并在AWS配置文件中设置适当的凭证。

请注意,尝试演示可能需要付费。

地貌

我们将使用Terraform设置整个基础架构,包括上传Lambda函数。

Python 3

我们的Lambda函数将用Python 3编写,并且我们将在用于部署和更新AWS基础设施的脚本中使用Python。

Bash / Powershell /实用程序

如果您使用的是Linux / OS X,则需要bash来运行脚本。 对于Windows,您将需要powershell 。 在Linux / OS X上,我们将使用zip命令创建Lambda部署工件。

体系结构概述

我们将在本文中构建的解决方案的整体体系结构如下所示:

AWS CloudWatch event -> Lambda function invoked -> Notifications

我们将重点关注两个事件:

  • EC2状态更改事件:当AWS EC2实例更改状态–启动新的EC2实例或终止现有的EC2实例时,将发生此事件。
  • CloudWatch运行状况 事件:当您的AWS账户中发生与运行状况相关的基础架构更改时,就会发生CloudWatch 运行状况事件 。

要使CloudWatch事件自动触发Lambda函数,我们需要设置cloudwatch rule 。 无论我们正在处理事件还是处理事件,接收事件的Lambda函数都将具有相同的基本结构。

我们将在Python 3.6中编写Lambda函数,一个完全正常运行的函数如下所示:

def handler(event, context):print(event)

函数名称是handler ,它带有两个参数: eventcontextevent对象具有触发Lambda函数的事件的有效负载, context对象具有与特定事件相关的各种元数据 。

为了了解如何完成上述所有工作,我们将首先实现一个解决方案,该解决方案将在EC2实例更改状态时调用Lambda函数。

演示:EC2实例运行通知

此通知的Lambda函数如下所示,并保存在文件main.py

def handler(event, context):print(event)

每当调用它时,它将事件主体打印到标准输出,该输出将自动记录到AWS CloudWatch日志中。 我们将讨论如何尽快上载Lambda函数。 首先,让我们简要介绍一下要调用的Lambda函数的基础结构设置。

可以在文件ec2_state_change.tf找到Terraform配置。 它定义了以下主要地形资源:

aws_cloudwatch_event_rule

这定义了我们希望调用lambda函数的规则。 EC2实例状态更改的event_pattern定义为:

"source": [ "aws.ec2" ],
"detail-type": [ "EC2 Instance State-change Notification" ]

aws_cloudwatch_event_target

接下来,我们定义使用此资源在事件发生时调用的内容。 关键参数是:

target_id = "InvokeLambda"
arn       = "${aws_lambda_function.ec2_state_change.arn}"
}

arn参数为Lambda函数指定Amazon资源名称。

aws_lambda_function

该资源注册了lambda函数,并具有以下关键参数:

function_name = "ec2_state_change"
role          = "${aws_iam_role.ec2_state_change_lambda_iam.arn}"
handler       = "main.handler"
runtime       = "python3.6"s3_bucket         = "aws-health-notif-demo-lambda-artifacts"
s3_key            = "ec2-state-change/src.zip"
s3_object_version = "${var.ec2_state_change_handler_version}"

上面的function_name是AWS的标识符,与代码中的函数名称没有任何关系。 由另一资源指定的Lambda函数的IAM角色具有默认的sts:AssumeRole策略和允许将函数日志推送到CloudWatch的策略。

handler的格式为<python-module>.<function>并指定要调用的Python函数名称。 runtime指定AWS Lambda运行时。

s3_bucket指定将存储Lambda代码的存储区, s3_key是Lambda代码的键名,而s3_object_version允许我们部署上述对象的特定版本。

ec2_state_change_cloudwatch

定义的最后一个关键资源允许CloudWatch调用我们的Lambda函数,并具有以下参数:

action        = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.ec2_state_change.function_name}"
principal     = "events.amazonaws.com"
source_arn    = "${aws_cloudwatch_event_rule.ec2_state_change.arn}"

上载Lambda函数

正如我们在Lambda函数的配置中看到的那样,Lambda函数的代码将存在于S3中。 因此,在每次代码更改后,我们将使用AWS CLI在S3中更新代码,如下所示。 在Linux上,这看起来类似于:

# Create a .zip of src
$ pushd src
$ zip -r ../src.zip *
$ popd$ aws s3 cp src.zip s3://aws-health-notif-demo-lambda-artifacts/ec2-state-change/src.zip

我们可以使上述执行成为连续集成管道的一部分。

部署最新版本的代码

将代码上传到S3之后,我们可以运行terraform来更新Lambda函数,以使用新版本的代码,如下所示:

$ version=$(aws s3api head-object --bucket aws-health-notif-demo-lambda-artifacts --key ec2-state-change/src.zip)
$ version=$(echo $version | python -c 'import json,sys; obj=json.load(sys.stdin); print(obj["VersionId"])')# Deploy to demo environment
$ pushd ../../terraform/environments/demo
$ ./tf.bash cloudwatch_event_handlers apply -var ec2_state_change_handler_version=$version \-target=aws_lambda_function.ec2_state_change \-target=aws_lambda_permission.ec2_state_change_cloudwatch \-target=aws_cloudwatch_event_target.ec2_state_change \-target=aws_iam_role_policy.ec2_state_change_lambda_cloudwatch_logging
$ popd

可以将上述两个步骤封装在一个脚本中,该脚本成为创建EC2状态更改CloudWatch事件处理程序以及更新处理它的Lambda函数的单个入口点。

运行演示

要在AWS账户中设置上述Lambda函数和所有必要的基础架构,我们只需要运行functions\ec2_state_change\deploy.bashfunctions\ec2_state_change\deploy.ps1脚本即可。 完成后,如果您创建一个新的EC2实例或停止/终止现有实例,您将看到CloudWatch日志,如下所示:

[2018-07-04T09:46:18+10:00] (2018/07/03/[$LATEST]aa226226b6b24a0cae83a948dcc29b95) START RequestId: 4798542c-7f1b-11e8-8493-836165a23514 Version: $LATEST[2018-07-04T09:46:18+10:00] (2018/07/03/[$LATEST]aa226226b6b24a0cae83a948dcc29b95) {'version': '0', 'id': '73c10269-00a0-644d-b92b-820846bb19db', 'detail-type': 'EC2 Instance State-change Notification', 'source': 'aws.ec2', 'account': '033145145979', 'time': '2018-07-03T23:46:16Z', 'region': 'ap-southeast-2', 'resources': ['arn:aws:ec2:ap-southeast-2:033145145979:instance/i-0e1153ece20b77590'], 'detail': {'instance-id': 'i-0e1153ece20b77590', 'state': 'pending'}}[2018-07-04T09:46:18+10:00] (2018/07/03/[$LATEST]aa226226b6b24a0cae83a948dcc29b95) END RequestId: 4798542c-7f1b-11e8-8493-836165a23514

演示:AWS Health Events-> Slack

接下来,我们将编写一个Lambda函数,它将AWS Health Health事件发布到您选择的Slack通道。 首先,我们将为Slack频道配置一个传入的Webhook。 请查看此链接以开始如何为您的频道添加一个。 如果按照设置进行操作,您将拥有一个类似于https://hooks.slack.com/services/string/<string>/<string>的webhook URL。 在此阶段之后,我将假定我们具有此Webhook URL。

编写Lambda函数

Lambda函数将如下所示:

import os
import sys
import jsonCWD = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, os.path.join(CWD, "libs"))import requestsdef handler(event, context):WEBHOOK_URL = os.getenv("WEBHOOK_URL")if not WEBHOOK_URL:print("WEBHOOK_URL not defined or empty")return# see: https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html#health-event-types for event structure r = requests.post(WEBHOOK_URL,json = {'text': '*New AWS Health event* ```{0}```'.format(str(event))})print(r)

基础架构配置

Lambda函数的基础结构配置与我们先前的功能完全相同,除了aws_cloudwatch_event_rule定义event_pattern方式如下:

"source": [ "aws.health" ],
"detail-type": [ "AWS Health Event" ]

部署Lambda函数

与上面的EC2状态更改演示类似,要部署上述功能,我们将在functions/health_event目录中运行部署脚本:

$ HEALTH_EVENT_WEBHOOK_URL="<your webhook url>" ./deploy.bash

除了部署Lambda函数之外,这还将创建必要的CloudWatch事件规则并设置目标。

一切完成后,您可以直接使用AWS CLI调用Lambda函数:

$ aws lambda invoke --invocation-type RequestResponse --function-name health_event --log-type Tail --payload '{"message":"hello"}' outfile.txt

您应该在配置的频道中看到一条松弛消息:

云观察

松弛消息

摘要

在本文中,我们学习了如何将Lambda函数设置为CloudWatch事件的目标。 Slack通知演示有效,但可以通过以下两种方式进行改进:

  • 可以使用AWS Secrets Manager静态加密webhook URL。
  • 通过处理传入消息,可以使通知更丰富。

本文使用的存储库位于此处 。

以下资源应有助于进一步了解:

  • CloudWatch活动
  • 在Python中编写Lambda函数的指南
  • 适用于AWS的Terraform指南

翻译自: https://www.javacodegeeks.com/2018/07/cloudwatch-event-notifications-aws.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

r语言 中断r的输入_R语言_004数据输入

现实的情况是&#xff0c;我们大部分遇到的都是表格数据&#xff0c;在R语言里面叫数据框&#xff0c;数据来源一般不可能我们自己在程序开始前手动录入&#xff0c;正常的逻辑是从外面读取现成的数据&#xff0c;再预处理、建模什么的。根据经验&#xff0c;现在的数据来源主要…

我的机器人现在无处可去。 无家可归。 无服务器。

我通常会关注各种网站-有关最新出版物&#xff0c;热门新优惠&#xff0c;限时游戏和竞赛等。 其中大多数不提供“干净”的通知系统&#xff0c;例如RSS feed。 因此&#xff0c;我经常不得不刮擦他们HTML才能达到我所需要的。 这意味着我经常需要运行一些自定义的字符串操作…

dubbo 消费者也要暴露端口吗_一文详细解读 Dubbo 中的 http 协议

(给ImportNew加星标&#xff0c;提高Java技能)转自&#xff1a;Kirito的技术分享&#xff0c;作者&#xff1a;kiritomoe太阳红彤彤&#xff0c;花儿五颜六色&#xff0c;各位读者朋友好&#xff0c;又来到了分享 Dubbo 知识点的时候了。说到 Dubbo 框架支持的协议&#xff0c;…

非一致性访存系统_Hibernate事实:访存策略的重要性

非一致性访存系统在使用ORM工具时&#xff0c;每个人都承认数据库设计和实体到表映射的重要性。 这些方面引起了很多关注&#xff0c;而诸如获取策略之类的事情可能只是推迟了。 我认为&#xff0c;不应将实体获取策略与实体映射设计分开&#xff0c;因为除非经过适当设计&…

应用新的JDK 11字符串方法

在“ 使用JDK 11的Java字符串上的新方法 ”和“ String&#xff03;repeat即将加入Java&#xff1f; ”&#xff0c;我讨论了JDK 11引入Java String的六个新方法。 可用的早期访问JDK 11构建已经包含了这些新方法&#xff0c;在这篇文章中&#xff0c;我将使用其中的一种早期访…

为什么需要切换到在线签署文档和合同

嘿&#xff0c;怪胎&#xff0c; 今天&#xff0c;我们为您带来一些不同。 无论您是开发人员&#xff0c;经理还是设计师&#xff0c;这都会提高您的生产力和效率。 对于公司和个人而言&#xff0c;良好地管理文书工作是强大基础的最重要部分之一。 将工作流程从纸质转移到数…

github怎么自动更新被人更新过的项目_GitHub 的这 8 个实用技巧,95%的人不知道...

知道的越多&#xff0c;不知道的就越多&#xff0c;业余的像一棵小草&#xff01;编辑&#xff1a;业余草来源&#xff1a;https://www.xttblog.com/?p49881、一秒钟把Github项目变成前端网站GitHub Pages大家可能都知道&#xff0c;常用的做法&#xff0c;是建立一个gh-pages…

java 注解 属性 类型_收藏!你一定要知道的Java8中的注解

全文共3002字&#xff0c;预计学习时长6分钟海中有大量的注解!JavaSE 1.5中首次引入了注解。Java注解的目的是允许程序员编写关于其程序的元数据。在OracleDocs中&#xff0c;注解的定义是:“注解是元数据的一种形式&#xff0c;它提供的数据与程序本身无关。”注解可以在代码的…

camel 多个 to_具有多个查询参数的Camel CXF服务

camel 多个 to出色的Apache Camel团队忙于解决查询中多个参数的处理问题&#xff0c;这是一种解决方法。 希望本文将在下一版本的Camel中不再使用。 &#xff08;目前&#xff0c;我使用2.7.5&#xff09; 问题 大于1的查询参数作为null值传递给Camel-CXF服务。 假设网址中有四…

select * from where 三个条件_VBA学习笔记70: Select语句基础

学习资源:《Excel VBA从入门到进阶》第72集 by兰色幻想 这节课来详细讲解Select语句。 Select 字段 from 表 where 条件 例:从sheet1中筛选全部数据。 * 表示全部字符,无条件可以省略where。 Select * from [sheet1$] 如果是对表中特定单元格区域进行查找,可以在[sheet1$]的…

使用Servlet和Bootstrap上传Ajax文件

介绍 在本教程中&#xff0c;我们将检查Ajax文件上传如何与Servlet一起使用。 同样&#xff0c;我们将用Bootstrap装饰表单并通过jQuery Ajax上传ajaxify文件。 实作 基本的servlet实现是相同的。 因此&#xff0c;我们需要做的第一件事是更新我们的web.xml文件并为我们的应用…

linux文件系统dentry_Linux文件系统(四)---三大缓冲区之inode缓冲区 (内存inode映像 )...

在文件系统中&#xff0c;有三大缓冲为了提升效率&#xff1a;inode缓冲区、dentry缓冲区、块缓冲。(内核&#xff1a;2.4.37)一、inode缓冲区为了加快对索引节点的索引&#xff0c;引入inode缓冲区&#xff0c;下面我们看Linux/fs/inode.c代码。inode缓冲区代码1、一些数据结构…

使用这些先进的GC技术提高应用程序性能

应用程序性能是我们的首要考虑因素&#xff0c;垃圾收集优化是取得小而有意义的进步的好地方 自动化垃圾收集&#xff08;与JIT HotSpot编译器一起&#xff09;是JVM中最先进&#xff0c;最有价值的组件之一&#xff0c;但是许多开发人员和工程师对垃圾收集&#xff08;GC&a…

mysql中lead_SqlServer2012中LEAD函数简单分析_MySQL

LEAD函数简单点说&#xff0c;就是把下一行的某列数据提取到当前行来显示&#xff0c;看示例更能解释清楚&#xff0c;先看测试用脚本DECLARE TestData TABLE(ID INT IDENTITY(1,1),Department VARCHAR(20),LastName VARCHAR(20),Rate FLOAT)INSERT INTO TestData(Department,L…

堆栈溢出回答了我们不知道的Java首要问题

您不应该错过的堆栈溢出问题集合&#xff1a; 这不是秘密&#xff1b; 我们都使用堆栈溢出。 它掌握了生命&#xff0c;宇宙以及几乎所有与代码相关的内容的答案。 该平台为开发人员&#xff0c;工程师和其他人员提供了一个找到他们所面临问题的答案的地方&#xff0c;或者至少…

sequelize连接mysql_node.js通过Sequelize 连接MySQL

node.js通过Sequelize 连接MySQL一.通过koa2脚手架构建项目1.1 安装koa-generator在终端输入&#xff1a;$ npm install -g koa-generator11.2 使用koa-generator生成koa2项目$ koa2 HelloKoa21成功创建项目后&#xff0c;进入项目目录&#xff0c;并执行npm install命令$ cd H…

杀java_java怎么杀掉java进程

展开全部java中有调用外部程序的e69da5e887aa62616964757a686964616f31333337623431类&#xff0c;Runtime.getRuntime().exec("./**.exe");此函数返回的是一个Process 对象&#xff0c;该对象在创建后&#xff0c;可以对它进行 destroy () 杀掉子进程、 waitFor () …

高级java开发_我最喜欢的Java高级开发人员书籍

高级java开发我上一篇博客文章 &#xff08;我对高级Java开发人员的十个最喜欢的在线资源&#xff09;的想法&#xff0c;是由Xiaoran Wang发表的“面向高级Java开发人员的十大网站”的启发。 Wang还写了一篇名为“面向Java高级开发人员的十大书籍”的文章。 就像关于高级Java开…

camera.swf java_java调用摄像头保存图片上传功能

在项目中要用到jsp页面实现网页采集摄像头图像&#xff0c;并实现上传的功能&#xff0c;页面主要js调用的&#xff0c;所以可以使用多种语言php,asp等都可以使用&#xff0c;而且是跨浏览器的。可以整合的到SSH项目中和struts1或者struts2项目中使用方法1&#xff1a;下载 pri…

java 北理工 教材_北理工《Java技术与应用》在线作业

北理工《Java技术与应用》在线作业可以代做所有奥鹏平台的作业、小论文、毕业论文、离线作业、考核作业、在线作业、在线测试&#xff0c;有需要的请联系本人一、单选题(共 20 道试题&#xff0c;共 40 分。)V1. Socket对象中____函数获取远程端口。A. getPort( )B. getLocalPo…