Amazon EC2 Overview

亚马逊机器映像

启动 EC2 实例时,您配置的第一个设置是通过选择亚马逊机器映像 (AMI) 指定所需的操作系统。

在传统基础设施领域,服务器的启动过程包括从安装磁盘、驱动器或网络上的向导来安装操作系统。在 AWS 云中,安装操作系统不是您的责任。相反,它内置在您选择的 AMI 中。

AMI 包括操作系统、存储映射、架构类型、启动许可以及任何其他预先安装的软件应用程序。

AMI 和 EC2 实例之间的关系

EC2 实例是 AMI 中所定义内容的具体实例化(或版本),就像蛋糕是蛋糕配方的具体实例化一样。如果您熟悉软件开发,就能发现类和对象之间也存在这种关系。在这种情况下,AMI 是您建模和定义实例的方式,而 EC2 实例是您与之交互的实体,您可以在其中安装 Web 服务器,并向用户提供内容。

当您启动一个新实例,AWS 就会分配一个虚拟机,运行在管理程序上。然后,您选择的 AMI 就会复制到根设备卷上,这个卷上包含用于引导卷的映像。最后,您就会获得一台服务器,您可以连接到它,并在其上安装程序包和其他软件。在本示例中,您安装的是 Web 服务器以及正确配置的员工目录应用程序源代码。

AWS Basics1: 计算服务_服务器

使用 AMI 的一个好处是,它们可以重复使用。您可以选择基于 Linux 的 AMI,然后配置好运行应用程序所需的 HTTP 服务器、应用程序包和其他软件。如果要创建另一个具有相同配置的 EC2 实例,您可以创建新的 EC2 实例并进行配置,使之与第一个实例匹配。您也可以从正在运行的实例创建 AMI,然后使用 AMI 开启新实例。这样,新实例的配置将与当前实例完全相同,因为 AMI 中设置的配置是相同的。

AWS Basics1: 计算服务_Amazon_02

五种AMI

AWS Basics1: 计算服务_AWS_03

AWS实例类型

AWS 提供各种实例,这些实例的性能各不相同。有些实例提供的容量比其他实例多。要了解特定实例的容量详细信息,您应该查看实例类型。实例类型包括一个前缀,用于标识它们侧重优化的工作负载类型,然后是大小。例如,实例类型 c5n.xlarge 可分解成下面几个部分:

  • 第一个位置 – 第一个位置 c 表示实例系列。这表示这个实例属于计算优化型系列。
  • 第二个位置 – 第二个位置 5 表示实例的世代。这个实例属于第五代实例。
  • 句点前的其余字母 – 在这个示例中,n 表示其他属性,例如本地 NVMe 存储。
  • 句点后 – 句点后的 xlarge 表示实例大小。在本例中为 xlarge。

AWS Basics1: 计算服务_服务器_04

EC2 实例生命周期

EC2 实例从创建之刻起一直到终止,会在不同状态之间转换。

AWS Basics1: 计算服务_服务器_05

  • 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 内核(操作系统的中央核心)能够通过隔离来分离进程。当时,容器需要手动配置,操作起来很复杂。

随着开源软件社区的发展,容器也不断进步。如今,容器作为一种解决方案,用于解决传统计算的问题,包括当软件从一个计算环境转移到另一个计算环境时,如何让软件可靠地运行。

AWS Basics1: 计算服务_服务器_06

容器是一个标准化单元,其中打包了代码及其依赖项。这种程序包设计为可以在任何平台上可靠地运行,因为容器创建了自己的独立环境。使用容器,您可以将工作负载从一个位置移动到另一个位置,例如从开发环境移动到生产环境,或者从本地部署环境移动到云。

Docker 是容器化平台的一个示例。Docker 是一种常见的容器运行时,它简化了对容器隔离所需的整个操作系统堆栈的管理,包括联网和存储。Docker 有助于客户创建、打包、部署和运行容器。

虚拟机与容器的不同之处

AWS Basics1: 计算服务_TechEssential_07

与虚拟机 (VM) 相比,容器与部署容器的主机使用同一个操作系统和内核。

容器与部署容器的主机使用同一个操作系统和内核。但虚拟机带有自己的操作系统。每个虚拟机都必须维护一个操作系统的副本,这会导致一定程度的资源浪费。

容器更轻巧。容器的启动速度更快,几乎是瞬间的。如果所设计的应用程序在遇到 I/O 突增时需要快速扩展,这种启动时间上的差异会变得非常重要。

容器可以提供高速度,不过虚拟机可以提供操作系统的完整功能和更多资源,例如程序包安装、专用内核等。

编排容器

AWS 中的容器可以在 EC2 实例上运行。例如,您可能有一个大型实例,实例上运行了几个容器。虽然运行一个实例的管理工作并不复杂,但这样缺乏高可用性和可扩展性。许多公司和企业会跨多个可用区,在许多 EC2 实例上运行许多容器。

如果您尝试大规模管理计算资源,则应考虑以下方法:

  • 如何在实例上放置容器
    容器失败时会出现什么情况
    实例失败时会出现什么情况
  • 如何监控容器的部署

这个协调过程就由容器编排服务处理。AWS 提供两种容器编排服务:Amazon Elastic Container Service (Amazon ECS) 和 Amazon Elastic Kubernetes Service (Amazon EKS)。

使用 Amazon ECS 管理容器

AWS Basics1: 计算服务_Amazon_08

Amazon Elastic Container Service (Amazon ECS)

Amazon ECS 是一项端到端容器编排服务,可协助您启动新容器。使用 Amazon ECS,容器的定义在任务定义中完成,此任务定义用于运行单独的任务或服务中的任务。您可以选择在无服务器基础设施上运行任务和服务,而基础设施的管理则由名为 AWS Fargate 的另一项 AWS 服务来执行。此外,如果您希望对基础设施拥有更多的控制权,可以在自己管理的 EC2 实例集群上运行任务和服务。

AWS Basics1: 计算服务_TechEssential_09

如果您选择在 Amazon EC2 实例集群上运行和管理容器,并且想要获得更多控制权,则还需要在 EC2 实例上安装 Amazon ECS 容器代理。请注意,安装了容器代理的 EC2 实例通常称为容器实例。这个容器代理是开源的,负责就集群管理细节与 Amazon ECS 服务通信。您可以在 Linux 和 Windows AMI 上运行容器代理。 

AWS Basics1: 计算服务_服务器_10

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 结合使用

AWS Basics1: 计算服务_Amazon_11

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 Basics1: 计算服务_Amazon_12

采用无服务器计算,您可将时间用于打造具备独特竞争优势的应用程序,而不是花费在确保可用性以及扩展和管理服务器上。无服务器的定义有很多,但不外乎以下四个方面:

  • 无需预置或管理服务器。
  • 根据使用情况进行扩展。
  • 不需要为闲置资源付费。
  • 内置可用性和容错能力。

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 Basics1: 计算服务_服务器_13

AWS Fargate

AWS Fargate 是一种专为容器构建的无服务器计算引擎。AWS Fargate 负责扩展和管理基础设施,使开发人员能够专注于他们最擅长的工作,即应用程序开发。之所以能够做到这一点,是因为该服务会分配合适数量的计算资源。这使得您无需选择和管理 EC2 实例、集群容量以及扩展。Fargate 同时支持 Amazon ECS 和 Amazon EKS 架构,并通过设计提供工作负载隔离和增强的安全性。

在 AWS Lambda 上运行代码

如果您希望部署工作负载和应用程序,但又不想管理任何 EC2 实例或容器,您可以使用 Lambda。

AWS Basics1: 计算服务_Amazon_14

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。 

AWS Basics1: 计算服务_服务器_15

触发器

触发器描述 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

AWS Basics1: 计算服务_AWS_16

这里的人工指的是,对于商店中所有需要销售的每种新商品,都有人向数据库中添加一个新行。

AWS Basics1: 计算服务_AWS_17

AWS Basics1: 计算服务_Amazon_18

对这种场景,

我们传统做法是,启动一个EC2,编写一些代码,然后每个一段时间轮询为止中的电子表格,查看新上传的内容,在找到新文件的时候,去更新数据。

我们需要先做几个提问:

新库存信息添加到数据库中的频率是多少?A:每个季度更新一次,这就意味着更新频率不是很高。

解决方案

AWS Basics1: 计算服务_服务器_19

使用AWS Lambda,员工把库存表更新到S3,这个过程就会启动更新数据库的流程。

AWS Lambda提供触发器,S3可以作为触发器。