AWS Lambda允许运行一段代码,而不需要创建和管理服务器,也被称为无服务器方法。
AWS Lambda会决定运行一个函数需要多少CPU和内存,在必要时它会进行自动扩展。
一个要运行的代码被组织在lambda函数中,并可以用触发器来触发。可以使用CloudWatch日志检查结果。
作为一个触发器,你可以使用几乎所有的AWS服务,如API网关、SQS、应用负载平衡器、CloudFront、Kinesis,或一个外部事件,例如Hitub的webhook。
在这篇文章中,我们将创建一个简单的AWS Lambda函数,将检查其控制面板、可用选项和功能,然后将创建一个AWS API网关,该网关将转发HTTP请求到AWS Lambda函数。
AWS Lambda - 使用案例
一般来说,AWS中的Lambda真的可以做很多事情。这样的 "银弹",允许做AWS控制台本身没有实现的事情。
用例可以是。
- 一个网站:一个基于javascript的前端在AWS S3与静态托管,前端将通过AWS API网关接收请求,通过Lambda函数连接到数据库
- 日志分析:一个很好的例子是AWS WAF安全自动化,当所有传入的HTTP请求被发送到AWS Kinesis时,它将转发到Lambda,它将执行一些检查,如果需要将阻止一个客户的IP
- 备份自动化。AWS SNS可以发送一个事件,例如,当AWS S3桶中使用了太多的磁盘空间时,它可以发送一个Lambda函数,该函数将删除一些旧的备份
- 数据处理:例如,当一个新文件被上传到AWS S3时,它将产生一个事件,触发一个Lambda函数,该函数将执行视频文件的编码。
- 无服务器cronjob:通过CloudWatch Events按计划生成一个事件,触发Lambda函数。
组件和概念
让我们简单介绍一下AWS Lambda的主要概念。
- 函数:是在一个函数中运行的代码。可以是一个zip文件或Docker镜像*(部署包)。* 参见配置AWS Lambda函数。
- 触发器:一个AWS资源,将触发一个功能。这样的事件包括一个AWS服务和事件映射。请参阅调用AWS Lambda函数和使用AWS Lambda与其他服务。
- 事件: 一个JSON对象,包含Lambda函数处理的数据。
- 执行环境:执行函数的安全环境。参见AWS Lambda执行环境。
- 部署包:要运行的Lambda函数代码。可以是zip压缩文件或Docker镜像。见Lambda部署包。
- 运行时间:一个运行函数的工作环境。参见Lambda运行时间
- 层:包含运行一个函数的额外代码的压缩文件,例如--外部库。参见创建和共享Lambda层。
- 扩展:AWS Lambda允许使用扩展,可用于将一个函数与外部服务(如监控)集成。请参阅使用Lambda扩展。
- 并发并发:若干个Lambda函数实例同时运行以处理传入的数据。参见Lambda函数的并发性管理。
- 修饰语指的是一个版本或别名的 "指针"。参见Lambda函数版本。
- 目的地指一个AWS资源,函数将在此发送处理过的数据。请参阅配置异步调用的目的地。
创建一个 "Hello, World "的Lambda函数
首先,让我们创建一个最简单的Lambda函数,看看它是如何工作的,我们那里有什么。
创建一个函数
转到AWS Lambda,点击创建函数。
现在,让我们使用一个现有的模板。选择Use a blueprint,找到hello-world-python。
点击配置。
设置一个函数的名称,例如example-hello,留下一个默认的IAM角色--它将允许我们的函数使用CloudWatch Logs,并检查将使用的代码。
单击 "创建函数"。
切换到测试标签。
在这里,我们可以传递一个包含数据的JSON,由我们的函数来处理。
运行它。
现在,让我们去看看AWS控制台建议Lambda函数管理使用什么。
监控
第一件事是监控。在这里,我们可以使用AWS CloudWatch的指标和日志、AWS X-Ray的调用跟踪、Lambda洞察力和AWS CodeGuru。
配置
一般配置
- 内存设置:运行一个函数时允许使用的最大内存。另外,根据内存设置,Lambda会提供一个CPU限制:每1769MB,会有一个vCPU。参见配置函数内存(控制台)。
- 执行超时:最大可以设置为900秒,超过这个时间,函数的执行将被停止。记住,这将影响成本。见超时。
- IAM角色:包括对AWS资源有权限的IAM策略
触发器
好吧,触发器将触发我们的函数。
可以是几乎任何AWS服务。
例如,我们可以从AWS应用负载平衡器创建一个触发器,它将接受对特定URI的连接,并将其转发给Lambda函数。
权限
在这里,你可以查看和调整IAM角色和策略,这将配置一个函数的权限。
目的地
将一个函数的执行结果发送到哪里。
例如,可以是一个AWS SNS主题,它将转发到Opsgenie,Opsgenie将发送一个消息到Slack频道。
环境变量
可以在我们的函数中使用的变量。敏感数据可以用AWS密钥管理服务(KMS)进行加密。
VPC
一个函数可以被放置到一个专门的AWS虚拟私有云,以限制其网络访问。
监控和操作工具
监控设置,在这里你可以启用或禁用额外的服务,如AWS X-Ray、CloudWatch Lambda Insights和Amazon CodeGuru Profiler。
在Extentions中*,*你可以从已经存在的解决方案列表中选择,或者创建你自己的。
并发性
一个函数的实例可以同时运行的最大数量。请看Lambda函数的并发性管理。
可以是两种类型中的一种。
- 保留的并发性: 从整个账户中保留一个普遍可用的数字(默认为1000),并应用于整个函数,包括其所有版本和别名。
- 提供的并发性: 将准备一个已经初始化的运行时环境,所以在扩展过程中,你的函数将不必等待它,适用于一个特定的版本或别名
异步调用
事件队列的设置--寿命、出错时的重试次数、错误通知等。
见异步调用。
数据库代理
一个亚马逊RDS代理配置要与你的函数一起使用。RDS代理用于减少与数据库服务器的连接数。
文件系统
你可以在你的函数中装载AWS弹性文件系统目录。
别名
别名是一种指向你的函数代码的特定版本的指针,可以在以后的ARN中使用。
另外,你可以有几个别名,在它们之间分配请求。参见Lambda函数别名。
版本
AWS Lambda允许使用一个代码和部分设置的版本。当在开发环境中测试新的代码时,可能会很有用,例如,通过创建一个专用别名。
AWS Lambda和AWS API Gateway - 一个整合的例子
所以,我们已经检查了什么是AWS Lambda以及它在设置中的内容。
现在,让我们创建一个AWS API Gateway,将请求转发给AWS Lambda函数。
API Gateway将接受对*/test*URI的请求,并使用其事件将这些请求发送到我们的Lambda。
创建一个Lambda函数
这时,选择Author from scratch,在Runtime中使用Python。
保留默认代码。
这里,lambda_handler() 是一个默认的函数,当一个函数被调用时,它将被调用。它接受两个参数。
event:一个API网关事件,见与其他服务一起使用AWS Lambdacontext:允许的方法和参数来运行一个函数,见Python中的AWS Lambda上下文对象
创建一个AWS API网关
创建一个新的网关,将其类型设置为HTTP API。
添加一个集成。
选择Lambda,一个AWS区域,以及一个要调用的函数。
设置URI为*/test*。
留下默认阶段。
不到一分钟,你的网关就准备好了。复制它的URL。
并尝试使用curl 。
curl fwu399qo70.execute-api.us-east-2.amazonaws.com/test
"Hello from Lambda!"
要检查事件的全部内容,用 json.dumps():
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps(event)
}
在对代码进行修改后,按下部署键。
试试吧。
curl fwu399qo70.execute-api.us-east-2.amazonaws.com/test
{"版本": "2.0", "routeKey": "ANY /test", "rawPath": "/test", "rawQueryString":"", "headers": {"accept": "*/*", "content-length": "0", "host": "fwu399qo70.execute-api.us-east-2.amazonaws.com", "user-agent": "curl/7.78.0", "x-amzn-trace-id": "Root=1-611bbaa4-3cb7c28e4e3181dd647f1030", "x-forwarded-for": "194.***.***.29", "x-forwarded-port": "443", "x-forwarded-proto": "https"}, "requestContext":{"accountId": "534***385", "apiId": "fwu399qo70", "domainName": "fwu399qo70.executive-api.us-east-2.amazonaws.com", "domainPrefix": "fwu399qo70", "http": {"method": "GET", "path": "/test", "protocol": "HTTP/1.1", "sourceIp": "194.***.***.29", "userAgent": "curl/7.78.0"}, "requestId": "ENoZriIrCYcEPWg=", "routeKey": "ANY /test", "stage": "$default", "time":"17/Aug/2021:13:33:24 +0000", "timeEpoch": 1629207204179}, "isBase64Encoded": false}。
现在,让我们看看如何在函数中使用环境变量。
添加一个新的。
并用os.getenv() 来打印它的值。
import os
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': os.getenv('Env')
}
检查它。
curl fwu399qo70.execute-api.us-east-2.amazonaws.com/test
测试
另外,你可以改变默认的处理程序。
将lambda_handler 重命名为main_handler 。
import os
import json
def main_handler(event, context):
return {
'statusCode': 200,
'body': os.getenv('Env')
}
如果你现在会尝试访问这个函数,你会得到 内部服务器错误:
curl fwu399qo70.execute-api.us-east-2.amazonaws.com/test
{"message": "Internal Server Error"}。
向下滚动到Runtime设置。
再次运行它。
curl fwu399qo70.execute-api.us-east-2.amazonaws.com/test
测试
完成了。
-
[
](twitter.com/share?text=…: Linux, DevOps, and system administration "Tweet This Post")
-
[
](www.linkedin.com/shareArticl…: Linux, DevOps, and system administration)
类似的帖子
-
07/26/2021 aws:Route53私有托管区--从互联网上隐藏域名 (0)
-
07/22/2021 aws:WAF的WebACL日志和Logz.io集成 (0)
-
07/19/2021 aws:Web应用防火墙概述、配置及其监控 (0)
-
07/15/2021aws:CloudTrail概述以及与CloudWatch和Opsgenie的集成 (0)
-
07/14/2021 aws:简单电子邮件服务的退订率以及与和Prometheus的监控 (0)
The postAWS:Lambda函数--以及概述和与AWS API Gateway的整合首次出现在RTFM:Linux、DevOps和系统管理上。



































