AWS:Lambda 函数 — 概述,以及与 AWS API Gateway 的集成
AWS:Lambda 函数 — 概述以及与 AWS API Gateway 的集成
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--zlRiPuOt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/365/1%2A6dXEkU-sfm3IrnC9WoL1QA.png)
AWS Lambda允许运行代码而无需创建和管理服务器,也称为 serverless 方法。
AWS Lambda 将确定运行一个函数需要多少 CPU 和内存,并在必要时执行自动缩放。
要运行的代码被组织在 _ lambda 函数 _ 中,并且可以使用触发器 _ 来触发。可以使用 CloudWatch Logs 检查结果。
作为触发器,您可以使用几乎任何 AWS 服务,例如 API Gateway、SQS、Application LoadBalancer、CloudFront、Kinesis 或外部事件,例如来自 Github 的 webhook。
在这篇文章中,我们将创建一个简单的 AWS Lambda 函数,检查其控制面板、可用选项和功能,然后创建一个 AWS API Gateway,它将 HTTP 请求转发到 AWS Lambda 函数。
内容
-
AWS Lambda — 用例
-
组件和概念
-
创建“Hello, World” Lambda 函数
-
创建函数
-
监控
-
配置
-
通用配置
-
触发器
-
权限
-
目的地
-
环境变量
-
VPC
-
监控和操作工具
-
并发
-
异步调用
-
数据库代理
-
文件系统
-
别名
-
版本
-
AWS Lambda 和 AWS API Gateway — 一个集成示例
-
创建 Lambda 函数
-
创建 AWS API 网关
AWS Lambda — 用例
一般来说,AWS 中的 Lambda 可以做很多事情。这样的“银弹”,允许做 AWS 控制台本身无法实现的事情。
示例用例可能是:
-
一个网站:AWS S3 中基于 JavaScript 的前端,带有静态托管,前端将通过 AWS API 网关接收请求,通过 Lambda 函数发送到数据库
-
日志分析:一个很好的例子是AWS WAF Security Automations,当所有传入的 HTTP 请求都发送到 AWS Kinesis 时,它会将它们转发到 Lambda,它会执行一些检查,如果需要会阻止客户端的 IP
-
备份自动化:AWS SNS 可以向 Lambda 函数发送一个事件,例如当 AWS S3 存储桶中使用了太多磁盘空间时,该函数将删除一些旧备份
-
数据处理:例如,当一个新文件上传到 AWS S3 时,它会生成一个事件,该事件将触发一个 Lambda 函数,该函数将执行视频文件编码
-
个无服务器 cronjobs:使用 CloudWatch Events 按计划生成事件,这将触发 Lambda 函数
组件和概念
让我们简要概述一下 AWS Lambda 的主要概念:
-
function : 是在函数中运行的代码。可以是 zip 文件或 Docker 映像(deployment 包)。 请参阅配置 AWS Lambda 函数。
-
trigger :将触发函数的 AWS 资源。此类事件包括 AWS 服务和_事件映射_。请参阅调用 AWS Lambda 函数è将 AWS Lambda 与其他服务一起使用。
-
event :一个 JSON 对象,其中包含用于处理的 Lambda 函数的数据
-
执行环境 : 执行功能的安全环境。请参阅AWS Lambda 执行环境。
-
deployment package : 要运行的 Lambda 函数代码。可以是 zip 存档或 Docker 映像。请参阅Lambda 部署包。
-
runtime : 运行函数的工作环境。请参阅Lambda 运行时
-
layer : 一个 zip 存档,其中包含用于运行函数的附加代码,例如 — 外部库。请参阅创建和共享 Lambda 层。
-
extensions :AWS Lambda 允许使用可用于将函数与外部服务(例如监控)集成的扩展。请参阅使用 Lambda 扩展。
-
concurrency : 多个 Lambda 函数实例同时运行以处理传入数据。请参阅管理 Lambda 函数的并发性。
-
qualifier :指向版本或别名的“指针”。请参阅Lambda 函数版本。
-
destination :一个 AWS 资源,函数将在其中发送处理后的数据。请参阅为异步调用配置目标。
创建“Hello, World” Lambda 函数
首先,让我们创建一个最简单的 Lambda 函数,看看它是如何工作的以及我们有什么。
创建函数
转到 AWS Lambda,单击 _Create 函数:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--WdPhRu97--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2Av9Y6u3Mv_P4mhKZ4.png)
现在,让我们使用现有的模板。选择_Use a blueprint,找到一个hello-world-python:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--un1EIZq5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/961/0%2AHh1Mg9nOM9mHiXT_.png)
点击_配置_:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--lKWZcF08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/1024/0%2ACQtYQ7ikSUeiuHd1.png)
设置函数的名称,例如 example-hello,保留默认 IAM 角色 — 它将允许我们的函数使用 CloudWatch Logs,并检查将使用的代码:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--t5yMldO6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/885/0%2AIRcu5HPJGyEI4kmP.png)
点击 _Create 函数:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--yqPSQlJJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/1024/0%2A9Ykanr-0rSlSLRrF.png)
切换到 Test 选项卡:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--UO0G4ndH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2A9WeMBmBg_f_XWxut.png)
在这里,我们可以传递一个 JSON,其中包含要由我们的函数处理的数据。
运行:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--q80F5Z8p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AlYtlS0Jp9ol2QgT7.png)
现在,让我们看看 AWS 控制台建议使用什么来进行 Lambda 函数管理。
监控
首先是监控。在这里,我们可以使用 AWS CloudWatch 指标和日志、使用 AWS X-Ray 进行调用跟踪、Lambda 洞察和 AWS CodeGuru:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--fLAPJsNu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AZD5eUg8atqb6b195.png)
配置
一般配置
-
内存设置:运行函数时允许使用的最大 RAM。此外,根据内存设置,Lambda 将提供 CPU 限制:对于每 1769 MB,将有一个 vCPU。请参阅配置功能内存(控制台)。
-
次执行超时:最长可设置为 900 秒,之后将停止函数执行。请记住,这会影响成本。请参阅超时。
-
IAM 角色:包括具有 AWS 资源权限的 IAM 策略
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--TTdiWw-o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images- 1.medium.com/max/892/0%2A_75cHkiYPIgjtsTY.png)
触发器
好吧,触发器将触发我们的功能。
几乎可以是任何 AWS 服务:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--U7BQxrZ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/892/0%2Azm7yg-NaeoAJ4P9S.png)
例如,我们可以从 AWS Application LoadBalancer 创建一个触发器,该触发器将接受到特定 URI 的连接并将其转发给 Lambda 函数:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--dEJC5bnY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/836/0%2A97y7G5nBBWO4DCSm.png)
权限
在这里,您可以查看和调整将配置函数权限的 IAM 角色和策略:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--A8iPhCtP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AFLBEiTI1yy4yfAI0.png)
目的地
将函数的执行结果发送到哪里。
例如,可以是将其转发给 Opsgenie 的 AWS SNS 主题,Opsgenie 将向 Slack 通道发送消息:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--6TUyAbYo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/887/0%2APkgSc8u6zxJ1Ez7h.png)
环境变量
可以在我们的函数中使用的变量。敏感数据可以使用 AWS Key Management Service (KMS) 加密:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--PNG-5xhD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images- 1.medium.com/max/890/0%2AMiNHMGUMn6IZO-51.png)
VPC
可以将函数放置到专用的 AWS Virtual Private Cloud 以限制其网络访问:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--YIUx8-WS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images- 1.medium.com/max/890/0%2Amsnk5vkRv8nRLq_K.png)
监控和操作工具
监控设置,您可以在其中启用或禁用其他服务,例如 AWS X-Ray、CloudWatch Lambda Insights 和 Amazon CodeGuru Profiler:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--6lDZrB1I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/904/0%2A2uFHihqpyeS9kXnD.png)
在 Extentions, 中,您可以从现有解决方案列表中进行选择或创建自己的解决方案:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--YdpbesWf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AkLKO_248Kc13Pj8T.png)
并发
可以同时运行的函数实例的最大数量。请参阅管理 Lambda 函数的并发性。
可以是以下两种类型之一:
-
reserved concurrency : 为整个账户保留一个普遍可用的数字(默认为 1000),并应用于整个函数,包括其所有版本和别名
-
provisioned concurrency :将准备一个已经初始化的运行时环境,因此在缩放期间您的函数不必等待它,适用于特定版本或别名
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--r6pEpCCz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2ABDtz6bObh0E3lA9W.png)
异步调用
事件队列的设置 — 生命周期、发生错误时的重试次数、错误通知等。
请参阅异步调用:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--fOd7qOzi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/831/0%2AQIhHI2Ih8Ev7ZYaN.png)
另请参见同步调用和异步调用。
数据库代理
用于您的函数的Amazon RDS 代理配置。 RDS Proxy 用于减少与数据库服务器的连接数:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--L2Td65xv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1. medium.com/max/831/0%2A6auM_fX1glBwqrfZ.png)
文件系统
您可以在函数内挂载 AWS 弹性文件系统目录:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--kMVqTRUy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/848/0%2ADIG93NK9Ek9xQ9Lk.png)
别名
别名是一种指向函数代码特定版本的指针,以后可以在其 ARN 中使用。
此外,您可以有几个别名并在它们之间分配请求。请参阅Lambda 函数别名:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--3zm5sg3u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/839/0%2A09jcm3by31_EEhsJ.png)
版本
AWS Lambda 允许使用代码和部分设置版本控制。在开发环境中测试新代码时可能很有用,例如通过创建专用的_alias_:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--zd5wwGB4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AkDZ7jfu2Lwbv4UGU.png)
AWS Lambda 和 AWS API Gateway — 一个集成示例
因此,我们检查了 AWS Lambda 是什么以及它的设置。
现在,让我们创建一个 AWS API Gateway,它将请求转发到 AWS Lambda 函数。
API Gateway 将接受对 /test URI 的请求,并将使用其事件将它们发送到我们的 Lambda。
创建Lambda函数
这时候,选择_Author from scratch_,在Runtime中使用_Python_:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--EKIVwfKF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AuJUgjqlWjO2pmepc.png)
保留默认代码:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--gC6D-Vfo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images- 1.medium.com/max/1024/0%2ALoCxT1PgOOUgnMhp.png)
这里,lambda_handler()是调用函数时要调用的默认函数。它接受两个参数:
1.event:API 网关事件,见Using AWS Lambda with other services
2.context:允许运行函数的方法和参数,见AWS Lambda context object in Python
创建 AWS API 网关
创建一个新网关,将其类型设置为 HTTP API:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--aS6XUdzI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1019/0%2AZ4fkGqy8SifHIWSC.png)
添加集成:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--DgydGf1F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1012/0%2AjPZAoxwODR_9qqKl.png)
选择 Lambda、AWS 区域和要调用的函数:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--NIK6xDfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2Aa4Kjp214dLzpWgpA.png)
将 URI 设置为 /test:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--OzDz3a1J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2A7oqKFxsZ-q4hTxu6.png)
保留默认阶段:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--lSUoTVIc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2A798HA4_2vOxnHo4r.png)
不到一分钟,您的网关就准备好了。复制其网址:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--X9jwj-0f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images- 1.medium.com/max/1024/0%2A3WMtdCNiUKAl-mHO.png)
并尝试使用curl:
$ curl [https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test](https://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)
}
进入全屏模式 退出全屏模式
进行代码更改后,按_Deploy_:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--6_M2iQzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/589/0%2A5tl_XBNqVpoh1dFx.png)
试试看:
$ curl [https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test](https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test)
{“version”: “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.execute-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}
进入全屏模式 退出全屏模式
现在,让我们看看如何在函数中使用环境变量。
添加一个新的:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--7oD5MXpL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/857/0%2AIOBmNPAkNV-OPplT.png)
并用os.getenv()打印它的值:
import os
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': os.getenv('Env')
}
进入全屏模式 退出全屏模式
核实:
$ curl [https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test](https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test)
test
进入全屏模式 退出全屏模式
此外,您可以更改默认处理程序。
将lambda_handler重命名为main_handler:
import os
import json
def main_handler(event, context):
return {
'statusCode': 200,
'body': os.getenv('Env')
}
进入全屏模式 退出全屏模式
如果您现在尝试访问该功能,您将收到 Internal Server Error :
$ curl [https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test](https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test)
{“message”:”Internal Server Error”}
进入全屏模式 退出全屏模式
向下滚动到运行时设置:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--gmypHaLM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/1024/0%2AsDfO2UUC15Mm3GGA.png)
并更改_Handler_:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--ZidbwRPL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1。 medium.com/max/860/0%2Adzg6Aek33qJQ_MhH.png)
再次运行它:
$ curl [https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test](https://fwu399qo70.execute-api.us-east-2.amazonaws.com/test)
test
进入全屏模式 退出全屏模式
完毕。
最初发表于RTFM:Linux、DevOps 和系统管理.
更多推荐

所有评论(0)