

# 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
   ```