Amazon Elastic Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用 Amazon EC2 用户数据引导启动容器实例

在启动 Amazon ECS 容器实例时,您可以选择将用户数据传递到实例。数据可以用于执行常见的自动配置任务,甚至用于在实例启动时运行脚本。对于 Amazon ECS,最常见的用户数据使用案例是将配置信息传递到 Docker 守护程序和 Amazon ECS 容器实例。

您可以将多类用户数据传递到 Amazon EC2,其中包括云 boothook、Shell 脚本和 cloud-init 指令。有关这些和其他格式类型的更多信息,请参阅 Cloud-Init 文档

您可以将此用户数据传递到启动 Amazon ECS 容器实例步骤 7的 Amazon EC2 启动向导中。

Amazon ECS 容器代理

当容器代理启动时,经 Amazon ECS 优化的 AMI 将在 /etc/ecs/ecs.config 文件中查找代理配置数据。您可以在启动时使用 Amazon EC2 用户数据指定此配置数据。有关可用的 Amazon ECS 容器代理配置变量的完整列表,请参阅 Amazon ECS 容器代理配置

若要仅设置一个代理配置变量 (如群集名称),请使用 echo 将该变量复制到配置文件:

Copy
#!/bin/bash echo "ECS_CLUSTER=MyCluster" >> /etc/ecs/ecs.config

如果您有多个变量要写入到 /etc/ecs/ecs.config,请使用以下 heredoc 格式。此格式会将以 catEOF 开头的行之间的所有内容写入到配置文件。

Copy
#!/bin/bash cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyCluster 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_LOGLEVEL=debug EOF

Docker 守护程序

您可以使用 Amazon EC2 用户数据指定 Docker 守护程序配置信息,但此配置数据必须在 Docker 守护程序启动之前写入。在启动过程中,cloud-boothook 用户数据格式早于用户数据 Shell 脚本执行。有关 Docker 守护程序配置选项的完整列表,请参阅 Docker 守护程序文档

默认情况下,cloud-boothook 用户数据在每个实例启动时运行,因此您必须创建一个机制来阻止 boothook 运行多次。提供了 cloud-init-per 实用程序来以此方式控制 boothook 频率。有关更多信息,请参阅 cloud-init-per 实用程序

在以下示例中,--storage-opt dm.basesize=20G 选项已附加到 Docker 守护程序配置文件 /etc/sysconfig/docker 中的所有现有选项。

Copy
#cloud-boothook cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker

要向一个文件写入多个行,请使用以下 heredoc 格式来实现相同的目标:

Copy
#cloud-boothook cloud-init-per instance docker_options cat <<'EOF' >> /etc/sysconfig/docker OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G" HTTP_PROXY=http://proxy.example.com:80/ EOF

cloud-init-per 实用程序

cloud-init-per 实用程序由 cloud-init 程序包提供,用于帮助您为实例创建以指定频率运行的 boothook 命令。

cloud-init-per 实用程序语法如下:

cloud-init-per frequency name cmd [ arg1 [ arg2 [ ... ] ]
frequency

boothook 应运行的频率。

  • 指定 once 可不再运行 (即使使用新的实例 ID)。

  • 指定 instance 可在每个新实例首次启动时运行。例如,如果您在 boothook 运行后从实例创建 AMI,boothook 仍将在从该 AMI 启动的后续实例上再次运行。

  • 指定 always 可在每次启动时运行。

name

要包含到在 boothook 运行时写入的信号灯文件路径中的名称。信号灯文件将写入到 /var/lib/cloud/instances/instance_id/sem/bootper.name.instance

cmd

boothook 应执行的命令和参数。

在以下示例中,命令 echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker 只会执行一次。将写入包含自身名称的信号灯文件。

Copy
#cloud-boothook cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker

该信号灯文件将记录命令的退出代码和执行命令时的 UNIX 时间戳。

Copy
[ec2-user ~]$ cat /var/lib/cloud/instances/i-0c7f87d7611b2165e/sem/bootper.docker_options.instance

输出:

0	1488410363

MIME 分段存档

您可以将多个用户数据块合并到一个名为 MIME 分段文件的用户数据块中。例如,您可能希望将配置 Docker 守护程序的云 boothook 与为 Amazon ECS 容器代理写入配置信息的用户数据 Shell 脚本合并。

MIME 分段文件包含以下组成部分:

  • 内容类型和段边界声明:Content-Type: multipart/mixed; boundary="==BOUNDARY=="

  • MIME 版本声明:MIME-Version: 1.0

  • 一个或多个用户数据块,其包含以下组成部分:

    • 开口边界,表示用户数据块的开头:--==BOUNDARY==

    • 数据块的内容类型声明 (有关内容类型的列表,请参阅 Cloud-Init 文档):Content-Type: text/cloud-boothook; charset="us-ascii"

    • 用户数据的内容,例如,Shell 命令或 cloud-init 指令的列表

  • 封闭边界,表示 MIME 分段文件的结尾:--==BOUNDARY==--

例 MIME 分段文件

此示例 MIME 分段文件会将 Docker 基本设备尺寸配置为 20 GiB,并将 Amazon ECS 容器代理配置为将实例注册到名为 my-ecs-cluster 的群集。

Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0

--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"

# Set Docker daemon options
cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker

--==BOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
# Set any ECS agent configuration options
echo "ECS_CLUSTER=my-ecs-cluster" >> /etc/ecs/ecs.config

--==BOUNDARY==--