AWS Lambda基础知识
AWS Lambda 在无服务器架构和事件驱动型设计模式中发挥着重要作用。
1.基本 Lambda 概念
- 什么是 AWS Lambda?
- AWS Lambda 是一种无服务器计算服务,允许您运行代码以响应事件,而无需预置或管理服务器。
- Lambda 的无服务器性质和优势:Lambda无需预置和管理服务器。
- Lambda 函数:
- 了解 Lambda 函数的结构(例如,处理程序、事件输入/输出、执行角色等)。
- 支持的运行时(例如 Python、Node.js、Java、.NET、Go、Ruby、自定义运行时)。
- Lambda 函数生命周期(例如,调用、执行、超时)。
2.Lambda 触发器和事件源
- 事件源:
- 可以触发 Lambda 函数的不同 AWS 服务,包括:
- S3:上传或删除对象时触发 Lambda。
- DynamoDB Streams:在 DynamoDB 表发生更改时触发 Lambda。
- SNS:从发布到 SNS 主题的消息中触发 Lambda。
- SQS:从 SQS 消息队列触发 Lambda。
- API Gateway:触发 Lambda 以响应 HTTP 请求。
- CloudWatch Events/CloudWatch Logs:触发 Lambda 以响应计划事件或日志数据。
- 可以触发 Lambda 函数的不同 AWS 服务,包括:
- 事件源映射:**
- 为 DynamoDB Streams、SQS 和 Kinesis 等服务设置事件源映射。
- Amazon EventBridge:
- Lambda 与 EventBridge 的集成,用于事件驱动型架构。
3.Lambda 权限和角色
- 执行角色:
- Lambda 函数需要代入 IAM 角色,该角色赋予它与其他 AWS 服务交互的权限(例如,从 S3 读取、写入 DynamoDB)。
- Lambda 权限:
- 附加到 Lambda 执行角色的策略,允许访问其他服务,如 S3、DynamoDB 等。
- 基于资源的策略:
- 您可以配置基于资源的权限,以允许其他 AWS 服务或账户调用 Lambda 函数。
4.Lambda 限制和配额
- 资源限制:
- 最大内存、最大执行超时(15 分钟)、最大包大小等。
- 调用限制:**
- 调用速率限制(例如,并发限制)。
- 预留并发和非预留并发。
- 冷启动:
- 了解冷启动延迟,尤其是在 VPC 配置中或最近未调用 Lambda 时。
5.Lambda 与 API Gateway 的集成
- 使用 API Gateway 和 Lambda 创建 REST API:
- 使用 API Gateway 作为 Lambda 函数的前端,例如处理 HTTP 请求并将其路由到 Lambda。
- Lambda 代理集成:
- 允许 API Gateway 将完整的 HTTP 请求传递给 Lambda,从而在处理请求方面提供更大的灵活性。
6.Lambda 层
- 什么是 Lambda 层?
- Lambda 层允许您管理在多个 Lambda 函数之间共享的通用代码(例如,库、依赖项)。
- 层版本控制:
- 图层支持版本控制,因此您可以管理更新和向后兼容性。
7.Lambda 目标(成功/失败处理)
- 成功和失败目标:
- 您可以将 Lambda 配置为将成功或失败的调用结果发送到以下目标:
- 用于通知的 SNS。
- SQS 用于对失败的消息进行排队。
- EventBridge,用于事件驱动型工作流。
- 您可以将 Lambda 配置为将成功或失败的调用结果发送到以下目标:
- 错误处理:设置重试、DLQ(死信队列)和成功/失败目标。
8.Lambda 版本和别名
- Lambda 版本:
- Lambda 支持版本控制,允许您创建 Lambda 函数的版本并安全地部署它。
-别名: - 别名充当指向特定 Lambda 函数版本的指针,可用于管理部署和回滚(例如,“prod”、“dev”)。
- Lambda 支持版本控制,允许您创建 Lambda 函数的版本并安全地部署它。
9.Lambda 和 VPC 集成
- VPC 配置:**
- Lambda 函数可以配置为在 Virtual Private Cloud (VPC) 中运行,以访问 RDS、ElastiCache 等资源。
- VPC 连接注意事项:
- 在 VPC 中运行 Lambda 时,了解需要 VPC 子网、安全组和 NAT 网关,以确保函数可以访问互联网资源(例如,VPC 外部的 AWS 服务)。
10.Lambda 监控和调试
- CloudWatch 日志:
- Lambda 函数会自动将日志发送到 CloudWatch,您可以在其中监控输出、跟踪错误和诊断问题。
- CloudWatch 指标:**
- 监控 Lambda 性能指标,如调用计数、持续时间、错误计数和并发使用情况。
- AWS X-Ray:
- 将 Lambda 与 AWS X-Ray 集成,以跟踪和调试通过无服务器应用程序的请求流。
11.Lambda 成本注意事项
- 计费模式:**
- Lambda 定价基于请求数量和函数执行持续时间(内存分配 x 时间)。
- 成本优化:
- 选择合适的内存设置并优化函数执行时间以降低成本。
- 考虑使用预置并发来实现可预测的性能,并最大限度地减少生产环境中的冷启动延迟。
12.使用 Step Functions 的 Lambda
- AWS Step Functions 集成:
- Step Functions 允许您在工作流中协调多个 Lambda 函数,从而创建具有不同状态(成功、失败、重试)的复杂无服务器应用程序。
- 状态机:
- Step Functions 如何使用状态机来定义 Lambda 函数和其他 AWS 服务之间的步骤和转换。
AWS Lambda知识要点与注意事项
一、Lambda基础知识(Lambda Basics)
(一)什么是AWS Lambda?
- AWS Lambda是一种无服务器计算服务。这意味着用户无需配置和管理服务器就能运行代码。只需上传代码,Lambda会处理运行和扩展代码所需的一切事务,并且保证高可用性。
(二)支持的语言
- Lambda支持多种编程语言,如Node.js、Python、Java、C#、Go、Ruby,还支持使用AWS Lambda运行时API自定义运行时。这些语言的支持方便了不同技术背景的开发者使用Lambda。
(三)事件源
- Lambda可以被多种事件源触发。
- API Gateway:用于创建RESTful API或WebSocket API来触发Lambda函数,实现对外提供服务接口。
- S3(对象创建、删除):例如,可以在对象上传或删除时触发Lambda函数,进行相关的数据处理,像对上传的图像进行处理。
- DynamoDB Streams:当DynamoDB表更新时触发Lambda函数,适用于实时数据处理。
- CloudWatch Events(规则):根据设定的规则触发Lambda函数,实现定时任务等功能。
- CloudWatch Logs:可以基于日志事件触发Lambda函数。
- SNS(简单通知服务):用于消息发布和订阅场景下触发Lambda函数。
- SQS(简单队列服务):从队列中获取消息触发Lambda函数,处理异步任务。
- EventBridge(CloudWatch Events):提供更强大的事件总线功能,整合不同服务的事件来触发Lambda函数。
二、Lambda执行模型(Lambda Execution Model)
(一)Lambda执行角色
- Lambda函数需要一个IAM角色,这个角色授予函数访问AWS资源(如S3、DynamoDB或SNS)的权限,称为执行角色。确保函数具有正确的权限才能正常访问其他AWS服务。
(二)超时(Timeout)
- Lambda函数有最大执行时间限制。默认超时时间是3秒,最长为15分钟。如果函数执行时间超过这个限制,就会被终止。在设计函数时,要考虑好业务逻辑是否能在规定时间内完成。
(三)内存和CPU
- 创建Lambda函数时,需要指定内存量(128MB - 10GB)。分配的内存大小还决定了函数可用的CPU功率,内存分配越多,CPU功率越高。合理配置内存可以优化函数性能。
三、Lambda定价(Lambda Pricing)
(一)计费模型
- Lambda的定价基于两个因素:
- 请求数量:按每100万次请求收费。
- 执行时长:按照函数执行时间计费,向上取整到最接近的100毫秒。AWS提供每月100万次请求和400,000GB - 秒的免费计算时间。了解定价模型有助于控制成本。
四、Lambda扩展和性能(Lambda Scaling and Performance)
(一)并发和扩展
- Lambda会根据传入请求的数量自动扩展。如果触发的请求增多,Lambda会自动扩展来处理它们。AWS为Lambda函数设置了并发执行限制,如有需要可以申请增加。这保证了在高负载情况下系统的处理能力。
(二)预留并发
- 可以为Lambda函数预留特定数量的并发,确保它在其他函数被触发时也始终有资源运行。对于关键业务的函数,预留并发可以保证其性能。
(三)预配置并发
- 预配置并发允许预先启动一定数量的Lambda实例,减少冷启动时间。对于对延迟敏感的应用程序非常有用。
(四)冷启动
- 当Lambda函数在空闲一段时间后被调用时会发生冷启动,这会导致一些延迟。因为Lambda需要在执行前初始化运行时和函数代码。使用预配置并发可以减少冷启动。
五、事件处理和错误处理(Event Handling and Error Handling)
(一)死信队列(Dead Letter Queue,DLQ)
- DLQ用于捕获Lambda无法处理的事件。可以为Lambda函数配置DLQ,存储失败的调用,以便进一步分析或重试,避免事件丢失。
(二)重试行为
- AWS Lambda会对异步调用的失败情况自动重试。例如,如果由SNS触发的函数失败,Lambda会重试调用两次(中间有延迟)。
(三)超时和错误
- 如果函数执行超过配置的超时时间,会导致错误。要确保Lambda函数能够妥善处理错误和异常,保证系统的稳定性。
(四)Lambda目标(Lambda Destinations)
- Lambda目标允许捕获Lambda调用的结果(成功或失败),并将其发送到其他AWS服务(如SNS、SQS、EventBridge),方便后续的处理和通知。
六、Lambda与其他AWS服务的集成(Integrating Lambda with Other AWS Services)
(一)Lambda与API Gateway
- API Gateway常用于创建触发Lambda函数的RESTful API或WebSocket API。在考试中可能会考查如何配置这种集成,例如如何设置请求路径、方法和集成类型等。
(二)Lambda与DynamoDB Streams
- Lambda可以由DynamoDB Streams触发,在表更新时进行实时数据处理,实现数据的实时同步和处理。
(三)Lambda与S3
- Lambda可以被S3事件(如对象创建)触发。比如创建一个Lambda函数,在图像上传到S3时就对其进行处理,实现自动化的数据处理流程。
(四)Lambda与Step Functions
- AWS Step Functions用于将多个AWS服务协调成无服务器工作流。Lambda函数常集成到Step Functions工作流中,构建可扩展、容错的应用程序,实现复杂的业务逻辑。
七、Lambda最佳实践(Lambda Best Practices)
(一)高效的代码设计
- 保持函数逻辑简洁高效,尽量减少执行时间。有效利用AWS SDK,避免不必要的开销,提高函数性能。
(二)环境变量
- Lambda支持环境变量来存储配置设置和机密信息(不过对于敏感数据,应该使用AWS Secrets Manager或AWS Systems Manager Parameter Store)。合理利用环境变量可以方便地配置函数。
(三)监控和日志记录
- Lambda与CloudWatch Logs集成用于记录输出,可以监控调用次数、持续时间和错误等指标。同时,开启X - Ray用于跟踪和故障排除也很重要,帮助及时发现和解决问题。
(四)打包Lambda函数
- 对于大型应用程序或库,可能需要将代码打包成部署包或容器图像。Lambda支持大小不超过10GB的容器图像,以及常规的部署包(压缩后50MB或未压缩250MB)。合适的打包方式有助于函数的部署和管理。
八、Lambda常见用例(Common Lambda Use Cases)
(一)微服务架构
- Lambda因其可扩展性和按使用量付费的定价模式,常被用于实现微服务。可以快速部署和扩展微服务,适应业务需求。
(二)数据处理
- Lambda函数可用于实时数据处理,如处理来自CloudWatch的日志、S3的图像或SQS的消息,实现数据的实时转换和分析。
(三)实时文件处理
- Lambda常用于文件上传到S3时的任务,如调整图像大小或转码视频,提高文件处理效率。
(四)事件驱动架构
- Lambda是事件驱动架构的热门选择,特别是与SNS、SQS、DynamoDB Streams或EventBridge等服务结合使用时,可以构建响应式的系统。
八、Lambda and VPC Configuration
- 知识点:
- 当Lambda函数需要访问VPC内的资源时,它需要被分配到特定的子网和安全组。子网确定了函数在VPC中的网络位置,安全组则控制着函数的入站和出站流量规则。
- Lambda函数本身可以连接到VPC,但需要正确配置。
- 配置VPC访问时,不是因为函数的IAM角色没有访问VPC的权限或者Lambda不需要VPC这种原因导致无法访问(答案选项C和D错误)。
- 注意事项:
- 在配置Lambda函数连接VPC时,要仔细确认子网有足够的IP地址可用,并且安全组规则允许函数与目标资源(如数据库实例)进行必要的通信,比如开放适当的端口。
- 不同的VPC配置(如不同的网段、路由表等)可能会影响Lambda函数的网络连接性,需要综合考虑整个网络架构。
九、Lambda Layers
- 知识点:
- Lambda层可以用于减小Lambda函数包的大小,特别是在使用大型第三方库时很有用。
- 一个Lambda函数一次最多可以使用五个层,这有助于组织和共享代码、库等资源。
- Lambda层不能用于存储Lambda函数本身的代码(选项C错误),并且它不是仅适用于Python和Node.js(选项A错误),也不是创建后就不可更新(选项D错误)。
- 注意事项:
- 要注意各层之间的兼容性,包括语言版本和依赖关系。例如,如果一个层是基于特定版本的Python库构建的,使用该层的Lambda函数也应该与之兼容的Python版本和相关依赖环境。
- 当更新或修改Lambda层时,要测试使用该层的所有Lambda函数,确保没有因为层的变化而出现功能异常。
十、Lambda Asynchronous Invocation and Retry
- 知识点:
- 当Lambda函数被配置为从S3事件异步调用时,如果处理过程失败,Lambda会自动重试函数调用两次。
- 不是不会重试(选项B错误),也不是按固定时间间隔(如每5分钟)重试直到成功(选项C错误),或者需要手动干预才重试(选项D错误)。
- 注意事项:
- 要考虑重试可能带来的副作用,例如如果函数是幂等的还好,但如果不是幂等的,多次重试可能会导致数据不一致等问题。
- 对于一些可能频繁失败的情况,要分析失败原因,可能是函数内部逻辑问题或者资源不足等,不能仅仅依赖自动重试机制。
十一、Lambda with SQS and Batch Processing
- 知识点:
- 当使用SQS队列触发Lambda函数并且要处理批消息时,若希望一个消息处理失败时重试整个批消息,可以将SQS批大小设置为1,并在Lambda函数内部处理失败情况。
- 启用Lambda死信队列(DLQ)主要用于处理无法处理的消息,而不是满足整个批消息重试的要求(选项A错误)。
- 配置SQS发送失败通知到SNS或者让Lambda函数一次只处理一个消息并不能达到批消息处理失败重试整批的要求(选项B和D错误)。
- 注意事项:
- 将SQS批大小设置为1可能会影响处理效率,需要权衡处理失败重试和性能之间的关系。
- 在Lambda函数中处理失败情况时,要考虑如何记录和跟踪这些失败消息,以便后续分析和解决问题。
十二、Lambda and S3 Event Notifications
- 知识点:
- 如果Lambda函数没有被S3事件触发,首先要检查的是S3桶是否配置了事件通知来触发该函数。
- 不能用API Gateway或者CloudTrail来触发这个特定场景下的Lambda函数(选项B和C错误),启用S3版本控制与触发Lambda函数无关(选项D错误)。
- 注意事项:
- 配置S3事件通知时,要注意事件类型(如对象创建、删除等)的准确性,确保只有符合预期的事件才能触发Lambda函数。
- 还要检查Lambda函数的权限,确保它有足够的权限来响应S3事件通知并处理相关的对象操作。
十三、Lambda with EventBridge
- 知识点:
- Lambda Destinations可以用于捕获Lambda函数调用的结果,并将其转发到SNS主题等进行进一步处理。
- 死信队列(DLQ)主要用于处理无法正常处理的消息,而不是捕获和转发结果(选项B错误)。
- CloudWatch Logs用于记录日志,CloudWatch Metrics用于监控指标,它们不能用于捕获结果并转发(选项C和D错误)。
- 注意事项:
- 在配置Lambda Destinations时,要确保目标服务(如SNS主题)的权限设置正确,以便能够成功接收和处理转发过来的结果。
- 要考虑结果数据的格式和内容,可能需要在Lambda函数中对结果进行适当的整理和包装,以符合目标服务的要求。
十四、Lambda and X - Ray Integration
- 知识点:
- AWS X - Ray可以帮助追踪Lambda函数的请求,提供详细的性能数据,用于排查性能问题。
- AWS CloudWatch Alarms主要用于监控和告警,CloudTrail用于记录API调用等操作,Amazon Inspector用于安全评估,它们不能用于追踪Lambda函数的详细性能(选项B、C和D错误)。
- 注意事项:
- 需要在Lambda函数中正确配置和初始化X - Ray,以确保能够准确地追踪请求。
- 分析X - Ray提供的数据时,要结合业务逻辑和系统架构,才能准确地定位性能瓶颈所在的位置。
十五、Lambda and CloudWatch Metrics
- 知识点:
- CloudWatch指标中的“Invocations”可以用于确定Lambda函数成功调用的次数。
- “Throttles”用于显示函数被限制的次数,“Errors”用于显示错误次数,“Duration”用于显示函数执行时间,这些指标不能直接用于确定成功调用次数(选项B、C和D错误)。
- 注意事项:
- 要注意“Invocations”指标可能包括成功和失败的调用,可能需要结合“Errors”指标来更准确地分析函数的运行情况。
- 根据具体业务需求,可以设置CloudWatch告警基于“Invocations”指标,例如当调用次数低于或高于预期范围时发出告警。
十六、Lambda Security Best Practices
- 知识点:
- 当Lambda函数通过API Gateway被用户调用并且要访问S3桶时,使用API Gateway Lambda Authorizer进行认证是减少未授权访问风险的最佳方式。
- 给Lambda函数一个对S3有完全访问权限的IAM角色会增加安全风险(选项B错误),使用AWS KMS加密请求主要用于加密而不是认证(选项C错误),允许公共访问S3桶是不安全的(选项D错误)。
- 注意事项:
- 在配置API Gateway Lambda Authorizer时,要注意认证逻辑的准确性和安全性,例如使用合适的身份验证方法(如JWT等)。
- 定期审查和更新认证策略,以适应不断变化的安全需求和业务规则。
十七、Lambda with SNS and SQS
- 知识点:
- 如果想确保Lambda函数能够处理所有消息,即使失败也不会丢失消息,可以为SNS主题配置死信队列(DLQ)。
- 设置SNS主题重试失败消息可能无法完全避免消息丢失(选项A错误),增加Lambda函数的超时时间与避免消息丢失没有直接关系(选项C错误),使用SQS队列作为事件源不一定能解决消息丢失问题(选项D错误)。
- 注意事项:
- 要合理配置DLQ的相关参数,如消息保留时间等,以便有足够的时间来处理和分析死信队列中的消息。
- 建立监控和告警机制,及时发现DLQ中有消息堆积的情况,以便及时处理潜在的问题。
十八、Lambda and Secrets Management
- 知识点:
- 存储和检索Lambda函数使用的敏感数据(如API密钥)的最佳方式是将其存储在AWS Secrets Manager中,并从Lambda函数中访问。
- 存储在Lambda环境变量中不够安全(选项A错误),存储在S3桶(即使有受限访问)或者DynamoDB(即使加密)也不是最佳实践(选项C和D错误)。
- 注意事项:
- 确保Lambda函数有足够的权限来访问Secrets Manager中的秘密数据,并且权限范围要尽量小,遵循最小权限原则。
- 定期轮换秘密数据,以提高安全性,同时要确保Lambda函数能够正确地更新和使用新的秘密数据。
十九、Lambda Cold Start Performance
- 知识点:
- Lambda Provisioned Concurrency可以有效缓解Lambda函数冷启动延迟的问题,对于需要频繁调用且冷启动延迟高的函数很有用。
- 使用Amazon EC2代替Lambda可能会失去Lambda的一些优势(选项A错误),增加函数的超时时间或者减少内存分配不能解决冷启动延迟问题(选项C和D错误)。
- 注意事项:
- 启用Provisioned Concurrency会增加成本,需要根据业务需求和成本效益进行权衡。
- 要注意监控Provisioned Concurrency的使用情况,确保配置的并发数能够满足实际业务需求,避免资源浪费。