构建弹性的无服务器应用程序,利用混沌工程 计算博客
使用混沌工程构建韧性服务器无关应用程序
关键要点
混沌工程是一种通过引入干扰事件来测试应用程序的可靠性和性能的实践。AWS FIS故障注入模拟器可以帮助在Lambda函数中注入混沌,而不需要修改现有代码。本文介绍了如何使用Lambda层在Java、Nodejs和Python中实现混沌注入,以观察和优化应用程序的行为。如您所知,混沌工程是一种通过在测试或生产环境中创建干扰事件如运行中断来施加压力于应用程序的过程,以观察系统的响应并实施改进。它有助于揭示隐藏的问题和性能瓶颈,特别是在分布式应用程序中难以发现的那些问题。
使用AWS Lambda可构建可靠的分布式无服务器应用程序,同时利用混沌工程在现实操作条件下测试Lambda函数。本文展示了一种在Lambda函数中注入混沌的方式,而无需更改Lambda函数的代码。我们将使用AWS故障注入模拟器服务创建实验,从而在基于Lambda的无服务器应用程序中引入干扰。
AWS FIS是一项托管服务,能够对您的AWS工作负载执行故障注入实验。该服务用于设置和运行故障实验,以模拟现实世界的条件,从而发现通常难以发现的应用程序问题。您可以利用FIS实验的结果来提高应用程序的韧性和性能。
本文提供的示例代码向现有Lambda函数引入随机故障,例如响应时间增加延迟或随机失败。您可以观察在引入混沌后的应用程序行为,并根据观察结果进行改进。
向Lambda函数注入混沌的方法
AWS FIS当前不支持直接在Lambda函数中注入故障。然而,有两种主要方法可以在Lambda函数中注入混沌:使用外部库或使用Lambda层。
开发者们创建了一些库来引入故障条件,比如chaoslambda和failureLambda。这些库允许开发者在Python和Nodejs的Lambda函数中注入混沌元素。要使用这些库引入混沌,开发者必须装饰现有的Lambda函数代码。装饰器函数会包装现有的Lambda函数,在运行时添加混沌。这种方法需要开发者更改现有的Lambda函数。
您还可以使用Lambda层注入混沌,而无需更改函数代码,因为故障注入是与函数分开的。由于Lambda层是单独部署的,您可以独立更改混沌元素,比如响应时间延迟或Lambda函数的失败。本文将讨论这种方法。
使用Lambda层在Lambda函数中注入混沌
Lambda层是一个zip文件档案,包含附加的代码或数据。层通常包含库依赖项、自定义运行时或配置文件。本文创建了一个FIS实验,使用Lambda层在现有的Java、Nodejs和Python运行时的Lambda函数中引入干扰。
Lambda层包含故障注入代码。它在调用Lambda函数之前被调用,并注入随机延迟或错误。注入随机延迟模拟了现实世界中的不可预测情况。提供的Java、Nodejs和Python混沌注入层是通用且可重用的,可以用来给您的Lambda函数注入混沌。
混沌注入Lambda层
Java Lambda层用于混沌注入用于Java Lambda函数的混沌注入层使用JAVATOOLOPTIONS环境变量。该环境变量用于指定工具的初始化,特别是启动本地或Java编程语言代理。JAVATOOLOPTIONS具有一个javaagent参数,指向混沌注入层。该层使用Java的premain方法和Byte Buddy库在运行时修改Lambda函数的Java类。
当调用Lambda函数时,JVM使用javaagent参数指定的类,并在Lambda函数处理程序调用之前先调用其premain方法。Java的premain方法在Lambda执行之前注入混沌。
FIS实验为Lambda函数添加层关联和JAVATOOLOPTIONS环境变量。
Python和Nodejs的Lambda层用于混沌注入在注入Python和Nodejs函数的混沌时,FIS的awsssmstartautomationexecution操作将Lambda函数的处理程序替换为相应层中的函数。自动化SSM文档将原始Lambda函数的处理程序保存到AWS Systems Manager参数存储中,以便在实验结束后可以回滚更改。
层函数包含注入混沌的逻辑。在运行时,会调用层函数,为Lambda函数注入混沌。层函数随后调用Lambda函数的原始处理程序,以满足功能需求。
在所有运行时Java、Python或Nodejs中,结果是调用原始的Lambda函数,并注入延迟或故障。观察到的变化为由层注入的随机延迟或故障。
实验完成后,将提供一个SSM文档,将层的关联回滚到Lambda函数,并移除环境变量在Java运行时的情况下。
使用SSM和Lambda层的示例FIS实验
在提供的示例代码中,提供了针对Python、Nodejs和Java运行时的Lambda层,以及每个运行时的示例Lambda函数。
示例代码会部署Lambda层和Lambda函数、FIS实验模板、运行实验所需的AWS身份和访问管理IAM角色,以及AWS Systems ManagerSSM文档。同时也提供了用于部署的AWS CloudFormation模板。
步骤1:完成先决条件
要部署示例代码,请在本地克隆代码库:git clone https//githubcom/awssamples/chaosinjectionlambdasamplesgit
完成此处文档中的先决条件。
步骤2:使用AWS CloudFormation进行部署
提供的CloudFormation模板将部署示例代码。执行 runCfnsh。
完成后,将返回CloudFormation创建的StackId:
步骤3:运行混沌注入实验
默认情况下,该实验配置为在Java示例Lambda函数中注入混沌。要将其更改为Python或Nodejs Lambda函数,请编辑实验模板,从这里配置注入混沌。
步骤4:开始实验
从FIS控制台选择开始实验。
等待实验状态更改为“已完成”。
步骤5:运行测试
在此阶段,您可以向Lambda函数注入混沌。运行Lambda函数并观察其行为。
使用以下命令调用Lambda函数:bash aws lambda invoke functionname NodeChaosInjectionExampleFn out logtype Tail query LogResult output text base64 d
CLI命令输出显示由Lambda层创建的日志,展示此调用中引入的延迟。在此示例中,输出显示Lambda层为函数注入了1799ms的随机延迟。
实验会在Lambda函数中注入随机延迟或故障。再次运行Lambda函数时会产生不同的延迟或故障。在此阶段,您可以测试应用程序,并观察其在可能会在现实世界中出现的条件下的行为,如延迟增加或Lambda函数失败。
一元机场vip
步骤6:回滚实验
要回滚实验,请运行回滚的SSM文档。这将把Lambda函数恢复到注入混沌之前的状态。运行以下命令:
bashaws ssm startautomationexecution documentname “InjectLambdaChaosRollback” documentversion “DEFAULT” parameters ‘{“FunctionName”[“FunctionName”]”LayerArn”[“LayerArn”]”assumeRole”[“RoleARN”]}’ region euwest2
清理
为避免将来产生费用,请通过运行以下CLI命令清理CloudFormation模板创建的资源。请将堆栈名称更新为您在创建堆栈时提供的名称。
bashaws cloudformation deletestack stackname myChaosStack
使用FIS实验结果
您可以利用FIS实验结果验证预期的系统行为。预期行为的一个示例是:“如果应用程序延迟增加10,则登录失败的增加率少于1。”实验完成后,评估应用程序的韧性是否符合您的商业和技术预期。
结论
本文解释了一种通过混沌工程测试Lambda函数可靠性和韧性的方法。该方法允许您在不改变Lambda函数代码的情况下向Lambda函数注入混沌,清晰地将混沌注入与业务逻辑分开。这为开发者提供了一种专注于使用Lambda函数构建业务功能的方式。
注入混沌的Lambda层可以独立开发和管理。该方法利用AWS FIS进行实验,使用Lambda层注入混沌并测试无服务器应用程序的性能和韧性。通过FIS实验的洞察,您可以在测试过程中发现、修复或记录应用程序中出现的风险。
想了解更多无服务器学习资源,请访问Serverless Land。
标签:贡献、无服务器