AWS 21 AWS_Serverless_Lambda
什么是无服务器?
?无服务器是一种新的模式,开发人员不必使用它不再管理服务器…
?他们只是部署代码
?他们只是部署……功能!
?最初。。。无服务器==FaaS(作为服务的功能)
?无服务器由AWS Lambda首创,但现在还包括任何被管理的东西:“数据库、消息、存储等等。”
?无服务器并不意味着没有服务器…这意味着你不去管理/提供/查看它们
Serverless in AWS
? AWS Lambda
? DynamoDB
? AWS Cognito
? AWS API Gateway
? Amazon S3
? AWS SNS & SQS
? AWS Kinesis Data Firehose
? Aurora Serverless
? Step Functions
? Fargate
--------------------------------------------------------------------------------------
为什么是Lambda
亚马逊EC2
?云中的虚拟服务器
?受RAM和CPU的限制
?持续运行
?扩展意味着添加/删除服务器的干预
Amazon Lambda
?虚拟功能–无需管理服务器!
?受时间限制——短时间执行
?按需运行
?自动缩放!
--------------------------------------------------------------------------------------
AWS Lambda的好处
?轻松定价:
?按请求付费和计算时间
?100万AWS Lambda请求和40万GB计算时间的免费层
?与整个AWS服务套件集成
?与多种编程语言集成
?通过AWS CloudWatch轻松监控
?每个功能易于获得更多资源(最多10GB的RAM!)
?增加RAM也将改善CPU和网络!
AWS Lambda language support
? Node.js (JavaScript)
? Python
? Java (Java 8 compatible)
? C# (.NET Core)
? Golang
? C# / Powershell
? Ruby
? Custom Runtime API (community supported, example Rust)
?Lambda容器图像
?容器映像必须实现Lambda运行时API
?ECS/Fargate是运行任意Docker映像的首选
--------------------------------------------------------------------------------------
AWS Lambda Integrations Main ones
API Gateway / Kinesis / DynamoDB / S3 / CloudFront
CloudWatch Events / CloudWatch Logs / SNS / SQS / Cognito
EventBridge
AWS Lambda定价:示例
?您可以在此处找到总体定价信息:
https://aws.amazon.com/lambda/pricing/
?按通话付费:
?前1000000个请求是免费的
?此后每100万次申请0.20美元(每次申请0.0000002美元)
?按持续时间付费:(增量为1毫秒)
?每月免费提供400000 GB的计算时间
?==400000秒(如果功能为1GB RAM)
?==3200000秒(如果功能为128 MB RAM)
?在这之后,60万GB秒的价格为1.00美元
?运行AWS Lambda通常非常便宜,因此非常受欢迎
Lambda–同步调用
?同步:CLI、SDK、API网关、应用程序负载平衡器
?立即返回结果
?错误处理必须在客户端进行(重试、指数退避等)
Lambda-同步调用-服务
?用户调用:
?弹性负载平衡(应用程序负载平衡器)
?亚马逊API网关
?亚马逊云端(Lambda@Edge)
?Amazon S3批次
?调用的服务:
?亚马逊Cognito
?AWS步进功能
?其他服务:
? Amazon Lex
? Amazon Alexa
? Amazon Kinesis Data Firehose
--------------------------------------------------------------------------------------
Lambda与ALB的集成
?将Lambda函数公开为HTTP(S)端点…
?您可以使用应用程序负载平衡器(或API网关)
?Lambda函数必须在目标组中注册
ALB to Lambda: HTTP to JSON
ELB information
HTTP Method & Path
Query String Parameters as Key/Value pairs
Headers as Key/Value pairs
Body (for POST, PUT...) & isBase64Encoded
Lambda to ALB conversions: JSON to HTTP
Status Code & Description
Headers as Key/Value pairs
Body & isBase64Encoded
ALB多头值
?ALB可支持多标题值(ALB设置)
?启用多值头、HTTP头和查询与多个值一起发送的字符串参数 as arrays
在AWS Lambda事件和响应对象。
--------------------------------------------------------------------------------------
Lambda@Edge
?您已经使用CloudFront部署了CDN
?如果您想与AWS Lambda一起经营全球业务,该怎么办?
?或者如何在到达应用程序之前实施请求过滤?
?为此,您可以使用Lambda@Edge:
在CloudFront CDN旁边部署Lambda功能
?构建响应能力更强的应用程序
?您不管理服务器,Lambda在全球部署
?定制CDN内容
?只为你使用的东西付费
Lambda@Edge
?您可以使用Lambda更改CloudFront请求和响应:
?CloudFront收到观众请求后(观众请求)
?在CloudFront将请求转发到源站之前(源站请求)
?CloudFront收到来自源站的响应后(源站响应)
?在CloudFront将响应转发给查看器之前(查看器响应)
?您还可以生成对观众的响应,而无需将请求发送到源站
Lambda@Edge: Global application
Lambda@Edge:用例
?网站安全和隐私
?边缘的动态Web应用程序
?搜索引擎优化(SEO)
?智能地跨源站和数据中心布线
?边缘的机器人缓解
?实时图像转换
?A/B测试
?用户身份验证和授权
?用户优先级
?用户跟踪和分析
--------------------------------------------------------------------------------------
Lambda – Asynchronous Invocations
Lambda–异步调用
?S3、SNS、CloudWatch活动…
?事件被放置在事件队列中
?Lambda尝试在出现错误时重试
?总共3次尝试
?第一次之后等待1分钟,然后等待2分钟
?确保处理是幂等的(在重试的情况下)
?如果重试该功能,您将在CloudWatch日志中看到重复的日志条目
?可以为失败的处理定义DLQ(死信队列)——SNS或SQS(需要正确的IAM权限)
?异步调用允许您在不需要等待结果的情况下加快处理速度(例如:您需要处理1000个文件)
Lambda-异步调用-服务
?亚马逊简单存储服务(S3)
?亚马逊简单通知服务(SNS)
?亚马逊CloudWatch活动/事件桥
?AWS CodeCommit(CodeCommitTrigger:新分支、新标签、新推送)
?AWS CodePipeline(在管道中调用Lambda函数,Lambda必须回调)
-----其他的-----
?亚马逊CloudWatch日志(日志处理)
?亚马逊简单电子邮件服务 Simple Email Service
?AWS云层形成 CloudFormation
?AWS配置
?AWS物联网 Config
?AWS物联网活动 AWS IoT Events
--------------------------------------------------------------------------------------
CloudWatch Events / EventBridge
CRON or Rate Trigger
EventBridge Rule Every 1 hour
CodePipeline Trigger on
EventBridge Rule State Changes
AWS Lambda Function
Perform a task
--------------------------------------------------------------------------------------
S3 Events Notifications
?S3:ObjectCreated,S3:ObjectRemoved,S3:ObjectRestore,S3:Replication…
?可能的对象名称筛选(*.jpg)
?用例:生成上传到S3的图像缩略图
?S3事件通知通常以秒为单位发送事件,但有时可能需要一分钟或更长时间
?如果同时对单个非版本对象进行两次写入,则为可能只发送一个事件通知
?如果要确保每次成功写入都会发送事件通知,可以在bucket上启用版本控制。
Simple S3 Event Pattern – Metadata Sync
--------------------------------------------------------------------------------------
Lambda – Event Source Mapping
?运动数据流 Kinesis---- Data Streams
?SQS和SQS FIFO队列---- SQS & SQS FIFO queue
?DynamoDB流 ---- DynamoDB Streams
?共同点:记录需要从来源处查询
?同步调用Lambda函数
Streams & Lambda (Kinesis & DynamoDB)
?事件源映射为每个碎片创建一个迭代器,按顺序处理项目
?从新项目开始,从开始或从时间戳开始
?处理过的项目不会从流中删除(其他消费者可以阅读)
?低流量:处理前使用批处理窗口积累记录
?您可以并行处理多个批次
?每个碎片最多10批
?每个分区密钥仍保证顺序处理,
Streams & Lambda – Error Handling
?默认情况下,如果您的函数返回错误,则整个批处理将被删除
重新处理,直到函数成功,或批处理中的项目失效
?为确保有序处理,受影响碎片的处理暂停,直到错误得到解决
?您可以将事件源映射配置为:
?抛弃旧事件
?限制重试次数
?错误时拆分批次(解决Lambda超时问题)
?丢弃的事件可以到达目的地
Lambda–事件源映射
SQS和SQS FIFO
?事件源映射将轮询SQS(长轮询)
?指定批量大小(1-10条消息)
?建议:将队列可见性超时设置为队列超时的6倍
Lambda函数
?使用DLQ
?在SQS队列上设置,而不是Lambda(Lambda的DLQ仅用于异步调用)
?或使用Lambda目的地处理故障
队列与Lambda
?Lambda还支持FIFO(先进先出)队列的顺序处理,
扩展到活动消息组的数量。
?对于标准队列,项目不一定按顺序处理。
?Lambda可扩展以尽快处理标准队列。
?发生错误时,批次作为单个项目返回队列
并且可能在与原始批次不同的分组中处理。
?偶尔,事件源映射可能会从排队两次,即使没有发生函数错误。
?Lambda在成功处理项目后从队列中删除项目。
?如果需要,您可以将源队列配置为将项目发送到死信队列它们不能被处理
Lambda事件映射器缩放
?Kinesis数据流和DynamoDB数据流:
?每个流碎片一次Lambda调用
?如果使用并行化,每个碎片最多可同时处理10批
?SQS标准:
?Lambda每分钟增加60多个实例以扩大规模
?同时处理多达1000批消息
?SQS FIFO:
?具有相同GroupID的邮件将按顺序处理
?Lambda功能可扩展到活动消息组的数量
--------------------------------------------------------------------------------------
Lambda–目的地 Lambda – Destinations
?2019年11月:可以配置将结果发送到目的地
?异步调用-可以定义成功和失败事件的目标:
? Amazon SQS
? Amazon SNS
? AWS Lambda
? Amazon EventBridge bus
?注意:AWS建议您现在使用目的地而不是DLQ(但两者可以同时使用)
?事件源映射:用于丢弃的事件批次
?亚马逊SQS
?亚马逊SNS
?注意:您可以直接从SQS向DLQ发送事件
--------------------------------------------------------------------------------------
Lambda执行角色(IAM角色)
?向AWS服务/资源授予Lambda功能权限
?Lambda的管理策略示例:
?AWSLambdabasiceExecutionRole–将日志上传到CloudWatch。
?AWSLambdaKinesisExecutionRole–从动觉中读取
?AWSLAMBDADynamodExecutionRole–从DynamoDB流读取
?AWSLambdasqqueExecutionRole–从SQS读取
?AWSLambdaVPCAccessExecutionRole–在VPC中部署Lambda功能
?AWSXRayDaemonWriteAccess–将跟踪数据上传到X射线。
?使用事件源映射调用函数时,Lambda使用执行角色读取事件数据。
?最佳实践:为每个函数创建一个Lambda执行角色
基于Lambda资源的策略
?使用基于资源的策略提供其他帐户和AWS服务
使用Lambda资源的权限
?类似于S3 bucket的S3 bucket策略
?IAM负责人可以访问Lambda:
?如果委托人的IAM政策授权(例如用户访问)
?或者如果基于资源的政策授权(例如服务访问)
?当像Amazon S3这样的AWS服务调用Lambda函数时
基于资源的策略为it提供了访问权限
--------------------------------------------------------------------------------------
Lambda环境变量
?环境变量=字符串形式的键/值对
?在不更新代码的情况下调整功能行为
?环境变量可用于代码
?Lambda服务还添加了自己的系统环境变量
?有助于存储机密(由KMS加密)
?机密可以通过Lambda服务密钥或您自己的CMK进行加密
--------------------------------------------------------------------------------------
Lambda测井与监测
?CloudWatch日志:
?AWS Lambda执行日志存储在AWS CloudWatch日志中
?确保您的AWS Lambda函数具有执行角色,并具有授权写入CloudWatch日志的IAM策略
?CloudWatch指标:
?AWS Lambda指标显示在AWS CloudWatch metrics中
?调用、持续时间、并发执行
?错误计数、成功率、限制
?异步交付失败
?迭代器年龄(运动和动态数据流)
? AWS Lambda metrics are displayed in AWS CloudWatch Metrics
? Invocations, Durations, Concurrent Executions
? Error count, Success Rates, Throttles
? Async Delivery Failures
? Iterator Age (Kinesis & DynamoDB Streams)
X射线Lambda追踪
?在Lambda配置中启用(活动跟踪)
?为您运行X射线守护程序
?在代码中使用AWS X-Ray SDK
?确保Lambda功能具有正确的IAM执行角色
?托管策略称为AWSXRayDaemonWriteAccess
?与X射线通信的环境变量
? _X_AMZN_TRACE_ID:包含跟踪头
? AWS_XRAY_CONTEXT_MISSING:默认情况下,日志_错误
? AWS_XRAY_DAEMON_ADDRESS:X射线守护程序IP_地址:端口
--------------------------------------------------------------------------------------
VPC 和 Lambda
?默认情况下,Lambda功能在您自己的专有网络之外启动(在AWS拥有的专有网络(VPC)
?因此无法访问VPC中的资源(RDS、ElastiCache、,内部ELB…)
VPC中的Lambda
?必须定义专有网络ID、子网和安全组
?Lambda将在您的子网中创建一个ENI(弹性网络接口)
?AWSLambdaVPCAccessExecutionRole
VPC中的Lambda–互联网接入
?VPC中的Lambda功能无法访问互联网
?在公共子网中部署Lambda功能不会为其提供互联网访问或公共IP
?在专用子网中部署Lambda功能可实现互联网 如果您有NAT网关/实例,请访问
?您可以使用VPC端点私自访问AWS服务,而无需NAT
注意:Lambda-CloudWatch日志甚至可以正常工作 没有端点或NAT网关
--------------------------------------------------------------------------------------
Lambda函数配置
?RAM:
?从128MB到10GB,增量为1MB
?添加的RAM越多,获得的vCPU积分越多
?1792 MB时,一个功能相当于一个完整的vCPU
?1792MB之后,您将获得多个CPU,并且需要在代码中使用多线程以从中获益(最多6个vCPU)
?如果应用程序受CPU限制(计算量大),请增加RAM
?超时:默认为3秒,最大为900秒(15分钟)
Lambda执行上下文
?执行上下文是一个临时运行时环境
初始化lambda代码的任何外部依赖项
?适用于数据库连接、HTTP客户端、SDK客户端…
?执行上下文会在预期的情况下保持一段时间另一个Lambda函数调用
?下一次函数调用可以“重新使用”上下文以缩短执行时间,并节省初始化连接对象的时间
?执行上下文包括/tmp目录
BAD
数据库连接已建立
每次调用函数时
GOOD
数据库连接建立一次
并在调用过程中重复使用
Lambda函数/tmp空间
?如果你的Lambda函数需要下载一个大文件才能工作…
?如果Lambda功能需要磁盘空间来执行操作…
?您可以使用/tmp目录
?最大容量为512MB
?执行上下文冻结时,目录内容仍保留,
提供可用于多次调用的临时缓存
(有助于检查你的工作)
?对于对象的永久持久性(非临时性),请使用S3
Lambda并发和节流 Lambda Concurrency and Throttling
并发限制:最多1000次并发执行
?可以在功能级别(=限制)设置“保留并发”
?每次超过并发限制的调用都会触发“节流”
?节流行为:
?如果同步调用=>return ThrottleError - 429
?如果异步调用=>自动重试,然后转到DLQ
?如果您需要更高的限额,请打开支持票
Lambda并发问题
?如果不保留(=限制)并发,可能会发生以下情况:
并发和异步调用
?如果函数没有足够的并发性来处理所有事件,则会限制其他请求。
?对于节流错误(429)和系统错误(500系列),Lambda
将事件返回到队列,并尝试再次运行该函数最多6小时。
?重试间隔从第一次尝试1秒后呈指数增长最多5分钟。
Cold Starts & Provisioned Concurrency
冷启动和资源调配并发
?冷启动:
?新实例=>加载代码,并在处理程序运行(init)之外运行代码
?如果init很大(代码、依赖项、SDK等等),这个过程可能需要一些时间。
?新实例服务的第一个请求的延迟比其他请求高
?提供的并发性:
?在调用函数之前(提前)分配并发性
?因此,冷启动永远不会发生,所有调用的延迟都很低
?应用程序自动扩展可以管理并发性(计划或目标利用率)
?注:VPC的冷启动在2019年10月和11月大幅减少
? https://aws.amazon.com/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/
保留和设置并发
hqps://docs.aws.amazon.com/lambda/latest/dg/configuranon-concurrency.html
--------------------------------------------------------------------------------------
Lambda函数依赖关系
?如果Lambda函数依赖于外部库:
例如AWS X-Ray SDK、数据库客户端等…
?您需要在代码旁边安装软件包,并将其压缩在一起
?用于node.js,使用npm和“node_modules”目录
?对于Python,使用pip——目标选项
?对于Java,包括相关的.jar文件
?如果小于50MB,则直接将zip上传至Lambda,否则先上传至S3
?本地库工作:它们需要在Amazon Linux上编译
?AWS SDK默认随每个Lambda函数提供
--------------------------------------------------------------------------------------
Lambda和CloudFormation–在线
?内联函数非常简单
?使用Code.ZipFile属性
?不能将函数依赖项包含在内联函数中
Lambda和CloudFormation–通过S3
?必须将Lambda拉链存储在S3中
?您必须参考CloudFormation代码中的S3 zip位置
?S3桶
?S3Key:zip的完整路径
?S3ObjectVersion:如果对bucket进行了版本控制
?如果您更新S3中的代码,但不更新S3Bucket、S3 Key或S3 ObjectVersion,CloudFormation将不会更新您的函数
Lambda和CloudFormation–通过S3多个账户
--------------------------------------------------------------------------------------
Lambda层 Lambda Layers
?自定义运行时 custom runtime
EX:C++ https://github.com/awslabs/aws-lambda-cpp
?例如:Rust https://github.com/awslabs/aws-lambda-rust-runtime
?将依赖项外部化以重复使用它们:
Lambda容器图像
?从ECR将Lambda功能部署为高达10GB的容器映像
?将复杂的依赖项、大型依赖项打包到容器中
?基本图像可用于Python、Node.js, Java, .NET, Go, Ruby
?只要实现Lambda运行时API,就可以创建自己的映像
?使用Lambda运行时接口模拟器在本地测试容器
?构建应用程序的统一工作流
Lambda容器图像 Lambda Container Images
?示例:根据AWS提供的基础图像构建
--------------------------------------------------------------------------------------
AWS Lambda版本
?当您使用Lambda函数时,我们使用$LATEST
?当我们准备发布Lambda函数时,我们会创建一个版本
?版本是不变的
?版本数量不断增加
?版本有自己的ARN(亚马逊资源名称)
?版本=代码+配置(任何内容都不能更改-不可变)
?可以访问lambda功能的每个版本
AWS Lambda别名
?别名是Lambda函数版本的“指针”
?我们可以定义“dev”、“test”、“prod”别名,并让它们指向不同的lambda版本
?别名是可变的
?别名通过Blue / Green将权重分配给中的ambda函数
?别名可以稳定地配置我们的事件触发器/目的地
?别名有自己的ARN
?别名不能引用别名
Lambda&CodeDeploy
?CodeDeploy可以帮助您自动切换Lambda别名的流量
?功能集成在SAM框架内
?线性:每N分钟增加一次流量,直到100%
?每3分钟线性10%
?每10分钟线性10%
?金丝雀:尝试X%然后100%
?金丝雀10%5分钟
?金丝雀10%30分钟
?AllAtOnc:立即
?可以创建前后交通挂钩,以检查Lambda功能的运行状况
--------------------------------------------------------------------------------------
AWS Lambda限值-每个地区
?执行:
?内存分配:128 MB–10GB(增量为1 MB)
?最长执行时间:900秒(15分钟)
?环境变量(4KB)
?功能容器(in/tmp)中的磁盘容量:512 MB
?并发执行:1000(可以增加)
?部署:
?Lambda函数部署大小(compressed.zip):50 MB
?未压缩部署的大小(代码+依赖项):250 MB
?可以在启动时使用/tmp目录加载其他文件
?环境变量的大小:4KB
AWS Lambda最佳实践
?在功能处理程序之外执行繁重的工作
?连接到函数处理程序之外的数据库
?在函数处理程序外部初始化AWS SDK
?将依赖项或数据集拉入函数处理程序之外
?使用环境变量:
?数据库连接字符串、S3 bucket等……不要将这些值放入代码中
?密码、敏感值……可以使用KMS进行加密
?将部署包的大小降至运行时所需的最小。
?如果需要,则分解功能
?记住AWS Lambda限制
?必要时使用图层
?避免使用递归代码,永远不要调用Lambda函数本身
--------------------------------------------------------------------------------------