

# 为 Amazon ECS 构建您的解决方案
<a name="ecs-configuration"></a>

您必须将应用程序设计为能够在*容器*上运行。容器是软件开发的标准化单位，它包含软件应用程序运行需要的所有内容。这包括相关代码、运行时、系统工具和系统库。从称为*映像*的只读模板中创建容器。容器映像是一个包含您的应用程序及其依赖项的静态构件。通常通过 Dockerfile 进行构建映像。Dockerfile 是一个纯文本文件，其中包含构建容器的说明。构建完成后，这些映像将存储在可从中下载它们的*注册表*，例如 Amazon ECR。

创建并存储映像后，创建 Amazon ECS 任务定义。*任务定义*是应用程序的蓝图。它是描述构成应用程序的参数和一个或多个容器的 JSON 格式的文本文件。例如，您可以使用它指定操作系统的映像和参数、要使用哪些容器、要为应用程序打开哪些端口以及任务中的容器应使用哪些数据卷。可用于任务定义的特定参数取决于您的特定应用程序需求。

定义任务定义后，将其部署为集群上的服务或任务。*集群*是在注册到集群的容量基础设施上运行的任务或服务的逻辑分组。

*任务* 是集群内的任务定义的实例化。您可以运行独立任务，也可以将任务作为服务的一部分运行。您可以使用 Amazon ECS *服务*在 Amazon ECS 集群中同时运行和维护所需数量的任务。它的工作原理是，如果您的任何任务出于任何原因失败或停止，Amazon ECS 服务调度器将根据您的任务定义启动另一个实例。这样做是为了替换它，从而保持服务中所需的任务数量。

*容器代理*在 Amazon ECS 集群内的每个容器实例上运行。代理向 Amazon ECS 发送有关容器当前正在运行的任务和资源使用率的信息。在接收来自 Amazon ECS 的请求时启动和停止任务。

部署任务或服务后，可以使用以下任一工具来监控部署和应用程序：
+ CloudWatch
+ 运行时监控

## 容量
<a name="ecs-configuration-capacity"></a>

容量是容器运行的基础设施。Amazon ECS 为您的集群提供三种基础设施类型：
+ Amazon ECS 托管实例：AWS 全面管理您的账户中运行的底层 Amazon EC2 实例，包括预置、修补和扩展。此选项在性能、成本效益和操作简便性之间实现了最佳平衡。
+ 无服务器（Fargate）：只需为任务使用的资源付费，无需管理任何基础设施。非常适合工作负载变化无常且需要快速入门的情况。
+ Amazon EC2 实例：您可以直接管理底层 Amazon EC2 实例，包括实例选择、配置和维护。

在以下情况下，请使用 Amazon ECS 托管实例：
+ 您希望获得 Fargate 的简单性，同时更好地控制底层基础设施。
+ 您需要可预测的性能和成本优化。
+ 您希望 AWS 处理基础设施管理，同时保持灵活性。

在以下情况下，请使用 Fargate：
+ 您希望专注于您的应用程序，而不管理基础设施。
+ 您的工作负载变化无常或不可预测。
+ 您刚开始使用容器，想要最简单的部署选项。

在以下情况下，请使用 Amazon EC2 实例：
+ 您需要专门的硬件要求（GPU 加速、高性能计算）。
+ 您需要预留容量或特定实例类型。
+ 您需要特权功能或自定义 AMI。

在您创建集群时指定基础设施。您还可以在注册任务定义时指定基础设施类型。任务定义将基础设施称为“启动类型”。您也可以使用容量提供程序。

## 服务端点
<a name="ecs-configuration-service-endpoint"></a>

服务端点是 Amazon ECS 入口点的 URL，您可以使用它通过 Internet 协议版本 4（IPv4）或 Internet 协议版本 6（IPv6）以编程方式连接到服务。默认情况下，您以编程方式连接到 Amazon ECS 的请求使用仅支持 IPv4 请求的服务端点。要使用 IPv4 或 IPv6 请求以编程方式与 Amazon ECS 连接，您可以使用双堆栈端点。有关使用双堆栈端点的信息，请参阅[使用 Amazon ECS 双堆栈端点](dual-stack-endpoint.md)。

## Networking
<a name="ecs-configuration-networking"></a>

AWS 资源是在子网中创建的。当您使用 EC2 实例时，Amazon ECS 会在您在创建集群时指定的子网中启动实例。您的任务在实例子网中运行。对于 Fargate 或本地虚拟机，您可以在运行任务或创建服务时指定子网。

根据您的应用程序，子网可以是私有子网或公有子网，并且子网可以位于任何以下 AWS 资源中：
+ 可用区
+ Local Zones
+ Wavelength 区域
+ AWS 区域
+ AWS Outposts 

有关更多信息，请参阅 [Amazon ECS 应用程序位于共享子网、本地区和 Wavelength 区中](cluster-regions-zones.md) 或 [AWS Outposts 上的 Amazon Elastic Container Service](using-outposts.md)。

您可以使用以下方法之一将应用程序连接到互联网：
+ 具有互联网网关的公有子网

  当您的公共应用程序需要大量带宽或最小延迟时，请使用公有子网。适用场景包括视频流和游戏服务。
+ 具有 NAT 网关的私有子网

   如果要保护容器免于外部直接访问，则请使用私有子网。适用场景包括支付处理系统或存储用户数据和密码的容器。
+ AWS PrivateLink

  使用 AWS PrivateLink 在 VPC、AWS 服务和您的本地网络之间建立私有连接，而不会将流量外泄至公共互联网。

## 功能访问
<a name="ecs-configuration-features"></a>

您可以使用 Amazon ECS 账户设置来访问以下功能：
+ Container Insights

  CloudWatch Container Insights 从容器化应用程序和微服务中收集、聚合和汇总指标与日志。指标包括资源的使用率，如 CPU、内存、磁盘和网络。
+ `awsvpc` 中继

  对于某些 EC2 实例类型，您可以在新启动的容器实例上使用其他网络接口（ENI）。
+ 标记授权

  用户必须具有创建资源的操作的权限，例如 `ecsCreateCluster`。如果在资源创建操作中指定了标签，则 AWS 会对 `ecs:TagResource` 操作执行额外的授权，以验证用户或角色是否具备创建标签的权限。
+ Fargate FIPS-140 合规性

  Fargate 支持美国联邦信息处理标准（FIPS-140），其中规定了对保护敏感信息的加密模块的安全要求。它是美国和加拿大政府的现行标准，适用于需要符合《联邦信息安全管理法》（FISMA）或联邦风险和授权管理计划（FedRAMP）的系统。
+ Fargate 任务停用时间变更

  您可以配置对停用 Fargate 任务进行修补之前的等待时间。
+ 双堆栈 VPC

  允许任务通过 IPv4、IPv6 或两者进行通信。
+ Amazon 资源名称（ARN）格式

  某些功能（例如标记授权）需要新的 Amazon 资源名称（ARN）格式。

有关更多信息，请参阅 [通过账户设置访问 Amazon ECS 功能](ecs-account-settings.md)。

## IAM 角色
<a name="ecs-configuration-iam-roles"></a>

IAM 角色是可在账户中创建的一种具有特定权限的 IAM 身份。在 Amazon ECS 中，您可以创建角色来授予对 Amazon ECS 资源（例如容器或服务）的权限。

有些 Amazon ECS 功能需要角色。有关更多信息，请参阅 [适用于 Amazon ECS 的 IAM 角色](ecs-iam-role-overview.md)。

## 日志记录
<a name="monitor-logging"></a>

日志记录和监控是维护 Amazon ECS 工作负载的可靠性、可用性和性能的重要方面。以下选项可用：
+ Amazon CloudWatch 日志 – 将日志路由到 Amazon CloudWatch
+ FireLens for Amazon ECS – 将日志路由到 AWS 服务或 AWS Partner Network 目的地，以进行日志存储和分析。AWS Partner Network 是一个由合作伙伴组成的全球社区，它利用计划、专业知识和资源来构建、营销和销售客户产品。

## 容器映像最佳实践
<a name="ecs-configuration-container-best-practices-summary"></a>

下面是 Amazon ECS 容器映像的关键原则：
+ 在映像中包含所有依赖项
+ 每个容器运行一个进程
+ 处理 `SIGTERM` 以进行正常关闭
+ 将日志写入 `stdout` 和 `stderr`
+ 使用唯一的标签，避免在生产环境中使用 `latest`