

# Amazon ECS EC2 容器实例
<a name="ecs-agent-versions"></a>

Amazon ECS 代理是在向您的集群注册的每个容器实例上运行的进程。它可以促进您的容器实例与 Amazon ECS 之间的通信。

**注意**  
在 Linux 容器实例上，代理容器会挂载顶级目录，例如 `/lib`、`/lib64` 和 `/proc`。这对于 ECS 的各种特征和功能是必需的，例如 Amazon EBS 卷、`awsvpc` 网络模式、Amazon ECS Service Connect 和适用于 Amazon ECS 的 FireLens 等。

每个 Amazon ECS 容器代理版本都支持不同的功能集并提供了针对早期版本的错误修复。如果可能，我们始终建议使用最新版本的 Amazon ECS 容器代理。要将您的容器代理更新至最新版本，请参阅[更新 Amazon ECS 容器代理](ecs-agent-update.md)。

Amazon ECS 容器代理程序包含 `amazon-ecs-pause` 映像。Amazon ECS 使用此映像来执行使用 `awsvpc` 网络模式的任务。

要查看每个代理版本包含了哪些功能和增强功能，请参阅 [https://github.com/aws/amazon-ecs-agent/releases](https://github.com/aws/amazon-ecs-agent/releases)。

**重要**  
可靠指标的最低 Docker 版本是 Docker 版本 `v20.10.13` 及更高版本，该版本包含在经 Amazon ECS 优化的 AMI `20220607` 及更高版本中。  
Amazon ECS 代理版本 `1.20.0` 及更高版本已弃用对早于 `18.01.0` 的 Docker 版本的支持。

## 生命周期
<a name="container-lifecycle"></a>

当 Amazon ECS 容器代理将 Amazon EC2 实例注册到集群时，Amazon EC2 容器实例将其状态报告为 `ACTIVE`，并将其代理连接状态报告为 `TRUE`。此容器实例可接受运行任务请求。

如果停止（而不是终止）容器实例，则状态将保持为 `ACTIVE`，但代理连接状态将在几分钟内转换为 `FALSE`。在容器实例上运行的任何任务将停止。如果您再次启动容器实例，则容器代理将使用 Amazon ECS 服务重新连接，并且您能够在实例上再次运行任务。

如果将容器实例的状态更改为 `DRAINING`，则新任务不会置于该容器实例中，并将尽可能删除在此容器实例上运行的所有服务任务，以便执行系统更新。有关更多信息，请参阅 [耗尽 Amazon ECS 容器实例](container-instance-draining.md)。

如果您注销或终止某个容器实例，则该容器实例状态将立即更改为 `INACTIVE`，而且在您列出您的容器实例时将不再报告该容器实例。但您仍可以在终止后的 1 小时内描述容器实例。1 小时后，该实例描述将不再可用。

您可以手动耗尽实例，也可以构建自动扩缩组生命周期挂钩以将实例状态设置为 `DRAINING`。有关自动扩缩生命周期挂钩的更多信息，请参阅 [Amazon EC2 Auto Scaling 生命周期挂钩](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)。

## Docker 支持
<a name="docker-support"></a>

Amazon ECS 支持在 Amazon Linux 上发布的最近两个主要版本的 Docker。目前，其中包括 Docker 20.10.x 和 Docker 25.x。

Amazon ECS 的最低所需 Docker 版本可以在 GitHub 上的 [Amazon ECS 代理规范文件](https://github.com/aws/amazon-ecs-agent/blob/dev/packaging/amazon-linux-ami-integrated/ecs-agent.spec#L53)中找到。

使用 Amazon ECS 优化版 AMI 时，Docker 已预装，并配置为与 Amazon ECS 容器代理配合使用。AMI 包括经 Amazon ECS 测试和支持的 Docker 版本。

**注意**  
虽然 Amazon ECS 支持多个 Docker 版本，但为了获得最佳兼容性和支持，我们建议使用 Amazon ECS 优化版 AMI 附带的 Docker 版本。

## 经 Amazon ECS 优化的 AMI
<a name="ecs-optimized-ami"></a>

有关经 Amazon ECS 优化的 AMI 的更多信息，请参阅经 [Amazon ECS 优化的 Linux AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html)。

## 附加信息
<a name="additional-information"></a>

以下页面提供了有关更改的更多信息：
+ GitHub 上的 [Amazon ECS 代理变更日志](https://github.com/aws/amazon-ecs-agent/blob/master/CHANGELOG.md)
+ [Amazon Linux 2 发行说明](https://docs.aws.amazon.com/AL2/latest/relnotes/relnotes-al2.html)。
+ Docker 文档中的 [Docker 引擎版本注释](https://docs.docker.com/engine/release-notes/27/)
+ NVIDIA 文档中的 [NVIDIA 驱动程序文档](https://docs.nvidia.com/datacenter/tesla/index.html)

# Amazon ECS 容器代理配置
<a name="ecs-agent-config"></a>

**适用于**：EC2 实例

Amazon ECS 容器代理支持很多配置选项，其中大多数选项可通过环境变量来设置。

如果容器实例是使用经 Amazon ECS 优化的 AMI 的 Linux 变体启动的，则可以在 `/etc/ecs/ecs.config` 文件中设置这些环境变量，然后重新启动代理。您还可以在启动时将这些配置变量写入到具有 Amazon EC2 用户数据的容器实例。有关更多信息，请参阅 [引导启动 Amazon ECS Linux 容器实例以传递数据](bootstrap_container_instance.md)。

如果容器实例是使用经 Amazon ECS 优化的 AMI 的 Windows 变体启动的，则可以使用 PowerShell SetEnvironmentVariable 命令设置这些环境变量，然后重新启动代理。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[在启动包含用户数据输入的 EC2 实例时运行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)和 [引导启动 Amazon ECS Windows 容器实例以传递数据](bootstrap_windows_container_instance.md)。

如果要手动启动 Amazon ECS 容器代理（对于没有经 Amazon ECS 优化的 AMI），则可以在用于启动代理的 **docker run** 命令中使用这些环境变量。将这些变量与语法 `--env=VARIABLE_NAME=VARIABLE_VALUE` 结合使用。对于敏感信息（如私有存储库的身份验证凭证），您应该将代理环境变量存储在一个文件中并利用 `--env-file path_to_env_file` 选项一次性将它们传递完。您可以使用以下命令来添加变量。

```
sudo systemctl stop ecs
sudo vi /etc/ecs/ecs.config 
# And add the environment variables with VARIABLE_NAME=VARIABLE_VALUE format.
sudo systemctl start ecs
```

## 使用主机 PID 命名空间运行 Amazon ECS 代理
<a name="ecs-agent-pid-namespace"></a>

默认情况下，Amazon ECS 代理使用自己的 PID 命名空间运行。在以下配置中，您可以将 Amazon ECS 代理配置为使用主机 PID 命名空间运行：
+ SELinux 强制模式已启用。
+ Docker 的 SELinux 安全策略设置为 true。

您可以通过在 `/etc/ecs/ecs.config` 文件中将 `ECS_AGENT_PID_NAMESPACE_HOST` 环境变量设置为 `true` 来配置此行为。启用此变量后，`ecs-init` 将使用主机的 PID 命名空间（`--pid=host`）启动 Amazon ECS 代理容器，从而允许代理在 SELinux 强制执行环境中正确引导自身。此功能支持 Amazon ECS 代理版本 `1.94.0` 及更高版本。

要启用此功能，请将以下行添加到您的 `/etc/ecs/ecs.config` 文件：

```
ECS_AGENT_PID_NAMESPACE_HOST=true
```

进行此更改后，请重启 Amazon ECS 代理以使更改生效：

```
sudo systemctl restart ecs
```

如果启用了 SELinux 强制执行模式并且将 Docker 安全策略设置为 true，即使设置了 `ECS_AGENT_PID_NAMESPACE_HOST=true`，以下功能也将不起作用。
+ Amazon ECS Exec
+ Amazon EBS 任务附加
+ Service Connect
+ 适用于 Amazon ECS 的 FireLens

## 可用参数
<a name="ecs-agent-availparam"></a>

有关可用的 Amazon ECS 容器代理配置参数的信息，请参阅 GitHub 上的 [Amazon ECS 容器代理](https://github.com/aws/amazon-ecs-agent/blob/master/README.md)。

# 将 Amazon ECS 容器实例配置存储在 Amazon S3 中
<a name="ecs-config-s3"></a>

Amazon ECS 容器代理配置通过环境变量来控制。经 Amazon ECS 优化的 AMI Linux 变体将在容器代理启动时在 `/etc/ecs/ecs.config` 中查找这些变量，并相应地配置代理。非敏感变量（如 `ECS_CLUSTER`）可在启动时通过 Amazon EC2 用户数据传递到容器实例并写入到此文件，且不会造成任何后果。但是，其他敏感信息（如您的 AWS 凭证或 `ECS_ENGINE_AUTH_DATA` 变量）不应通过用户数据传递到某个实例或以它们能够在 `.bash_history` 文件中显示的方式写入到 `/etc/ecs/ecs.config`。

将配置信息存储在 Amazon S3 中的私有存储桶中并向您的容器实例 IAM 角色授予只读访问权限，这是一个允许在启动时配置容器实例的安全方便的方法。可以将 `ecs.config` 文件的副本存储在私有存储桶中。然后，您可以使用 Amazon EC2 用户数据安装 AWS CLI，并在实例启动时将配置信息复制到 `/etc/ecs/ecs.config`。

**要在 Amazon S3 中储存 `ecs.config` 文件**

1. 您必须向容器实例角色（**ecsInstanceRole**）授予只读访问 Amazon S3 的权限。为此，您可以将 **AmazonS3ReadOnlyAccess** 分配给 `ecsInstanceRole` 角色。有关如何将策略附加到角色的信息，请参阅《AWS Identity and Access Management 用户指南》**中的[更新角色权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-permissions.html)

1. 使用以下格式创建包含有效 Amazon ECS 代理配置变量的 `ecs.config` 文件。此示例将配置私有注册表身份验证。有关更多信息，请参阅 [在 Amazon ECS 中使用非 AWS 容器映像](private-auth.md)。

   ```
   ECS_ENGINE_AUTH_TYPE=dockercfg
   ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example.com"}}
   ```
**注意**  
有关可用 Amazon ECS 代理配置变量的完整列表，请参阅 GitHub 上的 [Amazon ECS 容器代理](https://github.com/aws/amazon-ecs-agent/blob/master/README.md)。

1. 要存储您的配置文件，请在 Amazon S3 中创建私有存储桶。有关更多信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

1. 将 `ecs.config` 文件上传到 S3 存储桶。有关更多信息，请参阅《Amazon Simple Storage Service 开发人员指南》**中的[上传对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。

**在启动时从 Amazon S3 加载 `ecs.config` 文件**

1. 完成本节中的上述过程以允许 Amazon S3 对您的容器实例进行只读访问，并将 `ecs.config` 文件存储在私有 S3 存储桶中。

1. 启动新的容器实例，并在 EC2 用户数据中使用以下示例脚本。脚本将安装 AWS CLI 并将您的配置文件复制到 `/etc/ecs/ecs.config`。有关更多信息，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。

   ```
   #!/bin/bash
   yum install -y aws-cli
   aws s3 cp s3://your_bucket_name/ecs.config /etc/ecs/ecs.config
   ```

# 安装 Amazon ECS 容器代理
<a name="ecs-agent-install"></a>

如果您想向 Amazon ECS 集群注册 Amazon EC2 实例，并且该实例不使用基于经 Amazon ECS 优化的 AMI 的 AMI，您可以使用以下过程手动安装 Amazon ECS 容器代理。为此，您可以从区域性 Amazon S3 存储桶之一或 Amazon Elastic Container Registry Public 下载代理。如果您从区域性 Amazon S3 存储桶之一下载，则可以选择使用 PGP 签名来验证容器代理的有效性。

**注意**  
Amazon ECS 和 Docker 服务的 `systemd` 单元都有一个指令，在启动两个这两项服务之前等待 `cloud-init` 完成。在您的 Amazon EC2 用户数据完成运行之前，`cloud-init` 过程不会被视为已完成。因此，通过 Amazon EC2 用户数据启动 Amazon ECS 或 Docker 可能会导致死锁。要使用 Amazon EC2 用户数据启动容器代理，您可以使用 `systemctl enable --now --no-block ecs.service`。

## 在非 Amazon Linux EC2 实例上安装 Amazon ECS 容器代理
<a name="ecs-agent-install-nonamazonlinux"></a>

要在非 Amazon EC2 实例上安装 Amazon ECS 容器代理，您可以从区域性 Amazon S3 存储桶之一下载代理并安装它。

**注意**  
使用非 Amazon Linux AMI 时，您的 Amazon EC2 实例需要 `cgroupfs` 支持 `cgroup` 驱动程序，以便 Amazon ECS 代理能够支持任务级别的资源限制。有关更多信息，请参阅 [GitHub 上的 Amazon ECS 代理](https://github.com/aws/amazon-ecs-agent)。

下面按区域列出了每个系统架构最新的 Amazon ECS 容器代理文件，以供参考。


| 区域 |  区域名称 | Amazon ECS init deb 文件 | Amazon ECS init rpm 文件 | 
| --- | --- | --- | --- | 
| us-east-2 | 美国东部（俄亥俄州） |  [Amazon ECS init amd64](https://s3.us-east-2.amazonaws.com/amazon-ecs-agent-us-east-2/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.us-east-2.amazonaws.com/amazon-ecs-agent-us-east-2/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.us-east-2.amazonaws.com/amazon-ecs-agent-us-east-2/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.us-east-2.amazonaws.com/amazon-ecs-agent-us-east-2/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| us-east-1 | 美国东部（弗吉尼亚州北部） |  [Amazon ECS init amd64](https://s3.us-east-1.amazonaws.com/amazon-ecs-agent-us-east-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.us-east-1.amazonaws.com/amazon-ecs-agent-us-east-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.us-east-1.amazonaws.com/amazon-ecs-agent-us-east-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.us-east-1.amazonaws.com/amazon-ecs-agent-us-east-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| us-west-1 | 美国西部（北加利福尼亚） |  [Amazon ECS init amd64](https://s3.us-west-1.amazonaws.com/amazon-ecs-agent-us-west-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.us-west-1.amazonaws.com/amazon-ecs-agent-us-west-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.us-west-1.amazonaws.com/amazon-ecs-agent-us-west-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.us-west-1.amazonaws.com/amazon-ecs-agent-us-west-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| us-west-2 | 美国西部（俄勒冈州） |  [Amazon ECS init amd64](https://s3.us-west-2.amazonaws.com/amazon-ecs-agent-us-west-2/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.us-west-2.amazonaws.com/amazon-ecs-agent-us-west-2/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.us-west-2.amazonaws.com/amazon-ecs-agent-us-west-2/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.us-west-2.amazonaws.com/amazon-ecs-agent-us-west-2/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| ap-east-1 | 亚太地区（香港） |  [Amazon ECS init amd64](https://s3.ap-east-1.amazonaws.com/amazon-ecs-agent-ap-east-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.ap-east-1.amazonaws.com/amazon-ecs-agent-ap-east-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.ap-east-1.amazonaws.com/amazon-ecs-agent-ap-east-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.ap-east-1.amazonaws.com/amazon-ecs-agent-ap-east-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| ap-northeast-1 | 亚太地区（东京） |  [Amazon ECS init amd64](https://s3.ap-northeast-1.amazonaws.com/amazon-ecs-agent-ap-northeast-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.ap-northeast-1.amazonaws.com/amazon-ecs-agent-ap-northeast-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.ap-northeast-1.amazonaws.com/amazon-ecs-agent-ap-northeast-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.ap-northeast-1.amazonaws.com/amazon-ecs-agent-ap-northeast-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| ap-northeast-2 | 亚太地区（首尔） |  [Amazon ECS init amd64](https://s3.ap-northeast-2.amazonaws.com/amazon-ecs-agent-ap-northeast-2/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.ap-northeast-2.amazonaws.com/amazon-ecs-agent-ap-northeast-2/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.ap-northeast-2.amazonaws.com/amazon-ecs-agent-ap-northeast-2/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.ap-northeast-2.amazonaws.com/amazon-ecs-agent-ap-northeast-2/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| ap-south-1 | 亚太地区（孟买） |  [Amazon ECS init amd64](https://s3.ap-south-1.amazonaws.com/amazon-ecs-agent-ap-south-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.ap-south-1.amazonaws.com/amazon-ecs-agent-ap-south-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.ap-south-1.amazonaws.com/amazon-ecs-agent-ap-south-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.ap-south-1.amazonaws.com/amazon-ecs-agent-ap-south-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| ap-southeast-1 | 亚太地区（新加坡） |  [Amazon ECS init amd64](https://s3.ap-southeast-1.amazonaws.com/amazon-ecs-agent-ap-southeast-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.ap-southeast-1.amazonaws.com/amazon-ecs-agent-ap-southeast-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.ap-southeast-1.amazonaws.com/amazon-ecs-agent-ap-southeast-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.ap-southeast-1.amazonaws.com/amazon-ecs-agent-ap-southeast-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| ap-southeast-2 | 亚太地区（悉尼） |  [Amazon ECS init amd64](https://s3.ap-southeast-2.amazonaws.com/amazon-ecs-agent-ap-southeast-2/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.ap-southeast-2.amazonaws.com/amazon-ecs-agent-ap-southeast-2/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.ap-southeast-2.amazonaws.com/amazon-ecs-agent-ap-southeast-2/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.ap-southeast-2.amazonaws.com/amazon-ecs-agent-ap-southeast-2/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| ca-central-1 | 加拿大（中部） |  [Amazon ECS init amd64](https://s3.ca-central-1.amazonaws.com/amazon-ecs-agent-ca-central-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.ca-central-1.amazonaws.com/amazon-ecs-agent-ca-central-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.ca-central-1.amazonaws.com/amazon-ecs-agent-ca-central-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.ca-central-1.amazonaws.com/amazon-ecs-agent-ca-central-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| eu-central-1 | 欧洲地区（法兰克福） |  [Amazon ECS init amd64](https://s3.eu-central-1.amazonaws.com/amazon-ecs-agent-eu-central-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.eu-central-1.amazonaws.com/amazon-ecs-agent-eu-central-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.eu-central-1.amazonaws.com/amazon-ecs-agent-eu-central-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.eu-central-1.amazonaws.com/amazon-ecs-agent-eu-central-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| eu-west-1 | 欧洲地区（爱尔兰） |  [Amazon ECS init amd64](https://s3.eu-west-1.amazonaws.com/amazon-ecs-agent-eu-west-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.eu-west-1.amazonaws.com/amazon-ecs-agent-eu-west-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.eu-west-1.amazonaws.com/amazon-ecs-agent-eu-west-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.eu-west-1.amazonaws.com/amazon-ecs-agent-eu-west-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| eu-west-2 | 欧洲地区（伦敦） |  [Amazon ECS init amd64](https://s3.eu-west-2.amazonaws.com/amazon-ecs-agent-eu-west-2/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.eu-west-2.amazonaws.com/amazon-ecs-agent-eu-west-2/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.eu-west-2.amazonaws.com/amazon-ecs-agent-eu-west-2/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.eu-west-2.amazonaws.com/amazon-ecs-agent-eu-west-2/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| eu-west-3 | 欧洲地区（巴黎） |  [Amazon ECS init amd64](https://s3.eu-west-3.amazonaws.com/amazon-ecs-agent-eu-west-3/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.eu-west-3.amazonaws.com/amazon-ecs-agent-eu-west-3/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.eu-west-3.amazonaws.com/amazon-ecs-agent-eu-west-3/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.eu-west-3.amazonaws.com/amazon-ecs-agent-eu-west-3/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| sa-east-1 | 南美洲（圣保罗） |  [Amazon ECS init amd64](https://s3.sa-east-1.amazonaws.com/amazon-ecs-agent-sa-east-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.sa-east-1.amazonaws.com/amazon-ecs-agent-sa-east-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.sa-east-1.amazonaws.com/amazon-ecs-agent-sa-east-1/amazon-ecs-init-latest.x86_64.rpm) [Amazon ECS init aarch64](https://s3.sa-east-1.amazonaws.com/amazon-ecs-agent-sa-east-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| us-gov-east-1 | AWS GovCloud（美国东部） |  [Amazon ECS init amd64](https://s3.us-gov-east-1.amazonaws.com/amazon-ecs-agent-us-gov-east-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.us-gov-east-1.amazonaws.com/amazon-ecs-agent-us-gov-east-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.us-gov-east-1.amazonaws.com/amazon-ecs-agent-us-gov-east-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.us-gov-east-1.amazonaws.com/amazon-ecs-agent-us-gov-east-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 
| us-gov-west-1 | AWS GovCloud（美国西部） |  [Amazon ECS init amd64](https://s3.us-gov-west-1.amazonaws.com/amazon-ecs-agent-us-gov-west-1/amazon-ecs-init-latest.amd64.deb)（amd64） [Amazon ECS init arm64](https://s3.us-gov-west-1.amazonaws.com/amazon-ecs-agent-us-gov-west-1/amazon-ecs-init-latest.arm64.deb)（arm64）  |  [Amazon ECS init x86\$164](https://s3.us-gov-west-1.amazonaws.com/amazon-ecs-agent-us-gov-west-1/amazon-ecs-init-latest.x86_64.rpm)（x86\$164） [Amazon ECS init aarch64](https://s3.us-gov-west-1.amazonaws.com/amazon-ecs-agent-us-gov-west-1/amazon-ecs-init-latest.aarch64.rpm)（aarch64）  | 

**使用非 Amazon Linux AMI 在 Amazon EC2 实例上安装 Amazon ECS 容器代理**

1. 启动一个 Amazon EC2 实例，该实例具有允许访问 Amazon ECS 的 IAM 角色。有关更多信息，请参阅 [Amazon ECS 容器实例 IAM 角色](instance_IAM_role.md)。

1. 连接到您的实例。

1. 在实例上安装最新版本的 Docker。

1. 检查 Docker 版本以验证系统是否满足最低版本要求。有关 Docker 支持的更多信息，请参阅 [Amazon ECS EC2 容器实例](ecs-agent-versions.md)。

   ```
   docker --version
   ```

1. 下载适用于您的操作系统和系统架构的相应的 Amazon ECS 代理文件并进行安装。

   对于 `deb` 架构：

   ```
   ubuntu:~$ curl -O https://s3.us-west-2.amazonaws.com/amazon-ecs-agent-us-west-2/amazon-ecs-init-latest.amd64.deb
   ubuntu:~$ sudo dpkg -i amazon-ecs-init-latest.amd64.deb
   ```

   对于 `rpm` 架构：

   ```
   fedora:~$ curl -O https://s3.us-west-2.amazonaws.com/amazon-ecs-agent-us-west-2/amazon-ecs-init-latest.x86_64.rpm
   fedora:~$ sudo yum localinstall -y amazon-ecs-init-latest.x86_64.rpm
   ```

1. 编辑 `/lib/systemd/system/ecs.service` 文件并在 `[Unit]` 部分末尾添加以下行。

   ```
   After=cloud-final.service
   ```

1. （可选）向 `default` 集群以外的集群注册实例，编辑 `/etc/ecs/ecs.config` 文件并添加以下内容。下面的示例指定了 `MyCluster` 集群。

   ```
   ECS_CLUSTER=MyCluster
   ```

   有关这些和其他代理运行时选项的更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。
**注意**  
您可以选择将代理环境变量存储在 Amazon S3 中（可在启动时使用 Amazon EC2 用户数据将其下载到容器实例）。建议对敏感信息（如私有存储库的身份验证凭证）采用此方法。有关更多信息，请参阅[将 Amazon ECS 容器实例配置存储在 Amazon S3 中](ecs-config-s3.md)和[在 Amazon ECS 中使用非 AWS 容器映像](private-auth.md)。

1. 启动 `ecs` 服务。

   ```
   ubuntu:~$ sudo systemctl start ecs
   ```

## 使用主机网络模式运行 Amazon ECS 代理
<a name="container_agent_host"></a>

在运行 Amazon ECS 容器代理时，`ecs-init` 将使用 `host` 网络模式创建容器代理容器。这是容器代理容器的唯一受支持的网络模式。

这使您能够阻止对容器代理启动的容器的 [Amazon EC2 实例元数据服务端点](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)（`http://169.254.169.254`）的访问。这将确保容器无法访问容器实例配置文件中的 IAM 角色凭证并强制任务仅使用 IAM 任务角色凭证。有关更多信息，请参阅 [Amazon ECS 任务 IAM 角色](task-iam-roles.md)。

这还可以让容器代理不会争用 `docker0` 桥接上的连接和网络流量。

## Amazon ECS 容器代理日志配置参数
<a name="agent-logs"></a>

Amazon ECS 容器代理将日志存储在您的容器实例上。

对于容器代理版本 1.36.0 及更高版本，预设情况下，日志位于 `/var/log/ecs/ecs-agent.log`（在 Linux 实例上）和 `C:\ProgramData\Amazon\ECS\log\ecs-agent.log`（在 Windows 实例上）。

对于容器代理版本 1.35.0 及以前的版本，预设情况下，日志位于 `/var/log/ecs/ecs-agent.log.timestamp`（在 Linux 实例上）和 `C:\ProgramData\Amazon\ECS\log\ecs-agent.log.timestamp`（在 Windows 实例上）。

预设情况下，代理日志每小时轮换一次，最多存储 24 个日志。

以下是可用于更改原定设置代理日志记录行为的容器代理配置变量。有关所有可用配置参数的详细信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)或 GitHub 上的 [Amazon ECS Agent README](https://github.com/aws/amazon-ecs-agent/blob/master/README.md)。

对于容器代理版本 1.36.0 及更高版本，以下是使用 `logfmt` 格式时的示例日志文件。

```
level=info time=2019-12-12T23:43:29Z msg="Loading configuration" module=agent.go
level=info time=2019-12-12T23:43:29Z msg="Image excluded from cleanup: amazon/amazon-ecs-agent:latest" module=parse.go
level=info time=2019-12-12T23:43:29Z msg="Image excluded from cleanup: amazon/amazon-ecs-pause:0.1.0" module=parse.go
level=info time=2019-12-12T23:43:29Z msg="Amazon ECS agent Version: 1.36.0, Commit: ca640387" module=agent.go
level=info time=2019-12-12T23:43:29Z msg="Creating root ecs cgroup: /ecs" module=init_linux.go
level=info time=2019-12-12T23:43:29Z msg="Creating cgroup /ecs" module=cgroup_controller_linux.go
level=info time=2019-12-12T23:43:29Z msg="Loading state!" module=statemanager.go
level=info time=2019-12-12T23:43:29Z msg="Event stream ContainerChange start listening..." module=eventstream.go
level=info time=2019-12-12T23:43:29Z msg="Restored cluster 'auto-robc'" module=agent.go
level=info time=2019-12-12T23:43:29Z msg="Restored from checkpoint file. I am running as 'arn:aws:ecs:us-west-2:0123456789:container-instance/auto-robc/3330a8a91d15464ea30662d5840164cd' in cluster 'auto-robc'" module=agent.go
```

以下是使用 JSON 格式时的示例日志文件。

```
{"time": "2019-11-07T22:52:02Z", "level": "info", "msg": "Starting Amazon Elastic Container Service Agent", "module": "engine.go"}
```

# 为私有 Docker 映像配置 Amazon ECS 容器实例
<a name="private-auth-container-instances"></a>

Amazon ECS 容器代理可使用基本身份验证对私有注册表进行身份验证。当启用私有注册表身份验证时，您可以在任务定义中使用私有 Docker 映像。只有使用 EC2 的任务才支持此功能。

另一种启用私有注册表身份验证的方法是使用 AWS Secrets Manager 在容器定义中安全地存储并随后引用您的私有注册表凭证。这样，您的任务就可以使用私有存储库中的映像。此方法支持使用 EC2 或 Fargate 的任务。有关更多信息，请参阅 [在 Amazon ECS 中使用非 AWS 容器映像](private-auth.md)。

Amazon ECS 容器代理在启动时将查找两个环境变量：
+ `ECS_ENGINE_AUTH_TYPE`，指定要发送的身份验证数据的类型。
+ `ECS_ENGINE_AUTH_DATA`，包含实际身份验证凭证。

经 Amazon ECS 优化的 AMI 的 Linux 变体在容器实例启动时以及每次服务启动时（使用 **sudo start ecs** 命令）扫描 `/etc/ecs/ecs.config` 文件以查找这些变量。没有经 Amazon ECS 优化的 AMI 应将这些环境变量存储在一个文件中，然后利用 `--env-file path_to_env_file` 选项将其传递到用于启动容器代理的 **docker run** 命令。

**重要**  
我们不建议在实例启动时利用 Amazon EC2 用户数据注入这些身份验证环境变量或利用 `--env` 选项将其传递到 **docker run** 命令。这些方法不适合敏感数据，如身份验证凭证。有关将身份验证凭证安全地添加到容器实例的信息，请参阅[将 Amazon ECS 容器实例配置存储在 Amazon S3 中](ecs-config-s3.md)。

## 身份验证格式
<a name="docker-auth-formats"></a>

私有注册表身份验证有两种可用格式：`dockercfg` 和 `docker`。

**dockercfg 身份验证格式**  
`dockercfg` 格式使用存储在您在运行 **docker login** 命令时创建的配置文件中的身份验证信息。您可以通过在本地系统上运行 **docker login** 并输入注册表用户名、密码和电子邮件地址来创建此文件。您也可以登录到容器实例并运行命令。根据您的 Docker 版本的不同，此文件将以 `~/.dockercfg` 或 `~/.docker/config.json` 的形式保存。

```
cat ~/.docker/config.json
```

输出：

```
{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "zq212MzEXAMPLE7o6T25Dk0i"
    }
  }
}
```

**重要**  
较新版本的 Docker 可使用外部 `auths` 对象创建上面所示的配置文件。Amazon ECS 代理仅支持以下格式的 `dockercfg` 身份验证数据，无需 `auths` 对象。如果已安装 **jq** 实用程序，则可以使用以下命令提取此数据：**cat \$1/.docker/config.json \$1 jq .auths**

```
cat ~/.docker/config.json | jq .auths
```

输出：

```
{
  "https://index.docker.io/v1/": {
    "auth": "zq212MzEXAMPLE7o6T25Dk0i",
    "email": "email@example.com"
  }
}
```

在上面的示例中，以下环境变量应添加到 Amazon ECS 容器代理在运行时加载的环境变量文件中（对于经Amazon ECS 优化过的 AMI，该文件为 `/etc/ecs/ecs.config`）。如果不使用经 Amazon ECS 优化的 AMI 并且要利用 **docker run** 手动启动代理，请在启动代理时利用 `--env-file path_to_env_file` 选项指定环境变量文件。

```
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example.com"}}
```

您可以使用以下语法配置多个私有注册表：

```
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example-01.com"},"repo.example-02.com":{"auth":"fQ172MzEXAMPLEoF7225DU0j","email":"email@example-02.com"}}
```

**docker 身份验证格式**  
`docker` 格式使用注册表服务器（代理应向其进行身份验证）的 JSON 表示形式。它还包括注册表需要的身份验证参数（如该账户的用户名、密码和电子邮件地址）。对于 Docker Hub 账户，JSON 表示形式如下所示：

```
{
  "https://index.docker.io/v1/": {
    "username": "my_name",
    "password": "my_password",
    "email": "email@example.com"
  }
}
```

在此示例中，以下环境变量应添加到 Amazon ECS 容器代理在运行时加载的环境变量文件中（对于经 Amazon ECS 优化过的 AMI，该文件为 `/etc/ecs/ecs.config`）。如果不使用经 Amazon ECS 优化过的 AMI 并且要利用 **docker run** 手动启动代理，请在启动代理时利用 `--env-file path_to_env_file` 选项指定环境变量文件。

```
ECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}
```

您可以使用以下语法配置多个私有注册表：

```
ECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"username":"my_name","password":"my_password","email":"email@example-01.com"},"repo.example-02.com":{"username":"another_name","password":"another_password","email":"email@example-02.com"}}
```

## 过程
<a name="enabling-private-registry"></a>

使用以下过程可为容器实例启用私有注册表。

**在经 Amazon ECS 优化的 AMI 中启用私有注册表**

1. 使用 SSH 登录到您的容器实例。

1. 打开 `/etc/ecs/ecs.config` 文件并为注册表和账户添加 `ECS_ENGINE_AUTH_TYPE` 和 `ECS_ENGINE_AUTH_DATA` 值：

   ```
   sudo vi /etc/ecs/ecs.config
   ```

   此示例将对 Docker Hub 用户账户进行身份验证：

   ```
   ECS_ENGINE_AUTH_TYPE=docker
   ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}
   ```

1. 检查您的代理是否使用 `ECS_DATADIR` 环境变量保存其状态：

   ```
   docker inspect ecs-agent | grep ECS_DATADIR
   ```

   输出：

   ```
   "ECS_DATADIR=/data",
   ```
**重要**  
如果上一个命令未返回 `ECS_DATADIR` 环境变量，则您在停止代理前必须停止在此容器实例上运行的任何任务。使用 `ECS_DATADIR` 环境变量的较新的代理将会保存其状态，您可以在任务运行的过程中停止和启动它们，而不会造成问题。有关更多信息，请参阅 [更新 Amazon ECS 容器代理](ecs-agent-update.md)。

1. 停止 `ecs` 服务：

   ```
   sudo stop ecs
   ```

   输出：

   ```
   ecs stop/waiting
   ```

1. 重新启动 `ecs` 服务。
   + 对于经 Amazon ECS 优化的 Amazon Linux 2 AMI：

     ```
     sudo systemctl restart ecs
     ```
   + 对于经 Amazon ECS 优化的 Amazon Linux AMI：

     ```
     sudo stop ecs && sudo start ecs
     ```

1. （可选）您可以通过查询代理自检 API 操作，验证代理是否正在运行并查看有关新容器实例的一些信息。有关更多信息，请参阅 [Amazon ECS 容器自检](ecs-agent-introspection.md)。

   ```
   curl http://localhost:51678/v1/metadata
   ```

# Amazon ECS 任务和映像自动清理
<a name="automated_image_cleanup"></a>

每次将任务放在一个容器实例上时，Amazon ECS 容器代理都会检查该任务中引用的映像是否为存储库中的指定标记的最新版本。如果不是，默认行为将允许代理从各个存储库中拉取映像。如果频繁更新任务和服务中的映像，则容器实例存储可能很快会被没在使用并且可能再也不会使用的 Docker 映像填满。例如，如果您使用了连续集成和连续部署（CI/CD）管道。

**注意**  
可以使用 `ECS_IMAGE_PULL_BEHAVIOR` 参数自定义 Amazon ECS 代理映像拉取行为。有关更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。

同样，属于已停止任务的容器也可能会通过日志信息、数据卷和其他项目消耗容器实例存储空间。这些项目对于调试意外停止的容器很有用，但此存储的大部分空间在一段时间后可以安全地释放。

原定设置情况下，Amazon ECS 容器代理将自动清除已停止的任务和您的容器实例上的任何任务均未在使用的 Docker 映像。

**注意**  
自动映像清除功能要求 Amazon ECS 容器代理的版本最低为 1.13.0。要将您的代理更新至最新版本，请参阅[更新 Amazon ECS 容器代理](ecs-agent-update.md)。

以下代理配置变量可用于调整自动化任务和映像清除体验。有关如何在容器实例上设置这些变量的更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。

`ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION`  
等待删除已停止任务的容器的默认时间。如果该值设置为小于 1 秒，则系统会忽略该值。默认情况下，此参数设置为 3 小时，但如果您的应用程序有需要，您最多可以将此时间间缩短为 1 秒钟。  
只要存在引用某个映像的容器，映像清除过程就无法删除该映像。移除容器后，根据映像清理配置参数，任何未引用的图像都将成为清理的候选项。

`ECS_DISABLE_IMAGE_CLEANUP`  
如果您将此变量设置为 `true`，则会在您的容器实例上关闭自动映像清除，且不会自动删除映像。

`ECS_IMAGE_CLEANUP_INTERVAL`  
此变量指定自动映像清除过程应检查要删除的映像的频率。默认值为每 30 分钟一次，但您可以将此时间缩短至 10 分钟，以便更频繁地删除映像。

`ECS_IMAGE_MINIMUM_CLEANUP_AGE`  
此变量指定拉取映像与映像可能变成删除的候选项之间的最短时间。这可用于防止清除刚刚拉取的映像。默认值为 1 小时。

`ECS_NUM_IMAGES_DELETE_PER_CYCLE`  
此变量指定在一个清除周期内可以清除的映像数。默认值为 5，最小值为 1。

当 Amazon ECS 容器代理正在运行且自动映像清除未关闭时，该代理将按照 `ECS_IMAGE_CLEANUP_INTERVAL` 变量确定的频率，检查是否有未被正在运行或已停止的容器引用的 Docker 映像。如果发现未使用的映像，并且这些映像的存在时间超过了 `ECS_IMAGE_MINIMUM_CLEANUP_AGE` 指定的最短清除时间，则该代理将删除由 `ECS_NUM_IMAGES_DELETE_PER_CYCLE` 变量指定的最大数量的映像。最早引用的映像会最先删除。在删除映像后，该代理将等到下一个时间间隔并重复上述流程。