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函数本身

--------------------------------------------------------------------------------------

 

posted @ 2022-04-12 08:25  姓蜀名黍  阅读(129)  评论(0编辑  收藏  举报