AWS。Lambda函数--以及概述和与AWS API网关的整合

499 阅读9分钟

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的主要概念。

创建一个 "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() 是一个默认的函数,当一个函数被调用时,它将被调用。它接受两个参数。

  1. event:一个API网关事件,见与其他服务一起使用AWS Lambda
  2. context:允许的方法和参数来运行一个函数,见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

测试

完成了。

类似的帖子

The postAWS:Lambda函数--以及概述和与AWS API Gateway的整合首次出现在RTFM:Linux、DevOps和系统管理上。