

# 设计适用于 Amazon ECS 的应用程序架构
<a name="application_architecture"></a>

您可以通过为应用程序创建任务定义来构建应用程序。任务定义包含用于定义有关应用程序的信息的参数，包括：
+ 要使用的容量，这决定了托管您的任务的基础设施。

  使用 EC2 容量提供程序时，您还可以选择实例类型。使用 Amazon ECS 托管实例容量提供程序时，您可以提供 Amazon ECS 管理计算容量的实例要求。对于某些实例类型（例如 GPU），您需要设置特定参数。有关更多信息，请参阅 [Amazon ECS 任务定义应用场景](use-cases.md)。
+ 容器映像，包含您的应用程序代码和运行应用程序代码所需的所有依赖项。
+ 在您的任务中用于容器的联网模式。

  联网模式决定了任务通过网络进行通信的方式。

  对于在 EC2 实例和 Amazon ECS 托管实例上运行的任务，有多种选择，但我们建议您使用 `awsvpc` 网络模式。您可以更好地控制您的应用程序相互之间以及与 VPC 内其他服务之间的通信方式，因此 `awsvpc` 网络模式可简化容器联网。

  对于在 Fargate 上运行的任务，您必须使用 `awsvpc` 网络模式。
+ 要用于您的任务的日志记录配置。
+ 在任务中用于容器的任何数据卷。

要获得任务定义参数的完整列表，请参阅 [Fargate 的 Amazon ECS 任务定义参数](task_definition_parameters.md)。

创建任务定义时，请遵循以下准则：
+ 将每个任务定义系列仅用于一个业务目的。

  如果您在同一个任务定义中将多种类型的应用程序容器分组在一起，则无法独立扩缩这些容器。例如，网站和 API 通常需要不同的扩缩模式。随着流量的增加，所需的 Web 容器数量可能会与 API 容器数量不同。如果这两个容器部署在同一个任务定义中，则每个任务会运行相同数量的 Web 容器和 API 容器。
+ 将每个应用程序版本与任务定义系列中的任务定义修订版进行匹配。

  在任务定义系列中，每个任务定义修订版代表特定容器映像设置的时间点快照。这类似于容器是一个快照，其中包含运行特定版本应用程序代码所需的所有组件。

  创建应用程序代码版本、容器映像标签和任务定义修订版之间的一对一映射。典型的发布过程涉及一个 git commit，它会变成一个标有 git commit SHA 的容器映像。然后，该容器映像标签将获得自己的 Amazon ECS 任务定义修订版。最后，对 Amazon ECS 服务进行了更新，以部署新的任务定义修订版。
+ 为每个任务定义系列使用不同的 IAM 角色。

  使用自己的 IAM 角色定义每个任务定义。实施这种做法，同时为每个业务组件提供自己的任务定义系列。通过实施这两种最佳实践，您可以限制每项服务对您 Amazon 账户中资源的访问权限。例如，您可以授予身份验证服务访问权限，以连接到您的密码数据库。同时，您可以确保只有您的订单服务才能访问信用卡付款信息。