当前位置: 首页 > 科技观察

通过AWSLambda和APIGateway助你走向Serverless_0

时间:2023-03-20 15:17:00 科技观察

最近计算领域对Serverless的讨论比较多。无服务器是一个概念,它允许您向服务提供代码或可执行程序,服务会为您执行它们,而无需您自己管理服务器。这被称为执行即服务,它提供了许多机会,但也带来了独特的挑战。简要回顾一下计算的早期,它出现了……好吧,它有点复杂。很早就出现了机械式计算机,后来出现了ENIAC(ElectronicNumericalIntegratorAndComputer,最早的电子计算机),但都没有量产。直到大型机的出现,计算领域才得以迅速发展。1950年代-大型机1960年代-微型计算机1994-机架服务器2001-本世纪初的刀片服务器-虚拟服务器2006-服务器云化2013-容器化2014-无服务器(计算资源服务)这些日期是大概的不用和我争论确切的日期发布或流行。计算的进化趋势是朝着越来越小的功能执行单元发展。每一次演进通常都意味着运维负担的降低和运维灵活性的增加。未来,无服务器!但是无服务器给我们带来了什么好处呢?我们面临哪些挑战?不执行代码时不付款。我认为这是一个巨大的卖点。当没有人访问您的网站或使用您的API时,您无需付费。没有持续的基础设施成本,只需为您需要的东西付费。换句话说,这实现了云计算的承诺:“只为实际使用的东西付费”。无需维护服务器,也无需担心服务器安全。服务器维护和安全将由您的服务提供商处理(当然,您也可以设置自己的无服务器托管,但这似乎是在错误的方向上)。由于您的执行时间也有限,安全补丁也得到了简化,因为根本不需要重新启动。这些都应该由您的服务提供商无缝处理。出色的可扩展性。这是另一个很大的好处。假设你再开发一个PokemonGo,与其频繁下线维护升级,还不如使用serverless来不断扩展。当然,这也是一把双刃剑,大单随之而来。如果您的业务利润在很大程度上取决于网站的在线率,那么Serverless确实可以提供帮助。强制微服务架构。这也有两个方面。一方面,微服务似乎是构建灵活、可扩展和容错架构的好方法。另一方面,如果你的业务不是这样设计的,你将很难在现有架构中引入Serverless。但是现在你被限制在他们平台上的受限环境中。你只能使用服务商提供的环境,你想在Rust中使用serverless吗?你可能不太幸运。有限的预包装。您只有提供商预安装的软件包。但您可以提供自己的包裹。执行时间有限。您的功能只能运行这么长时间。如果你必须处理1TB的文件,你可能需要有一个变通方法或其他东西。强制微服务架构。参考上面的描述。有限的监控和诊断能力。例如,您的代码在做什么?在serverless中,基本不可能在debugger中设置断点跟流程。您仍然可以像往常一样记录和发出统计指标,但这对定位无服务器环境中发生的难题的帮助有限。竞争领域自2014年AWSLambda出现以来,Serverless提供商有所增加。以下是一些主要的服务提供商:AWSLambda——最初的OpenWhisk——可在IBM的Bluemix云上使用GoogleCloudFunctionsAzureFunctions这些平台各有优缺点(例如,Azure支持C#,或者与其他提供商的平台紧密集成).这里最大的参与者是AWS。使用AWS的Lambda和API网关构建您的第一个API让我们尝试无服务器。我们将使用AWSLambda和APIGateway构建一个API,返回Jimmy所说的“GuruMeditations”。所有代码都可以在GitHub上找到。API文档:POST/{"status":"success","meditation":"didumentionbananacognacshower"}如何组织项目文件文件结构树:.├──LICENSE├──README.md├──server│├──__init__.py│├──meditate.py│└──swagger.json├──setup.py├──tests│└──test_server│└──test_meditate.py└──tools├──deploy.py├──serve.py├──serve.sh├──setup.sh└──zip.shInformationinAWS(查看源代码tools/deploy.py了解这里到底发生了什么)。蜜蜂。实际构造的对象。它在AWS中表示为一个单独的对象。执行角色。在AWS中,每个函数都作为一个单独的角色执行。这是冥想。角色策略。每个Function都作为一个角色执行,每个角色都需要权限才能工作。我们的Lambda函数没有做太多事情,所以我们只添加一些日志记录权限。拉姆达函数。在哪里运行我们的代码。昂首阔步。Swagger是API的规范。APIGateway支持解析swagger定义来配置API的大部分资源。部署。APIGateway提供了部署的概念。我们只需要为我们的API使用一个(例如生产或yolo等),但知道它们存在,并且对于真正的生产服务,您可能想要使用开发和暂存环境。监视器。如果我们的业务崩溃(或由于使用而产生大额账单),我们希望以云警报视图的形式对这些错误和费用添加一些监控。请注意,您应该修改tools/deploy.py以正确设置您的电子邮件。代码Lambda函数将从硬编码列表中随机选择一个并返回大师冥想,非常简单:importloggingimportrandomlogger=logging.getLogger()logger.setLevel(logging.INFO)defhandler(event,context):logger.info(u"receivedrequestwithid'{}'".format(context.aws_request_id))meditations=["offtoaregex/","thecountofmachinesabides","youwouldntfaxabat","HAZARDOUSCHEMICALS+RKELLY","yoursolutionrequiresabloodeagle","testingisbrokenbecauseI'mlazy","gnacionshbanana",]meditation=random.choice(meditations)return{"status":"success","meditation":meditation,}deploy.pyscript这个脚本比较长,这里就不贴了,基本上就是循环通过上面“InformationinAWS”下的项目,确保每一个都存在。要部署这个脚本,我们只需运行./tools/deploy.py。几乎完成。但是,权限申请似乎存在一些问题。由于APIGateway没有权限执行你的Function,你的LambdaFunction将不会被执行d.错误应该是“由于配置错误导致执行失败:Lambda函数的权限无效”。我不知道如何使用botocore添加权限。您可以通过转到AWS控制台解决此问题,找到您的API,转到/POST端点,转到“集成请求”,单击“Lambda函数”旁边的编辑图标,修改它并保存。将弹出一个窗口提示“您即将授予API网关调用您的Lambda函数的权限”,单击“确定”。完成后,记下./tools/deploy.py打印出的URL,像这样调用它,并查看您的新API的运行情况:$curl-XPOSThttps://a1b2c3d4.execute-api.us-east-1.amazonaws.com/prod/{"status":"success","meditation":"thecountofmachinesabides"}在本地运行不幸的是,AWSLambda没有在本地运行代码的好方法。在此示例中,我们将使用一个简单的flask服务器在本地托管适当的端点并调用处理函数。from__future__importabsolute_importfromflaskiimportFlask,jsonifyfromserver.meditateimporthandlerapp=Flask(__name__)@app.route("/",methods=["POST"])defindex():classFakeContext(object):aws_request_id="XXX"returnjsonify(**处理程序(无,FakeContext()))app.run(host="0.0.0.0")您可以在存储库中使用./tools/serve.sh运行它,这样调用它:$curl-XPOSThttp://localhost:5000/{"meditation":"yoursolutionrequiresabloodeagle","status":"success"}测试你应该总是测试你的代码。我们的测试方法是导入并运行我们的处理函数。这是最基本的python测试方法:from__future__importabsolute_importimportunittestfromserver.meditateimporthandlerclassSubmitTestCase(unittest.TestCase):deftest_submit(self):classFakeContext(object):aws_request_id="XXX"response=handler(None,FakeContext())self.assertEquals[response"status"],"success")self.assertTrue("meditation"inresponse)您可以通过存储库中的nose2运行此测试代码。更多的前景和与AWS服务的无缝集成。借助boto,您可以安全轻松地连接到任何其他AWS服务。您可以轻松地让您的执行角色使用IAM来访问这些服务。您可以从S3获取文件或将文件放入S3、连接到DynamoDB、调用其他Lambda函数等。访问数据库。您还可以轻松访问远程数据库。连接到Lambda处理程序模块顶部的数据库,并在处理程序函数中执行查询。您很可能必须从安装位置上传相关的包内容才能使其正常工作。可能您还需要静态编译某些库。调用其他网络服务。API网关也是一种将Web服务的输出从一种格式转换为另一种格式的方法。您可以充分利用此功能通过不同的Web服务代理调用,或者在业务发生变化时提供向后兼容性。