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 和系统管理.


Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐