Amazon DVA-C02: 无服务器与 AWS Lambda — 学习指南
属于 AWS Developer Associate DVA-C02 — 学习指南. 使用经过验证的答案练习: Amazon 考试中心, 或参加限时模拟考试: ExamRoll.io.
版本、别名、层与打包
Lambda 版本是代码和配置的不可变快照,通过 PublishVersion API 创建(例如,boto3.client(’lambda’).publish_version(FunctionName=‘MyFunc’))。使用版本可以实现可复现的发布,然后创建别名(boto3.client(’lambda’).create_alias 或 update_alias)作为稳定的指针,这些别名还可以携带路由配置,在不同版本之间拆分流量以实现灰度发布。层提供了一种共享通用原生库或运行时包的方式;publish_layer_version 允许您将依赖项(例如,已编译的二进制文件)与函数包分开附加,从而使构建包更小、冷启动更快。在打包方面,优先选择小的 zip 压缩包以实现快速部署(或对于较大的构件使用由 S3 支持的上传),并在需要大型二进制文件或自定义运行时的情况下采用容器镜像;docker build + aws lambda create-function –package-type Image 将注册存储在 ECR 中的镜像(容器镜像支持更大的尺寸)。常见陷阱包括将凭证硬编码到环境变量中、超出部署包大小限制,以及忘记层是版本化且不可变的:通过发布新的层版本并更新函数配置来更新依赖项。对于程序化回滚,将别名更新为指向先前的版本(boto3.client(’lambda’).update_alias(FunctionName=‘MyFunc’, Name=‘prod’, FunctionVersion=‘3’)),以最小化运维影响。
执行环境、性能调优与冷启动缓解
Lambda 的 CPU 随内存扩展,因此优化 CPU 密集型工作负载通常是通过增加 MemorySize 设置(通过 UpdateFunctionConfiguration)来完成,而不是调整一个独立的 CPU 旋钮;使用 AWS X-Ray 和 CloudWatch 指标进行测量,以找到持续时间和成本之间的最佳平衡点。冷启动受包大小、初始化代码、VPC 网络的使用(ENI 挂载延迟)和语言运行时的影响;通过精简初始化过程、将重型库移入层、使用预置并发(put_provisioned_concurrency_config)或使用带有优化入口点的容器镜像来缓解。对于附加到 VPC 的函数,通过为 S3/DynamoDB 使用 VPC 端点或使用 RDS Proxy 来避免冷启动峰值,以限制连接抖动和 NAT Gateway 成本;确保 Lambda 执行角色包含 AWSLambdaVPCAccessExecutionRole 托管策略,并且子网有为 ENI 提供充足的 IP 地址空间。注意同步超时等陷阱:将函数超时设置得低于下游依赖项的超时,以确保出站调用方看到一致的失败模型,并使用幂等性令牌进行重试,因为像 SQS、SNS 和 Kinesis 这样的服务提供的是至少一次的交付语义。
VPC 访问、临时存储与安全控制
当您将 Lambda 放入 VPC 时,必须在函数配置上配置子网 ID 和安全组;然后,函数会在这些子网中使用 ENI,并需要到外部服务的网络路径。要不通过 NAT 访问 S3 或 DynamoDB,请创建 VPC 端点(S3 使用网关端点,许多服务使用接口端点)。对于数据库,优先使用 RDS Proxy 来池化连接并减少突发性的连接创建。/tmp 目录为执行环境提供临时存储,并在调用期间可写;如果需要,可以配置更大的临时存储(EphemeralStorage 设置),但应尽可能设计为无状态函数。通过将密钥存储在 AWS Secrets Manager 或 Parameter Store (SSM) 中并授予 Lambda 角色最小权限来保护密钥;在冷启动时使用 boto3.client(‘secretsmanager’).get_secret_value(SecretId=arn) 获取密钥,或使用由函数 KMSKeyArn 中指定的 KMS 密钥加密的环境变量。常见的开发者陷阱包括缺少 VPC 端点导致超时、在代码中嵌入明文密钥,以及忘记高效地轮换或缓存密钥以避免 Secrets Manager API 调用被节流。
事件集成、错误处理、本地测试与部署策略
Lambda 与许多事件源原生集成:S3 事件通知、DynamoDB Streams、Kinesis、SQS 和 API Gateway。对于流式源,应调整 batch size 和 parallelizationFactor,监控 IteratorAge,并处理部分失败,因为 Lambda 会重试失败的批次,当错误持续存在时可能会阻塞下游处理。对于异步调用,使用 DLQ 或 Destinations 来捕获失败(通过 onFailure/onSuccess 目的地配置异步调用)。当您向同一存储桶回写数据时,由 S3 触发的函数必须通过检查对象键或使用对象标签来防止递归调用。本地测试最好使用 AWS SAM CLI(sam build; sam local invoke; sam local start-api)或容器化的 Lambda 运行时来完成;单元测试可以使用 moto 或本地模拟(mocking),但集成测试应在临时的测试账户中针对真实的 AWS 资源运行。部署应使用版本化的函数 + 别名,并通过 CodeDeploy 或带有 RoutingConfig 的 UpdateAlias 进行流量切换,以执行金丝雀或线性部署;实现 PreTraffic 和 PostTraffic 挂钩以进行验证。常见的陷阱包括:在重试时忽略幂等性、不处理部分的 BatchGetItem 响应(检查 UnprocessedKeys),以及使用过于宽泛的 IAM 执行角色。
实践问题:用例场景
场景:PhotoSpot Inc 公司运行一个 Python Lambda 函数,用于处理上传到 S3 的图片,将元数据写入 DynamoDB,并调用一个第三方的图片优化 API。该函数需要快速的冷启动性能、安全的 API 凭证、安全的回滚机制,以及访问托管在 VPC 中的 RDS 代理以进行元数据丰富。
挑战:为用户可见的上传操作降低冷启动延迟,保护并轮换第三方 API 密钥,并实现零停机时间的安全回滚和受控的流量切换。
推荐方法:
- 构建并发布不可变的发布版本:使用 AWS CLI 或
boto3更新代码,然后执行boto3.client('lambda').publish_version(FunctionName='PhotoProcessor')并创建/更新别名boto3.client('lambda').update_alias(FunctionName='PhotoProcessor', Name='prod', FunctionVersion='7', RoutingConfig={'AdditionalVersionWeights': {'8': 0.1}})。 - 缓解冷启动:为别名配置
Provisioned Concurrencyboto3.client('lambda').put_provisioned_concurrency_config(FunctionName='PhotoProcessor', Qualifier='prod', ProvisionedConcurrentExecutions=10),并将大型原生库移至已发布的层(layer)中boto3.client('lambda').publish_layer_version。 - 保护凭证:将第三方 API 密钥存储在 AWS Secrets Manager 中,授予 Lambda 角色最小权限,并在冷启动时通过
boto3.client('secretsmanager').get_secret_value(SecretId=secret_arn)获取,而不是将密钥嵌入代码或明文环境变量中。 - VPC 和连接处理:将函数放置在具有安全组的私有子网中,使用 RDS Proxy 访问数据库以避免连接风暴,并为 S3 创建一个 VPC 端点,这样读取图片就不需要 NAT。
基本原理:使用版本和别名并结合流量切换,可以通过重新指向别名来实现安全的部署和即时回滚。Provisioned Concurrency 和层可以减少初始化延迟,而 Secrets Manager 则集中管理凭证轮换并最大限度地减少密钥暴露。RDS Proxy 和 VPC 端点通过减少连接流失和对 NAT 的依赖,降低了延迟和运营成本。
所有领域 · Amazon API Gateway 与应用集成 →
练习这些题目 → · 在 ExamRoll.io 上限时练习 →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
通过考试 →