Amazon EC2 Overview
亚马逊机器映像
启动 EC2 实例时,您配置的第一个设置是通过选择亚马逊机器映像 (AMI) 指定所需的操作系统。
在传统基础设施领域,服务器的启动过程包括从安装磁盘、驱动器或网络上的向导来安装操作系统。在 AWS 云中,安装操作系统不是您的责任。相反,它内置在您选择的 AMI 中。
AMI 包括操作系统、存储映射、架构类型、启动许可以及任何其他预先安装的软件应用程序。
AMI 和 EC2 实例之间的关系
EC2 实例是 AMI 中所定义内容的具体实例化(或版本),就像蛋糕是蛋糕配方的具体实例化一样。如果您熟悉软件开发,就能发现类和对象之间也存在这种关系。在这种情况下,AMI 是您建模和定义实例的方式,而 EC2 实例是您与之交互的实体,您可以在其中安装 Web 服务器,并向用户提供内容。
当您启动一个新实例,AWS 就会分配一个虚拟机,运行在管理程序上。然后,您选择的 AMI 就会复制到根设备卷上,这个卷上包含用于引导卷的映像。最后,您就会获得一台服务器,您可以连接到它,并在其上安装程序包和其他软件。在本示例中,您安装的是 Web 服务器以及正确配置的员工目录应用程序源代码。
使用 AMI 的一个好处是,它们可以重复使用。您可以选择基于 Linux 的 AMI,然后配置好运行应用程序所需的 HTTP 服务器、应用程序包和其他软件。如果要创建另一个具有相同配置的 EC2 实例,您可以创建新的 EC2 实例并进行配置,使之与第一个实例匹配。您也可以从正在运行的实例创建 AMI,然后使用 AMI 开启新实例。这样,新实例的配置将与当前实例完全相同,因为 AMI 中设置的配置是相同的。
五种AMI
AWS实例类型
AWS 提供各种实例,这些实例的性能各不相同。有些实例提供的容量比其他实例多。要了解特定实例的容量详细信息,您应该查看实例类型。实例类型包括一个前缀,用于标识它们侧重优化的工作负载类型,然后是大小。例如,实例类型 c5n.xlarge 可分解成下面几个部分:
- 第一个位置 – 第一个位置 c 表示实例系列。这表示这个实例属于计算优化型系列。
- 第二个位置 – 第二个位置 5 表示实例的世代。这个实例属于第五代实例。
- 句点前的其余字母 – 在这个示例中,n 表示其他属性,例如本地 NVMe 存储。
- 句点后 – 句点后的 xlarge 表示实例大小。在本例中为 xlarge。
EC2 实例生命周期
EC2 实例从创建之刻起一直到终止,会在不同状态之间转换。
- 1启动实例时,实例将进入待处理状态。当实例处于待处理状态时,账单尚未开始计费。在此阶段,实例正准备进入运行状态。在处于待处理状态时,AWS 执行设置实例所需的所有操作,例如将 AMI 内容复制到根设备并分配必要的联网组件。
- 2当您的实例处于正在运行状态时,它就可以使用了。这也是开始计费的阶段。一旦实例运行,您就可以对该实例执行其他操作,例如重启、终止、停止和停止-休眠。
- 3重启实例的操作与停止然后开启实例的操作不同。重启实例与重启操作系统差不多。实例保留其公有 DNS 名称 (IPv4) 以及私有和公有 IPv4 地址。IPv6 地址(如果适用)位于同一主机上,并保留其公有和私有 IP 地址及其实例存储卷上的所有数据。
- 4停止实例时,实例将依次进入正在停止状态和已停止状态。这就类似于关闭手提电脑的时候。如果实例使用 Amazon Elastic Block Store (Amazon EBS) 卷作为根设备,则可以停止然后开启该实例。当您停止然后开启实例时,您的实例会放置在新的底层物理服务器上。您的实例会保留私有 IPv4 地址,如果实例有 IPv6 地址,也会保留 IPv6 地址。当您让实例进入停止-休眠状态时,实例会进入已停止状态,但会将最新信息或内容保存到内存中,这样开启流程就会运行得更快。
- 5当您终止实例时,实例存储将被擦除,并且您会丢失主机的公有 IP 地址和私有 IP 地址。实例终止意味着您无法再访问这台虚拟机。一旦实例状态更改为正在关闭或已终止,该实例即不再产生费用。
停止和停止-休眠之间的区别
当您停止实例时,它将进入正在停止状态,直到进入已停止状态。在您停止实例后,AWS 不会向您收取实例的使用费或数据传输费,但仍会对所有 Amazon EBS 卷收取存储费用。当实例处于已停止状态时,您可以修改一些属性,例如实例类型。停止实例时,实例内存 (RAM) 中的数据将丢失。
停止-休眠实例时,Amazon EC2 会向操作系统发出执行休眠(挂起到磁盘)的信号,这会将实例内存 (RAM) 中的内容保存到 EBS 根卷。仅在启用休眠且实例满足休眠先决条件时,您才能使实例休眠。
定价
通过 Amazon EC2 降低成本的方法之一是,根据应用程序的运行方式选择合适的定价选项。AWS 会提供多种定价选项以应对不同的工作负载场景。
要了解某个类别,请选择相应的选项卡。
ondemand, RI,SP,Spot,专用主机
资源
有关更多信息,请参阅以下资源:
AWS 用户指南:Amazon EC2:实例生命周期(opens in a new tab)
- AWS 用户指南:休眠先决条件(opens in a new tab)
- AWS 网站:Amazon EC2 定价(opens in a new tab)
- AWS 网站:Amazon EC2 按需定价(opens in a new tab)
- AWS 网站:Amazon EC2 Spot 实例定价(opens in a new tab)
- AWS 网站:Amazon EC2 预留实例定价
Amazon容器服务
AWS 提供了广泛的计算产品,让您能够灵活地根据任务选择合适的工具。计算的三个主要类别是虚拟机 (VM)、容器和无服务器。没有什么计算服务是万能的,因为服务因需求而异。
关键在于了解每个选项提供的内容。然后,您可以为自己的使用案例构建合适的云架构。在本节中,您将了解容器以及如何运行容器。
容器可以托管各种不同的工作负载,包括 Web 应用程序、直接迁移、分布式应用程序,以及简化开发、测试和生产环境。
容器
虽然容器通常被称为一种新技术,但这个想法始于二十世纪七十年代,某些 UNIX 内核(操作系统的中央核心)能够通过隔离来分离进程。当时,容器需要手动配置,操作起来很复杂。
随着开源软件社区的发展,容器也不断进步。如今,容器作为一种解决方案,用于解决传统计算的问题,包括当软件从一个计算环境转移到另一个计算环境时,如何让软件可靠地运行。
容器是一个标准化单元,其中打包了代码及其依赖项。这种程序包设计为可以在任何平台上可靠地运行,因为容器创建了自己的独立环境。使用容器,您可以将工作负载从一个位置移动到另一个位置,例如从开发环境移动到生产环境,或者从本地部署环境移动到云。
Docker 是容器化平台的一个示例。Docker 是一种常见的容器运行时,它简化了对容器隔离所需的整个操作系统堆栈的管理,包括联网和存储。Docker 有助于客户创建、打包、部署和运行容器。
虚拟机与容器的不同之处
与虚拟机 (VM) 相比,容器与部署容器的主机使用同一个操作系统和内核。
容器与部署容器的主机使用同一个操作系统和内核。但虚拟机带有自己的操作系统。每个虚拟机都必须维护一个操作系统的副本,这会导致一定程度的资源浪费。
容器更轻巧。容器的启动速度更快,几乎是瞬间的。如果所设计的应用程序在遇到 I/O 突增时需要快速扩展,这种启动时间上的差异会变得非常重要。
容器可以提供高速度,不过虚拟机可以提供操作系统的完整功能和更多资源,例如程序包安装、专用内核等。
编排容器
AWS 中的容器可以在 EC2 实例上运行。例如,您可能有一个大型实例,实例上运行了几个容器。虽然运行一个实例的管理工作并不复杂,但这样缺乏高可用性和可扩展性。许多公司和企业会跨多个可用区,在许多 EC2 实例上运行许多容器。
如果您尝试大规模管理计算资源,则应考虑以下方法:
- 如何在实例上放置容器
容器失败时会出现什么情况
实例失败时会出现什么情况 - 如何监控容器的部署
这个协调过程就由容器编排服务处理。AWS 提供两种容器编排服务:Amazon Elastic Container Service (Amazon ECS) 和 Amazon Elastic Kubernetes Service (Amazon EKS)。
使用 Amazon ECS 管理容器
Amazon Elastic Container Service (Amazon ECS)
Amazon ECS 是一项端到端容器编排服务,可协助您启动新容器。使用 Amazon ECS,容器的定义在任务定义中完成,此任务定义用于运行单独的任务或服务中的任务。您可以选择在无服务器基础设施上运行任务和服务,而基础设施的管理则由名为 AWS Fargate 的另一项 AWS 服务来执行。此外,如果您希望对基础设施拥有更多的控制权,可以在自己管理的 EC2 实例集群上运行任务和服务。
如果您选择在 Amazon EC2 实例集群上运行和管理容器,并且想要获得更多控制权,则还需要在 EC2 实例上安装 Amazon ECS 容器代理。请注意,安装了容器代理的 EC2 实例通常称为容器实例。这个容器代理是开源的,负责就集群管理细节与 Amazon ECS 服务通信。您可以在 Linux 和 Windows AMI 上运行容器代理。
Amazon ECS 容器实例启动并运行后,您可以执行的操作包括但不限于:
- 启动和停止容器
- 获取集群状态
- 缩减和扩展
- 在集群中计划容器的放置
- 分配权限
- 满足可用性要求
要准备在 Amazon ECS 上运行应用程序,您需要创建任务定义。任务定义是一个 JSON 格式的文本文件,用于描述一个或多个容器。任务定义类似于蓝图,描述了运行容器所需的资源,例如 CPU、内存、端口、映像、存储和联网信息。
以下是一个简单的任务定义,您可以在公司目录应用程序中使用。在本示例中,容器在 Nginx Web 服务器上运行。
{
"family": "webserver",
"containerDefinitions": [ {
"name": "web",
"image": "nginx",
"memory": "100",
"cpu": "99"
} ],
"requiresCompatibilities": [ "FARGATE" ],
"networkMode": "awsvpc",
"memory": "512",
"cpu": "256"
}
将 Kubernetes 与 Amazon EKS 结合使用
Amazon Elastic Kubernetes Service (Amazon EKS)
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务。由于在设计中将软件的开发和运维融合在一起,Kubernetes 创造了一个快速增长的生态系统,在市场上非常受欢迎,而且非常成熟。
如果您已在使用 Kubernetes,则可以使用 Amazon EKS 在 AWS 云中编排工作负载。Amazon EKS 是一项托管式服务,您可以使用该服务在 AWS 上运行 Kubernetes,而无需安装、运营和维护自己的 Kubernetes 控制平面或节点。Amazon EKS 与 Amazon ECS 在概念上有相似之处,但仍存在以下区别:
- 在 Amazon ECS 中,运行容器的机器是 EC2 实例,实例上需要安装和配置 ECS 代理才能运行和管理容器。这个实例称为容器实例。在 Amazon EKS 中,运行容器的机器称为工作节点或 Kubernetes 节点。
- ECS 容器称为任务。EKS 容器称为 Pod。
- Amazon ECS 运行在 AWS 原生技术上。Amazon EKS 运行在 Kubernetes 上。
如果您在 Kubernetes 上运行容器,并希望有一个高级编排解决方案,能够为您的基础设施管理提供简便性、高可用性和精细控制,那么 Amazon EKS 是合适的工具。
资源
有关更多信息,请参阅以下资源:
AWS 网站:AWS 上的容器(opens in a new tab)
外部网站:Docker:使用容器来构建、分享和运行应用程序(opens in a new tab)
AWS 网站:Amazon Elastic Container Service (Amazon ECS)(opens in a new tab)
外部网站:Github:Amazon ECS 代理(opens in a new tab)
AWS 开发人员指南:Amazon ECS 容器实例(opens in a new tab)
外部网站:Coursera 课程:在 AWS 上构建容器化应用程序(opens in a new tab)
AWS 网站:Amazon Elastic Kubernetes Service (EKS)(opens in a new tab)
AWS 用户指南:Amazon EKS 用户指南
AWS 无服务介绍
消除无差别的繁重工作
如果您在 Amazon EC2 上运行代码,AWS 将负责物理硬件。您仍需负责逻辑控制,例如来宾操作系统、安全和修补、联网、安全性和扩展。
如之前的“容器服务”课程中所说,您可以选择在 Amazon ECS 和 Amazon EKS 上运行和管理容器,从而获得更多的控制力。采取这种做法,AWS 仍负责大部分的容器管理工作,例如跨 EC2 实例部署容器以及管理容器集群。但是,在 Amazon EC2 上运行 Amazon ECS 和 Amazon EKS 时,您仍需负责维护底层 EC2 实例。
有没有办法可以避免一部分这种无差别的繁重工作? 有! 如果您希望部署工作负载和应用程序,同时不想管理任何 EC2 实例,您可以使用 AWS 上的无服务器计算来做到这一点。
踏上无服务器之路
采用无服务器计算,您可将时间用于打造具备独特竞争优势的应用程序,而不是花费在确保可用性以及扩展和管理服务器上。无服务器的定义有很多,但不外乎以下四个方面:
- 无需预置或管理服务器。
- 根据使用情况进行扩展。
- 不需要为闲置资源付费。
- 内置可用性和容错能力。
AWS 针对应用程序堆栈的全部三个层都开发了无服务器服务。在接下来的课程中,我们将介绍 AWS Fargate 和 AWS Lambda 这两项服务。
利用 AWS Fargate 探索无服务器容器
Fargate 对 EC2 实例进行抽象化处理,因此您无需管理底层计算基础设施。但是,在 Fargate 中,您可以使用所有相同的 Amazon ECS 概念、API 和 AWS 集成。该服务与 IAM 和 Amazon Virtual Private Cloud (Amazon VPC) 原生集成。通过与 Amazon VPC 的原生集成,您可以在网络中启动 Fargate 容器并控制与应用程序的连接。
AWS Fargate
AWS Fargate 是一种专为容器构建的无服务器计算引擎。AWS Fargate 负责扩展和管理基础设施,使开发人员能够专注于他们最擅长的工作,即应用程序开发。之所以能够做到这一点,是因为该服务会分配合适数量的计算资源。这使得您无需选择和管理 EC2 实例、集群容量以及扩展。Fargate 同时支持 Amazon ECS 和 Amazon EKS 架构,并通过设计提供工作负载隔离和增强的安全性。
在 AWS Lambda 上运行代码
如果您希望部署工作负载和应用程序,但又不想管理任何 EC2 实例或容器,您可以使用 Lambda。
AWS Lambda
借助 Lambda,您可以运行代码,无需预置或管理服务器。您可以运行几乎任何类型的应用程序或后端服务的代码。这包括数据处理、实时数据流处理、机器学习、WebSockets、IoT 后端、移动后端以及 Web 应用程序,比如您的员工目录应用程序!
Lambda 在具备高可用性的计算基础设施中运行您的代码,无需用户进行管理。您只需使用 Lambda 支持的一种语言编写出源代码然后上传,Lambda 就会负责运行和扩展代码所需的所有工作,并且实现高可用性。无需管理服务器。您可以获得连续的扩展能力、亚秒级的计量精度,以及稳定的性能。
Lambda 工作原理
Lambda 函数是 AWS Lambda 的基础构件。您可以选择使用 Lambda 控制台、Lambda API、AWS CloudFormation 或 AWS Serverless Application Model (AWS SAM) 来配置 Lambda 函数。可以使用 Lambda API 直接调用函数,也可以配置 AWS 服务或资源来调用函数,用于响应事件。
如需详细了解 Lambda 的概念,请分别展开查看以下七个类别。
函数
–
函数是您可以调用以便在 Lambda 中运行代码的资源。Lambda 运行您函数的实例,用于处理事件。在创建 Lambda 函数时,您可以通过多种方法来创作函数:
- 从头开始创建函数。
- 使用 AWS 提供的蓝图。
- 选择要为函数部署的容器映像。
- 浏览 AWS Serverless Application Repository。
触发器
–
触发器描述 Lambda 函数应在什么时候运行。触发器将 Lambda 函数与其他服务和事件源映射集成起来。这样,您就可以运行 Lambda 函数来响应特定 API 调用,或者通过从数据流或队列中读取项目来触发函数。这增加了您响应控制台中事件的能力,而无需执行手动操作。
事件
–
事件是 JSON 格式的文档,包含 Lambda 函数要处理的数据。运行时会将事件转换为对象,然后传递给函数代码。调用函数时,您需要确定事件的结构和内容。
应用程序环境
–
应用程序环境向 Lambda 函数提供安全且隔离的运行时环境。应用程序环境管理着运行函数所需的流程和资源。
部署程序包
–
您可以使用部署程序包来部署 Lambda 函数代码。Lambda 支持两种类型的部署程序包:
- .zip 归档文件 – 这种程序包中包含您的函数代码及其依赖项。Lambda 为函数提供操作系统和运行时。
- 容器映像 – 容器映像与 Open Container Initiative (OCI) 规范兼容。您可以将函数代码和依赖项添加到映像中。您还必须包括操作系统和 Lambda 运行时。
运行时
–
运行时提供特定于语言的环境,该环境运行在应用程序环境中。创建 Lambda 函数时,您需要指定运行代码的运行时。您可以使用内置的运行时,例如 Python、Node.js、Ruby、Go、Java 或 .NET Core。或者,可以实施 Lambda 函数在自定义运行时上运行。
Lambda 函数处理程序
–
AWS Lambda 函数处理程序是函数代码中处理事件的方法。当您调用函数时,Lambda 就会运行处理程序方法。在处理程序退出或返回响应后,即可用于处理另一个事件。
在 Python 中创建函数处理程序时,您可以使用以下常规语法。
def handler_name (event, context):
...
return some_value
计费粒度
借助 Lambda,您可以运行代码,无需预置或管理服务器,并且只需为所用的资源付费。您需要按代码调用(请求)次数和代码运行时间(即持续时间,计费单位为毫秒 (ms))支付费用。
AWS 的持续时间计费单位是毫秒,且没有最短运行时间。采用这种定价模式,运行执行时间非常短的函数(例如持续时间不到 100 毫秒的函数或低延迟 API)是非常经济实惠的。
资源
有关更多信息,请参阅以下资源:
- AWS 网站:通过无服务器架构构建应用程序(opens in a new tab)
- AWS Blog:组织大型无服务器应用程序的最佳实践(opens in a new tab)
- AWS 开发人员指南:配置 AWS Lambda 函数(opens in a new tab)
- AWS Blog:无服务器架构师应该了解的十大事项(opens in a new tab)
- AWS Blog:使用 Amazon S3、AWS Lambda 和 Amazon API Gateway 实时调整图像大小(opens in a new tab)
- AWS Blog:AWS Lambda 新特性 – 1 毫秒计费粒度进一步节省成本
如何选择合适的计算服务:
场景1
这里的人工指的是,对于商店中所有需要销售的每种新商品,都有人向数据库中添加一个新行。
对这种场景,
我们传统做法是,启动一个EC2,编写一些代码,然后每个一段时间轮询为止中的电子表格,查看新上传的内容,在找到新文件的时候,去更新数据。
我们需要先做几个提问:
新库存信息添加到数据库中的频率是多少?A:每个季度更新一次,这就意味着更新频率不是很高。
解决方案
使用AWS Lambda,员工把库存表更新到S3,这个过程就会启动更新数据库的流程。
AWS Lambda提供触发器,S3可以作为触发器。