AWS Lambda 入门

Flying
2022-03-26 / 0 评论 / 106 阅读 / 正在检测是否收录...

本文是一篇 AWS Lambda 的入门教程。我们将讨论 Lambda 的一些理论,以及想要使用它的原因,然后我们将介绍了如何创建一个 Lambda 函数以及如何触发删除它。

AWS Lambda 场景概览

假设你正在开发一个名为 TINYFLIX 的项目,是一个专门针对五分钟以下短片的平台。基本流程如下所示: 用户上传视频,然后应用程序需要执行一些操作,为视频创建一个小缩略图,然后创建一个大缩略图和视频的高清版本,完成所有操作后,视频将显示在用户可以观看的页面上。

flow.jpg

什么是无服务器计算

让我们首先讨论一下 AWS Lambda 如何工作。你可能听说过 AWS Lambda 是无服务器计算(Severless computing),但它到底有什么作用呢?这显然意味着某些东西必须正确运行你的代码,所以它不能真正成为无服务器,可以认为它在你不必购买或管理的服务器上运行,但它仍然在服务器上运行,但你不必担所有配置服务器、分配内存等服务器底层工作,它会神奇地在后台发生,因此它运行在你无需购买或管理的服务器上。

到底运行得怎么样,使用 JavaScript、Python、.Net 或你会的语言编写一段代码,每个 Lambda 函数现在都会执行一个离散的任务,当这段代码运行时,它会响应某些事件而运行,比如上传到 S3 存储桶或 DynamoDB 表中的更改会触发你的 Lambda 函数运行并执行其操作。这些小代码片段执行特定的操作并由某些事件触发。

只是为了更好地理解 Lambda 的定义,有些人建议使用更好的名称,比如 AWS 脚本或函数。

回到我们的 TINYFLIX 场景,当用户上传视频时,需要处理什么,流程图中间这三个任务实际上非常适合 Lambda 函数:我们上传视频,它会碰到 S3 存储桶,这将触发这些函数运行,创建缩略图并处理视频的高清版本。

使用 AWS Lambda 的好处

这里快速总结一下当你使用 Lambda 时的好处:

  • 单一目的:它能确保你以模块化的方式构建代码,一个简短的脚本只做一件事情
  • 确切大小:这会带来第二个好处,即你可以微调函数所需的内存量,这可以帮助你优化性能并降低成本
  • 容易扩展:最后,你的应用程序也可以支持并行处理,这与让每个 Lambda 函数只做一件事的第一点有关

benifits.jpg

这通常意味着,你可以一次执行 100 件事,但在任何需要的时候可以一次做一百万件事,底层的计算能力可以支持它,这一切 Lambda 都会为你处理。当你一次只需要 100 件事时,计算可以缩小,所以扩大和缩小是一件轻而易举的事情。

顺便让我们做一个动手演示。我们不会构建 TINYFLIX 项目的完整功能,但我们将实现一些基础功能:将文件上传到 S3,这将触发我们的 Lambda 函数,Lambda 函数将输出我们上传的内容类型是否是视频、图像、文本文件。

demo.jpg

AWS Lamba 定价

如果你打算在 Lambda 主页面上进行操作,那么现在简单介绍一下价格。

点击指向 AWS 免费套餐的链接,你会看到每月获得一百万个免费请求,我们绝对不会在此演示中达到任何这些限制。

控制台创建 S3 存储桶

接下来我们将在 S3 中启动简单的存储服务,这是我们将上传文件的地方,我们希望它触发我们的 Lambda 函数。

因此我们将创建一个新的存储桶,我称之为 tinyflix,其他设置我们将保留默认值。然后点击创建存储

这里有一个潜在的陷阱,需要确保 S3 与你的 Lambda 函数所在的区域相同

控制台创建 Lambda 函数

现在让我们开始处理Lambda 函数。只需在控制台中打开一个新选项卡,然后我们将转到 Lambda 设置页面。目前我们没有任何函数,但创建一个函数非常容易。点击创建函数按钮,然后会有一些关于如何创建它不同的选项。

options.jpg

  1. 选择模板

我们将从 从头开始创作 开始,因为我认为了解幕后发生的事情确实很有帮助。但你还可以使用其他一些选项,比如这里的 使用蓝图,它将为你提供一些常见用例的示例代码,实际上包含一个可以与 S3 触发器一起使用的代码,如果你想自己尝试一下的话。还有容器映像、应用程序存储库等等。但让我们选择 从头开始创作 开始。

  1. 命名函数

我们需要给我们的函数一个名称,我将其称为运行时的 tinyflixFunction

  1. 选择开发语言

选择开发语言。这里有多种语言选项,我将使用 python 3.9,但你会发现你也可以使用 Net、Java、Ruby​​ 等其他语言。

向下滚动,我将保留架构的默认设置,但我们需要更新你看到的默认权限。

  1. 创建角色

Lambda 将创建一个执行角色,该角色具有将日志上传到 cloudwatch 的权限,我们稍后会查看这些权限。我们需要修改它以授予从 S3 存储桶读取的权限,所以在这里我们选择从 AWS 策略模板创建新角色

角色命名为 myTinyflixRole,然后是策略模板,这些都是可选的。对于我们来说需要一个 S3,所以我只需在此处输入 S3 进行过滤,我们将执行亚马逊 S3 对象只读权限,并选择该权限。

role.jpg

还有一些其他设置,保留所有默认值。点击 创建函数按钮,可以看到创建成功的提示。

编写 Lambda 函数

让我们向下滚动到代码区查看代码。

这只是一些来自 Lambda 的样板代码:“Hello Lambda”,我将用一些其他代码替换它。

import json
import urllib.parse
import boto3

print('Loading function')
s3 = boto3.client('s3')
def lambda_handler(event, context):
  #print("Received event: " + json.dumps(event, indent=2))

  # Get the object from the event and show its content type
  bucket = event['Records'][0]['s3']['bucket']['name']
  key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
  try:
    response = s3.get_object(Bucket=bucket, Key=key)
    print("CONTENT TYPE: " + response['ContentType'])
    return response['ContentType']
  except Exception as e:
    print(e)
    print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
    raise e

这里的代码仍然非常简单。这是如何工作的?当 Lambda 调用此函数时,Lambda 运行时将向处理程序传递两个参数: eventcontext

event 是一个 JSON 格式的文档,其中包含要处理的函数的数据,例如,我们将在其中获取有关上传文件的 S3 存储桶的信息。

第二个参数 context 具有方法和属性,你可以从中获取有关运行时环境、函数和调用的信息。

基本上我们在这里所做的一切都是从事件中获取存储桶信息,然后是我们上传的特定对象或文件,最后我们将打印出其内容类型,例如视频文件、图像、文本文件等——非常简单。

部署 Lambda 代码

这里非常重要一点的是:无论你何时更改代码都需要部署它。因此我们将点击部署按钮。

创建 Lambda 函数触发器

回想一下 Lambda 的定义,Lambda 是由某些事件触发的一段代码,所以我们需要在添加一个触发器,这将在新文件上传到 S3 存储桶时发生。

add-trigger.jpg

在这里我们点击 添加触发器 选择触发器,我将在 S3 中输入以过滤掉它,然后我们需要选择我们之前创建的存储桶,即 tinyflix,然后我们要处理的特定事件将监听,我们将在所有对象创建时保留它。这里还有其他设置,例如当某些内容从冰川中删除或恢复时。本示例中,我们选择所有对象创建事件,其他所有内容保持不变。

如果你有一个像 tinyflix 这样的输入桶,然后每次输出时都会向它输出一些东西,这将再次触发输入,基本上会进入这个递归循环。因此最佳实践是有一个单独的输入和输出存储桶,但我们将不执行再次输出,因此我们将单击“添加”按钮。

select-s3r.jpg

好了,触发器已成功添加,现在它不是非常明显,但是添加触发器在后端连接了一些东西,这将使所有这些都能够工作。

所以如果我们来到这里的 S3 存储桶,选择属性并向下滚动,你现在将在我们的事件通知下看到:已经重新连接了事件以在创建事物时通知 Lambda 函数,这样神奇就自动地发生了,因为我们在函数中添加了该触发器。

notification.jpg

理解 Lambda 触发器的事件和权限

返回到 Lambda 配置。然后我们向下滚动,点击“查看策略文档”按钮打开。这个基于资源的策略说我们的 S3 存储桶 tinyflix 可以调用该 Lambda 函数,这是因为我们添加了触发器。

policy.jpg

触发 Lambda 函数

现在我们需要将一些东西上传到 S3 存储桶,以确保它有效.

回到存储桶配置页面,我们将看一下对象,目前这里什么都没有,将徽标和图像文件拖过去,我们将点击上传按钮。当我们这样做时,应该会触发我们的 Lambda 函数。

因此回到 Lambda,选择监视,在这里你可以查看你的云监视指标,这可能需要一分钟或两个,所以如果它没有立即显示,不要担心。你可以在这里调整你的时间范围,假设我们只想看看过去五分钟内发生的事情。点击刷新,如你所见,左侧此处的调用应该为 1,这意味着我们调用了 Lambda 函数一次,因为我们上传了该文件。

再次点击刷新,你会看到一次调用的持续时间(以毫秒为单位),错误数和成功率可以检查我们有没有任何错误。

watch.jpg

使用 CloudWatch 监控指标和日志

进入日志,单击进入日志流,这将带你到 Cloudwatch 控制台,你会在这里看到内容类型,这是我们的函数输出的内容是 png 图像,这正是我们想要的结果。

cloudwatch.jpg

删除 Lambda 函数

作为最佳实践,我们会在教程最后删除Lambda 函数。回到 Lambda,选择要删除的函数,点击 操作选择删除函数,确认删除。

delete.jpg

Lambda 函数只有在代码运行时才会收取费用,这里删除它为了保持整洁。记得还要删除 S3 存储桶。

本文中的 Lambda 函数没有通过 AWS Gateway 公布,所以不能通过外网访问。

总结

本文简要概述了 Lambda 的优点,以及为什么要使用它。然后介绍了如何创建一个 Lambda 函数,该函数由文件上传到 S3 存储桶触发。最后,向你展示了如何删除 Lambda 函数。

1

评论 (0)

取消