文章目录

  • 什么是 Docker?
    • 操作系统上的 Docker
    • Docker 镜像存储
    • Docker vs. Virtual Machines
    • Docker 入门
    • AWS 中的 Docker Containers Management
  • Amazon ECS
    • EC2 Launch Type
    • Fargate Launch Type
    • ECS 的 IAM Roles
    • Load Balancer Integrations
    • Data Volumes (EFS)
    • ECS Service Auto Scaling
    • EC2 Launch Type – Auto Scaling EC2 实例
  • Amazon ECR
  • Amazon EKS 概述
    • Amazon EKS – Diagram
    • Amazon EKS – 节点类型
    • Amazon EKS – 数据卷
    • AWS App Runner
  • Serverless 概述
    • 什么是无服务?
    • AWS 中的无服务
    • 为什么选择 AWS Lambda
    • AWS Lambda 的优点
    • AWS Lambda 语言支持
    • AWS Lambda 集成
    • AWS Lambda 定价:示例
    • AWS Lambda 的限制(per region)
    • Customization At The Edge
    • CloudFront Functions vs. Lambda[@Edge ](/Edge )
      • CloudFront Functions
      • Lambda[@Edge ](/Edge )
    • 总结
      • CloudFront Functions
      • Lambda[@Edge ](/Edge )
    • 默认的 Lambda
    • VPC 中的 Lambda
    • 带有 RDS 代理的 Lambda
  • Amazon DynamoDB
    • DynamoDB – 基础知识
    • DynamoDB – 表示例
    • DynamoDB – 读/写容量模式
    • DynamoDB 加速器 (DAX)
      • DynamoDB 加速器 (DAX) vs. ElastiCache
    • DynamoDB – 流处理
      • DynamoDB 流
      • Kinesis Data Streams(较新)
    • DynamoDB Global Tables
    • DynamoDB – 生存时间 (TTL)
    • DynamoDB – 用于灾难恢复的备份
    • DynamoDB – 与 Amazon S3 集成

什么是 Docker?

  • Docker 是一个用于部署应用程序的软件开发平台
  • Docker 容器可以在任何操作系统上运行,应用程序运行在容器中
  • 应用程序运行过程相同,无论它们在何处运行 —> 行为可预测
  • 无兼容性问题,更易于维护和部署
  • 减少工作量
  • 使用案例:微服务架构、将应用程序从本地直接迁移到 AWS 云,…

操作系统上的 Docker

Docker 镜像存储

  • Docker 镜像存储在 Docker Repositories
  • Docker Hub (https://hub.docker.com)
    • 公共存储库
    • 查找多种技术或操作系统的基础映像(例如 Ubuntu、MySQL…)
  • Amazon ECR(Amazon Elastic Container Registry)
    • 私有存储库
    • 公共存储库(Amazon ECR Public Gallery: https://gallery.ecr.aws)

Docker vs. Virtual Machines

  • Docker 趋近于一种虚拟化技术,但并不完全是
  • 区别:与主机共享资源 => 一台服务器上有许多容器

Docker 入门

AWS 中的 Docker Containers Management

  • Amazon 弹性容器服务 (Amazon ECS)
    • Amazon 自己的容器平台
  • Amazon Elastic Kubernetes 服务 (Amazon EKS)
    • Amazon 托管的 Kubernetes(开源)
  • AWS Fargate
    • Amazon 自己的无服务容器平台
    • 可与 ECS 和 EKS 配合使用
  • Amazon ECR:
    • 存储容器的镜像

Amazon ECS

EC2 Launch Type

  • ECS = 弹性容器服务
  • 在 AWS 上启动 Docker 容器 = 在 ECS 集群上启动 ECS Tasks
  • EC2 启动类型:用户必须配置和维护基础设施(EC2 实例)
  • 每个 EC2 实例必须运行 ECS Agent 才能在 ECS 集群中注册
  • AWS 负责启动/停止容器

Fargate Launch Type

  • 在 AWS 上启动 Docker 容器
  • 用户无需配置基础设施(无需管理 EC2 实例)
  • 一切都是无服务的!
  • 用户只需创建任务定义
  • AWS 只是根据用户需要的 CPU/RAM 为用户运行 ECS Tasks
  • 如果要扩展,只需增加 Task 数量即可。 简单 —— 不会有更多的 EC2 实例

ECS 的 IAM Roles

  • EC2 实例配置文件(仅限 EC2 启动类型):
    • 由 ECS Agent 使用
    • 对 ECS 服务进行 API 调用
    • 将容器日志发送到 CloudWatch Logs
    • 从 ECR 拉取 Docker 镜像
    • 引用 Secrets Manager 或 SSM 参数存储中的敏感数据
  • ECS Task Role:
    • 允许每个任务具有特定的角色
    • 对不同 ECS 服务使用不同的角色
    • Task Role 是在 Task Definition 中定义

Load Balancer Integrations

  • 应用程序负载均衡器(ALB):支持并适用于大多数用例
  • 网络负载均衡器(NLB):建议仅用于高吞吐量/高性能用例,或将其与 AWS Private Link 配对
  • 弹性负载均衡器(ELB):支持但不推荐(无高级功能 – 如 Fargate)

Data Volumes (EFS)

  • 将 EFS 文件系统挂载到 ECS Tasks 上
  • 适用于 EC2 和 Fargate 启动类型
  • 在任何 AZ 中运行的任务将共享 EFS 文件系统中的相同数据
  • Fargate + EFS = Serverless
  • 使用案例:EFS 作为多可用区共享存储,实现容器的持久化
  • 注意:
    • Amazon S3 无法作为文件系统安装

ECS Service Auto Scaling

  • 自动增加/减少所需的 ECS Tasks 数量
  • ECS 实现自动扩展的方式是使用 AWS Application Auto Scaling 服务
    • ECS 服务平均 CPU 利用率
    • ECS 服务 RAM 上的 平均内存利用率规模
    • 每个目标的 ALB 请求计数 (来自 ALB 的指标)
  • 目标跟踪(Target Tracking): 根据特定 CloudWatch 指标的目标值进行扩展
  • 步进扩展(Step Scaling): 根据指定的 CloudWatch 警报进行扩展
  • 计划扩展(Scheduled Scaling): 根据指定日期/时间进行扩展(可预测的变化)
  • ECS Service Auto Scaling(任务级别)≠ EC2 Auto Scaling(EC2 实例级别)
  • Fargate Auto Scaling 更容易设置(因为无服务)

EC2 Launch Type – Auto Scaling EC2 实例

  • 通过添加底层 EC2 实例来适应 ECS 服务扩展
  • Auto Scaling Group (ASG)
    • 根据CPU 利用率扩展用户的 ASG
    • 随着时间的推移添加 EC2 实例
  • ECS Cluster Capacity Provider
    • 用于自动配置和扩展 ECS Tasks的基础设施
    • 通常与 ASG 配合使用
    • 当用户缺少容量(CPU、RAM…)时添加 EC2 实例

ECS Scaling – Service CPU 使用示例

Event Bridge 调用的 ECS Tasks

Event Bridge Schedule 调用的 ECS Tasks

ECS – SQS 队列示例

Amazon ECR

  • ECR = Elastic Container Registry
  • 在 AWS 上存储和管理 Docker 映像
  • 私有和公共存储库(Amazon ECR 公共库 https://gallery.ecr.aws)
  • 与 ECS 完全集成,由 Amazon S3 支持
  • 访问通过 IAM 控制(权限错误 => 策略)
  • 支持镜像漏洞扫描、版本控制、镜像标签、镜像生命周期…

Amazon EKS 概述

  • Amazon EKS = Amazon Elastic Kubernetes Service
  • 这是在 AWS 上启动托管 Kubernetes 集群的一种方法
  • Kubernetes 是一个开源系统,用于自动部署、扩展和管理容器化(通常是 Docker)应用程序
  • EKS 是 ECS 的一种替代方案,目标类似但 API 不同
  • EKS 支持 EC2(如果要部署工作节点),也支持 Fargate(如果要部署无服务器容器)。
  • 使用案例:如果用户的公司已在本地或其他云中使用 Kubernetes,并且希望使用 Kubernetes 迁移到 AWS
  • Kubernetes 与云无关(可以在任何云中使用 – Azure、GCP…)
  • 对于多个区域,需要在每个区域部署一个 EKS 集群
  • 使用 CloudWatch Container Insights 收集日志和指标

Amazon EKS – Diagram

Amazon EKS – 节点类型

  • 受托管节点组
    • 为用户创建和管理节点(EC2 实例)
    • 节点是EKS 管理的ASG 的一部分
    • 支持按需实例或 Spot 实例
  • 自我管理节点
    • 由用户创建并注册到 EKS 集群并由 ASG 管理的节点
    • 用户可以使用预构建的 AMI – Amazon EKS 优化的 AMI
    • 支持按需实例或 Spot 实例
  • AWS Fargate
    • 无需维护; 没有管理节点

Amazon EKS – 数据卷

  • 需要在 EKS 集群上指定 StorageClass 清单
  • 利用 Container Storage Interface (CSI) 兼容的驱动程序
  • 支持…
    • Amazon EBS
    • Amazon EFS(与 Fargate 配合使用)
    • Amazon FSx for Lustre
    • 适用于 NetApp ONTAP 的 Amazon FSx

AWS App Runner

  • 完全托管的服务,可以轻松大规模部署 Web 应用程序和 API
  • 无需基础架构经验
  • 从源代码或容器映像开始
  • 自动构建和部署 Web 应用程序
  • 自动扩展、高可用性、负载均衡器、加密
  • VPC 访问支持
  • 连接到数据库、缓存和消息队列服务
  • 使用案例:Web 应用程序、API、微服务、快速生产部署

Serverless 概述

什么是无服务?

  • 无服务是一种新范式,开发人员无需再管理服务器…
  • 只部署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 美元
  • 运行 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)以允许/拒绝请求

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 永远无法公开访问

Amazon DynamoDB

  • 完全托管、高度可用,可跨多个可用区进行复制
  • NoSQL 数据库,具有事务支持
  • 可扩展到海量工作负载、分布式数据库
  • 每秒数百万个请求、数万亿行、数百TB 存储
  • 快速且一致的性能(个位数毫秒)
  • 与 IAM 集成以实现安全、授权和管理
  • 低成本和自动扩展功能
  • 无需维护或修补,始终可用
  • 标准和不频繁访问 (IA) 表类

DynamoDB – 基础知识

  • DynamoDB 由表组成
  • 每个表都有一个主键(必须在创建时决定)
  • 每个表可以有无限数量的项目(= 行)
  • 每个项目都有属性(可以随着时间的推移添加 – 可以为空)
  • 项目的最大大小为 400KB
  • 支持的数据类型有:
    • 标量类型 – 字符串、数字、二进制、布尔值、空值
    • 文档类型 – 列表、地图
    • 集合类型 – 字符串集合、数字集合、二进制集合
  • 因此,在 DynamoDB 中,用户可以快速发展架构

DynamoDB – 表示例

DynamoDB – 读/写容量模式

  • 控制管理表容量的方式(读/写吞吐量)
  • 配置模式(默认)
    • 用户指定每秒读/写的数量
    • 用户需要提前规划容量
    • 支付预配置的读取容量单位 (RCU) 和写入容量单位 (WCU) 费用
    • 可以为 RCU 和 WCU 添加自动缩放模式
  • 点播模式
    • 读/写会根据用户的工作负载自动扩展/缩减
    • 无需进行容量规划
    • 按使用量付费,价格更高 ($$$)
    • 非常适合不可预测的工作负载、陡峭的突然峰值

DynamoDB 加速器 (DAX)

  • DynamoDB 的完全托管、高可用性、无缝内存缓存
  • 通过缓存帮助解决读取拥塞
  • 缓存数据的微秒级延迟
  • 不需要修改应用程序逻辑(与现有的DynamoDB API 兼容)
  • 5 分钟 TTL 缓存(默认)

DynamoDB 加速器 (DAX) vs. ElastiCache

DynamoDB – 流处理

  • 表中项目级修改(创建/更新/删除)的有序流
  • 用例:
    • 实时响应变化(向用户发送欢迎电子邮件)
    • 实时使用情况分析
    • 插入衍生表
    • 实施跨区域复制
    • 对 DynamoDB 表的更改调用 AWS Lambda

DynamoDB 流

  • 24 小时保留期
  • 消费者数量有限
  • 使用 AWS Lambda 触发器或 DynamoDB Stream Kinesis 适配器进行处理

Kinesis Data Streams(较新)

  • 保留 1 年
  • 消费者数量多
  • 使用 AWS Lambda、Kinesis Data Analytics、Kineis Data Firehose、AWS Glue Streaming ETL 进行处理…

DynamoDB 流

DynamoDB Global Tables

  • 使 DynamoDB 表可在多个区域中以低延迟进行访问
  • 主动-主动复制
  • 应用程序可以读取和写入任何区域的表
  • 必须启用 DynamoDB Streams 作为先决条件

DynamoDB – 生存时间 (TTL)

  • 在过期时间戳后自动删除项目
  • 使用案例:通过仅保留当前项目来减少存储的数据、遵守监管义务、Web 会话处理…

DynamoDB – 用于灾难恢复的备份

  • 使用时间点恢复 (PITR) 进行连续备份
    • 可选择在过去 35 天内启用
    • 时间点恢复到备份窗口内的任何时间
    • 恢复过程创建一个新表
  • 按需备份
    • 完整备份可长期保留,直至明确删除
    • 不影响性能或延迟
    • 可以在AWS Backup 中进行配置和管理(支持跨区域复制)
    • 恢复过程创建一个新表

DynamoDB – 与 Amazon S3 集成

  • 导出到S3(必须启用PITR)
    • 适用于过去 35 天内的任何时间点
    • 不影响表的读取容量
    • 在DynamoDB 之上执行数据分析
    • 保留快照以供审核
    • 在导入回 DynamoDB 之前对 S3 数据进行 ETL
    • 以DynamoDB JSON 或ION 格式导出
  • 导入到 S3
    • 导入 CSV、DynamoDB JSON 或 ION 格式
    • 不消耗任何写入容量
    • 创建一个新表
    • 导入错误记录在CloudWatch Logs 中


示例:构建无服务 API