aws lambda使用_使用AWS Lambda的CloudWatch事件通知

aws lambda使用

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

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

云观察

松弛消息

摘要

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

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

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

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

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

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

aws lambda使用

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

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

相关文章

Struts2中的OGNL表达式和ValueStack

文章目录OGNL 是干什么用的示例代码一示例代码二使用OGNL获取JavaBean对象的属性值获取集合属性中元素的属性的值XWork 中对 OGNL 的扩展示例代码Struts2 对 OGNL 的封装OGNL 可以用在哪些地方OGNL 的结构示意图XWork 对 OGNL 改造后的结构示意图Struts 2 对 OGNL 改造后的结构…

matlab画图五角星标记,Matlab---画图线型、符号及颜色

Matlab 画图线形、颜色、数据点形状的选择1&#xff0c;线形- Solid line (default)-- Dashed line: Dotted line-. Dash-dot line2&#xff0c;颜色r Redg Greenb Bluec Cyanm Magentay Yellowk Blackw White3&#xff0c;数据点的形状 Plus signo Circle* Asterisk. Pointx C…

php 淘宝客接口开发,如何使用PHP的curl函数调用维易淘客接口

《如何使用PHP的curl函数调用维易淘客接口》要点&#xff1a;使用curl调用维易淘客接口高佣转链维易淘客接口是用GET方式调用的&#xff0c;直接用GET调用即可&#xff0c;以下用PHP为例&#xff1a;使用curl调用维易淘客接口高佣转链&#xff1a;$apihttp://api.vephp.com/hca…

querydsl 转字符串_QueryDSL中包含通配符的字符串的精确匹配

querydsl 转字符串在我们最近的一个项目中&#xff0c;我们的客户要求一个搜索字段&#xff0c;该字段可以搜索名字&#xff0c;姓氏和电子邮件地址&#xff0c;唯一的通配符是星号“ *”&#xff0c;表示部分匹配。 听起来很简单&#xff0c;但这使我们陷入了混乱。 在我们的项…

Java中,我自己定义的某个类,去实现某个接口,是否必须实现该接口的全部抽象方法呢?

不一定&#xff0c;关键要看子类是否是抽象类。 如果子类是非抽象类&#xff0c;则必须实现接口中的所有方法&#xff1b;如果子类是抽象类&#xff0c;则可以不实现接口中的所有方法&#xff0c;因为抽象类中允许有抽象方法的存在&#xff01; 一、抽象类定义 抽象类往往用…

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

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

Java 的面向接口编程

假设有这样的代码&#xff1a; F f new G(); f.do(); f.cook(); ...F 是一个接口&#xff0c;G 是 F 的一个实现类&#xff08;也叫具体类/派生类&#xff09;。 如果现在需要另外一个实现类 H 采用其他技术实现接口 F 的所有抽象方法&#xff0c;那么只要修改一条代码&…

mysql 表数据diff,mysqldiff使用笔记

背景手上有个项目&#xff0c;有三个环境:本地开发,测试环境,线上环境&#xff0c;历史原因怀疑数据库表字段可能出现不匹配&#xff0c;所以寻找合适的工具比较数据库表结构。找到了mysqldiff。准备工具正好手上有台windows机器&#xff0c;使用windows版本测试安装mysqldiff是…

java超出gc开销_通过这5个简单的技巧减少GC开销

java超出gc开销编写代码的五种简单方法&#xff0c;可以提高内存效率&#xff0c;而无需花费更多时间或降低代码可读性 垃圾回收会为您的应用程序增加多少开销&#xff1f; 您可能不知道确切的数字&#xff0c;但您确实知道总有改进的余地。 尽管自动GC是最有效的过程&#x…

JSTL(Java 标准标签库)

文章目录JSTL 简介JSTL 可以使用在哪里JSTL 使用步骤使用标签if 语句选择语句迭代遍历语句URL重写设置属性值删除属性值异常捕获导入其它 JSP 页面重定向输出指定的值JSTL 简介 Java Standard Taglib(Java 标准标签库)。 JSTL 是一种代替 JSP 中的 Java 代码的技术。sun 公司…

php hash代码下载,PHP中的哈希表 hash_insert

[php]代码库int hash_insert(HashTable *ht, char *key, void *value){// check if we need to resize the hashtableresize_hash_table_if_needed(ht); // 哈希表不固定大小&#xff0c;当插入的内容快占满哈表的存储空间// 将对哈希表进行扩容&#xff0c; 以便容纳所有的元素…

跟踪React流–将Spring Cloud Sleuth与Boot 2结合使用

Spring Cloud Sleuth在OpenZipkin Brave的基础上增加了对Spring工具的支持&#xff0c; 从而使Spring Boot应用程序的分布式跟踪变得异常简单。 这是关于使用此出色的库添加对分布式跟踪的支持所需内容的简要介绍。 考虑两个应用程序–一个使用上游服务应用程序的客户端应用程…

JDK命令之java -- 用来执行字节码文件,即用来执行Java程序

文章目录一、命令介绍二、用法格式三、常用选项四、常用选项详解-client&#xff0c;-server-hotspot-classpath,-cp-classpath-Dvalue-verbose[:class|gc|jni]-verbose:gc-verbose:jni-version-showversion-ea[:...|:] 和 -enableassertions[:...|:]-da[:...|:] 和 -disableas…

php中双引号的区别,PHP中单引号和双引号的区别

好久没有写博客了&#xff0c;都忘了积累知识啦……现在开始全新的生活&#xff0c;重拾记录的习惯。今天要写的就是PHP中单引号和双引号的区别。在PHP中&#xff0c;我们可以使用单引号或者双引号来表示字符串。不过我们作为开发者&#xff0c;应该了解其中的区别。一、字符串…

sbe 详解_内部简单二进制编码(SBE)

sbe 详解SBE是用于金融行业的非常快速的序列化库&#xff0c;在本博客中&#xff0c;我将介绍一些使其快速发展的设计选择。 序列化的全部目的是对消息进行编码和解码&#xff0c;并且有很多可用的选项&#xff0c;例如XML&#xff0c;JSON&#xff0c;Protobufer&#xff0c;…

php调用swf文件上传,swfupload-jquery-plugin AJAX+PHP 文件上传

var listitem>file.name (Math.round(file.size/1024) KB)>>>Pending;$(#log).append(listitem);$(this).swfupload(startUpload);})//绑定开始上传文件事件.bind(uploadStart, function(event, file){$(#log li#file.id).find(p.status).text(Uploading...);$(#lo…

aws lambda使用_使用AWS Lambdas扩展技术堆栈

aws lambda使用面对现实吧。 调试性能问题很困难&#xff0c;但是更难解决。 假设您发现了有害的代码&#xff0c;这些代码正在拖慢您的应用的运行速度。 最终会有一段时间&#xff0c;您发现此代码减速是同步的或线性执行的。 解决这些有问题的代码段的最有效方法之一就是将最…

Java声明定义抽象类/接口/继承/实现

文章目录声明定义抽象类声明定义接口派生类、抽象类、接口的继承要点声明定义抽象类 public abstract class CRMSystem {public abstract Client add(Client newGuy); //添加用户方法public abstract Event add(Event e, Client guy); //重载添加事件、用户方法public abstrac…

cuba开发_使用CUBA进行开发–与Spring相比有很大的转变?

cuba开发阅读另一个供内部公司使用的Web项目的要求时&#xff0c;您&#xff08;至少是我自己&#xff09;通常会看到一个很普通的集合&#xff1a;定义明确的数据存储结构&#xff08;或有时是现有的旧数据库&#xff09;&#xff0c;大量的数据输入形式&#xff0c;非常复杂的…

imagettftext php7,mac php7 imagettftext

Mac OS X 自带PHP环境gd库安装扩展freetype问题&#xff1a; “Call to undefined function imagettftext()”解决方法&#xff1a;curl -s [http://php-osx.liip.ch/install.sh](https://link.jianshu.com/?thttp://php-osx.liip.ch/install.sh) | bash -s 7.3sudo vim ~/.ba…