什么是无服务?
- 无服务是一种新范式,开发人员无需再管理服务器…
- 只部署xx代码、xx功能!
- 最初,无服务 == FaaS(函数即服务)
- 无服务由 AWS Lambda 开创,但现在还包括任何托管内容:“数据库、消息传递、存储等”。
AWS 中的无服务
- AWS Lambda
- DynamoDB
- AWS Cognito
- AWS API Gateway
- Amazon S3
- AWS SNS & SQS
- AWS Kinesis Data Firehose
- Aurora Serverless
- Step Functions
- Fargate
|
为什么选择 AWS Lambda
- Amazon EC2
- 云中的虚拟服务器
- 受 RAM 和 CPU 限制
- 连续运行
- 扩展意味着需要人工干预去添加/删除服务器
- Amazon Lambda
- 虚拟功能——无需管理服务器!
- 受时间限制 - 执行时间短
- 按需运行
- 缩放是自动的!
AWS Lambda 的优点
- 轻松定价:
- 按请求和计算时间付费
- 提供免费的使用额度,包括1,000,000个AWS Lambda请求和400,000 GB的计算时间
- 与整个 AWS 服务套件集成
- 与多种编程语言集成
- 通过AWS CloudWatch 轻松监控
- 轻松为函数获取更多资源(高达 10GB RAM!)
- 增加 RAM 也能提高CPU和网络性能
AWS Lambda 语言支持
- Node.js (JavaScript)
- Python
- Java(兼容 Java 8)
- C#(.NET 核心)
- Go 语言
- C# / Powershell
- 红宝石
- 自定义运行时 API(社区支持,例如 Rust)
- Lambda 容器映像
- 容器映像必须实现Lambda Runtime API
- ECS / Fargate 是运行任意 Docker 镜像的首选
AWS Lambda 集成
Main ones
示例:无服务缩略图创建
示例:无服务 CRON 作业
AWS Lambda 定价:示例
- 用户可以在此处找到总体定价信息:
https://aws.amazon.com/lambda/pricing/ - 按调用量付费:
- 前 1,000,000 个请求免费
- 此后每 100 万个请求 0.20 美元(每个请求 0.0000002 美元)
- 按持续时间付费:(以 1 毫秒为增量)
- 每月免费 400,000 GB-秒 的计算时间
- exp: 400,000 秒(如果函数为 1GB RAM)
- exp: 3,200,000 秒(如果函数为 128 MB RAM)
- 此后 600,000 GB 秒 1.00 美元
- 每月免费 400,000 GB-秒 的计算时间
- 运行 AWS Lambda 通常非常便宜,因此非常受欢迎
AWS Lambda 的限制(per region)
- 执行:
- 内存分配:128 MB ~ 10GB(1 MB 增量)
- 最长执行时间:900 秒(15 分钟)
- 环境变量 (4 KB)
- “功能容器”中的磁盘容量(/tmp):512 MB 至 10GB
- 并发执行:1000(可以增加)
- 部署:
- Lambda 函数部署大小(压缩的.zip):50 MB
- 未压缩部署的大小(代码+依赖项):250 MB
- 可以使用/tmp目录在启动时加载其他文件
- 环境变量的大小:4 KB
Customization At The Edge
- 许多现代应用程序在边缘执行某种形式的逻辑
- 边缘功能:
- 用户编写并附加到 CloudFront 分配的代码
- 靠近用户运行以最大限度地减少延迟
- CloudFront 提供两种类型:CloudFront Functions 和 Lambda@Edge
- 用户无需管理全球部署的任何服务器
- 使用案例:定制CDN 内容
- 仅按使用量付费
- 完全无服务
CloudFront Functions vs. Lambda@Edge
用例:
- 网站安全和隐私
- 边缘的动态 Web 应用程序
- 搜索引擎优化(SEO)
- 智能路由跨源和数据中心
- 边缘机器人缓解
- 实时图像转换
- A/B 测试
- 用户身份验证和授权
- 用户优先级
- 用户跟踪和分析
CloudFront Functions
- 用 JavaScript 编写的轻量级函数
- 适用于大规模、延迟敏感的 CDN 定制
- 亚毫秒级启动时间,每秒数百万个请求
- 用于更改查看器请求和响应:
- 查看者请求:CloudFront 收到查看者的请求后
- 查看器响应:在 CloudFront 将响应转发给查看器之前
- CloudFront 的本机功能(完全在 CloudFront 内管理代码)
Lambda@Edge
- 用 NodeJS 或 Python 编写的 Lambda 函数
- 可扩展到每秒 1000 个请求
- 用于更改 CloudFront 请求和响应:
- 查看者请求:CloudFront 收到查看者的请求后
- 源请求:在 CloudFront 将请求转发到源之前
- 源响应:CloudFront 收到来自源的响应后
- 查看器响应:在 CloudFront 将响应转发给查看器之前
- 在一个 AWS 区域 (us-east-1) 中编写用户的函数,然后 CloudFront 复制到其位置
总结
CloudFront Functions
- 缓存键规范化
- 转换请求属性(标头、cookie、查询字符串、URL)以创建最佳缓存键
- Header 操作
- 在请求或响应中插入/修改/删除 HTTP 标头
- URL 重写或重定向
- 请求身份验证和授权
- 创建并验证用户生成的令牌(例如 JWT)以允许/拒绝请求
- 创建并验证用户生成的令牌(例如 JWT)以允许/拒绝请求
Lambda@Edge
- 较长的执行时间(几毫秒)
- 可调节CPU或内存
- 用户的代码依赖于第三个库(例如,用于访问其他 AWS 服务的 AWS SDK)
- 网络访问以使用外部服务进行处理
- 文件系统访问或对 HTTP 请求正文的访问
默认的 Lambda
- 默认情况下,用户的 Lambda 函数在用户自己的 VPC 外部(在 AWS 拥有的 VPC 中)启动
- 因此,它无法访问用户的VPC 中的资源(RDS、ElastiCache、内部ELB…)
VPC 中的 Lambda
- 用户必须定义 VPC ID、子网和安全组
- Lambda 将在用户的子网中创建 ENI(弹性网络接口)
带有 RDS 代理的 Lambda
- 如果 Lambda 函数直接访问用户的数据库,它们可能会在高负载下打开太多连接
- RDS 代理
- 通过池化和共享数据库连接来提高可扩展性
- 通过减少 66% 的故障转移时间并保留连接来提高可用性
- 通过在 Secrets Manager 中强制执行 IAM 身份验证和存储凭证来提高安全性
- Lambda 函数必须部署在用户的 VPC 中,因为 RDS Proxy 永远无法公开访问