在云计算领域,开发者经常面临购买、配置和管理后端服务器的挑战。AWS Lambda是一项服务,允许开发者运行代码而无需设置和管理这些服务器,因此通常被归类为“无服务器架构”。这里的“无服务器”并不意味着没有服务器参与,而是开发者不需要考虑这些服务器,因为AWS会处理所有这些事务。
在AWS Lambda中,编写并部署的是函数而不是应用程序。这些函数使用户能够在云端运行代码,而无需设置基础设施系统。在最基本的层面上,这些函数处理事件。事件可以有多种类型。例如,考虑实时数据转换的场景。有时,需要在将数据发送到最终数据库存储之前,对数据进行重构或修改。在这种情况下,每当新的一批流数据到达时,可以触发Lambda函数来执行这些转换,然后将其发送到数据库存储。
当寻找事件驱动或基于触发器的编程时,Lambda应该是选择,而当需要一个更定制化的解决方案来满足需求时,应该使用EC2。EC2提供了一个实际的操作系统来工作,比如Linux或Windows,而Lambda提供了一个作为服务的函数。
Lambda经常用于需要持续进行的数据操作。考虑每周将客户数据上传到云端的场景,一旦数据到达S3桶,就需要屏蔽任何敏感数据。这是利用Lambda函数的完美案例。Lambda函数可以在数据到达S3桶的事件发生时循环遍历桶并屏蔽数据。这个事件可以设置为触发调用Lambda函数。
Lambda函数需要一些东西来实现。
一个处理器(Handler):处理器是函数代码中处理事件的方法。它是当Lambda函数运行时实现的Python函数。处理器函数的一个例子如下:
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps(event)
}
如所见,处理器函数接受两个参数——event和context。事件是在执行时传递给函数的数据。上下文是一个对象,它实现了方法。其主要作用是提供关于调用、函数和执行环境的信息。
一个运行时环境:运行时将直接与选择用于编写Lambda函数的语言相关。
一个触发器:为了让Lambda函数得到实现,必须发生一个事件。如果发生了一个事件,那么Lambda函数就会被触发。事件可能是AWS账户中资源发生的任何事情。向S3上传文件和向DynamoDB添加记录是触发执行Lambda函数的事件的例子。
AWS Lambda原生支持Java、Go、PowerShell和Node.js、C#、Python和Ruby代码,提供了一个Runtime API,允许使用任何其他编程语言编写函数。
无需设置和管理任何服务器。
由于AWS Lambda在后台设置了所有的基础设施需求,用户可以简单地传递代码并无缝部署它。
自动扩展。
它自动扩展实例以处理高峰负载,并实现适当的日志记录和错误处理系统。
可负担性。
AWS Lambda仅在代码运行时收费。用户按代码执行的每100毫秒和代码被触发的次数收费。
由于无服务器架构的流行,本文希望为提供创建一个简单的AWS Lambda函数的实践帮助,该函数能够从外部API获取数据。
在AWS管理控制台中搜索Lambda。一旦进入AWS Lambda页面,可以看到“创建函数”选项,用于创建Lambda函数。
在下一个窗口中,可以选择“从头开始编写”来创建代码。然后需要给函数命名,并根据想要使用的编程语言选择运行时。
关于权限,Lambda默认创建一个执行角色,具有上传日志到Amazon CloudWatch Logs的权限。如果Lambda函数需要权限调用其他AWS API,需要为其他AWS服务授予足够的IAM权限。
在这些选择之后,可以点击右下角的“创建函数”,以创建Lambda函数。
将在这里创建一个函数来从外部API(OpenWeatherMap API)获取天气。
可以在“代码源”中编写以下内容(替换默认代码):
from datetime import datetime
def lambda_handler(event, context):
conn = http.client.HTTPSConnection("community-open-weather-map.p.rapidapi.com")
headers = {
'X-RapidAPI-Key': "your_own_api_key_here",
'X-RapidAPI-Host': "community-open-weather-map.p.rapidapi.com"
}
conn.request("GET", "/weather?q=London%2Cuk⪫=0&lon=0&callback=test&id=2172797⟨=null&units=imperial&mode=xml", headers=headers)
res = conn.getresponse()
data = res.read()
# 返回字典对象中今天所需的天气信息
return {"statusCode": 200,"body": data}
一旦编写了代码,可以点击“部署”来部署它,然后进一步点击“测试”来检查得到的响应。
正如所见,得到了所需的响应(伦敦的天气)作为输出。