Amazon EC2 Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

示例容器实例用户数据配置脚本

下面的示例用户数据脚本在启动时配置 Amazon ECS 容器实例。

具有 Amazon EFS 文件系统的经 Amazon ECS 优化的 AMI 容器实例

该示例用户数据脚本将从经 Amazon ECS 优化的 AMI 启动的实例配置为使用现有的 Amazon EFS 文件系统。有关更多信息,请参阅 教程:将 Amazon EFS 文件系统与 Amazon ECS 配合使用

该脚本执行以下操作:

  • 安装 nfs-utils 程序包,这会安装 NFS 客户端

  • /efs 处为该 NFS 文件系统创建一个挂载目录

  • /etc/fstab 文件中为该文件系统创建一个挂载条目,然后挂载该文件系统

  • 将群集名称 default 写入到 Amazon ECS 代理配置文件

您可以将该脚本用于自己的容器实例,但前提是它们是从经 Amazon ECS 优化的 AMI 启动的。如果您使用的不是 default 群集,请务必替换配置文件中的 ECS_CLUSTER=default 行,以指定您自己的群集名称。有关启动容器实例的更多信息,请参阅启动 Amazon ECS 容器实例

Copy
Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" # Install nfs-utils cloud-init-per once yum_update yum update -y cloud-init-per once install_nfs_utils yum install -y nfs-utils # Create /efs folder cloud-init-per once mkdir_efs mkdir /efs # Mount /efs cloud-init-per once mount_efs echo -e 'fs-abcd1234.efs.us-east-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' >> /etc/fstab mount -a --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Set any ECS agent configuration options echo "ECS_CLUSTER=default" >> /etc/ecs/ecs.config --==BOUNDARY==--

具有 systemd的 Ubuntu 容器实例

该示例用户数据脚本将 Ubuntu 16.04 实例配置为:

  • 安装 Docker

  • 为任务的 IAM 角色创建所需的 iptables 规则

  • 为 Amazon ECS 容器代理创建所需的目录

  • 写入 Amazon ECS 容器代理配置文件

  • 写入 systemd 单元文件以监视代理

  • 启用并启动 systemd 单元

您可以将该脚本用于自己的容器实例,但前提是它们是从 Ubuntu 16.04 AMI 启动的。如果您使用的不是 default 群集,请务必替换配置文件中的 ECS_CLUSTER=default 行,以指定您自己的群集名称。有关启动容器实例的更多信息,请参阅启动 Amazon ECS 容器实例

Copy
#!/bin/bash # Install Docker apt-get update -y && apt-get install -y docker.io # Set iptables rules echo 'net.ipv4.conf.all.route_localnet = 1' >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679 # Write iptables rules to persist after reboot iptables-save > /etc/iptables/rules.v4 # Create directories for ECS agent mkdir -p /var/log/ecs /var/lib/ecs/data /etc/ecs # Write ECS config file cat << EOF > /etc/ecs/ecs.config ECS_DATADIR=/data ECS_ENABLE_TASK_IAM_ROLE=true ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true ECS_LOGFILE=/log/ecs-agent.log ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"] ECS_LOGLEVEL=info ECS_CLUSTER=default EOF # Write systemd unit file cat << EOF > /etc/systemd/system/docker-container@ecs-agent.service [Unit] Description=Docker Container %I Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/bin/docker run --name %i \ --restart=on-failure:10 \ --volume=/var/run:/var/run \ --volume=/var/log/ecs/:/log \ --volume=/var/lib/ecs/data:/data \ --volume=/etc/ecs:/etc/ecs \ --net=host \ --env-file=/etc/ecs/ecs.config \ amazon/amazon-ecs-agent:latest ExecStop=/usr/bin/docker rm -f %i [Install] WantedBy=default.target EOF systemctl enable docker-container@ecs-agent.service systemctl start docker-container@ecs-agent.service

具有 systemdSELinux 的 CentOS 容器实例

该示例用户数据脚本将启用了 SELinux 的 CentOS 7 实例配置为:

  • 安装 Docker

  • 为任务的 IAM 角色创建所需的 iptables 规则

  • 为 Amazon ECS 容器代理创建所需的目录

  • 写入 Amazon ECS 容器代理配置文件

  • 写入 systemd 单元文件以监视代理

  • 启用并启动 systemd 单元

注意

下面的 systemd 单元文件中的 docker run 命令包含 SELinux 所需的修改,其中含有 --privileged 标记和用于卷挂载的 :Z 后缀。

您可以将该脚本用于自己的容器实例 (前提是它们是从 CentOS 7 AMI 启动的),但请记得替换配置文件中的 ECS_CLUSTER=default 行来指定自己的群集名称 (如果您使用的不是 default 群集)。有关启动容器实例的更多信息,请参阅启动 Amazon ECS 容器实例

Copy
#!/bin/bash # Install Docker yum install -y docker # Set iptables rules echo 'net.ipv4.conf.all.route_localnet = 1' >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679 # Write iptables rules to persist after reboot iptables-save > /etc/sysconfig/iptables # Create directories for ECS agent mkdir -p /var/log/ecs /var/lib/ecs/data /etc/ecs # Write ECS config file cat << EOF > /etc/ecs/ecs.config ECS_DATADIR=/data ECS_ENABLE_TASK_IAM_ROLE=true ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true ECS_LOGFILE=/log/ecs-agent.log ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"] ECS_LOGLEVEL=info ECS_CLUSTER=default EOF # Write systemd unit file cat << EOF > /etc/systemd/system/docker-container@ecs-agent.service [Unit] Description=Docker Container %I Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/bin/docker run --name %i \ --privileged \ --restart=on-failure:10 \ --volume=/var/run:/var/run \ --volume=/var/log/ecs/:/log:Z \ --volume=/var/lib/ecs/data:/data:Z \ --volume=/etc/ecs:/etc/ecs \ --net=host \ --env-file=/etc/ecs/ecs.config \ amazon/amazon-ecs-agent:latest ExecStop=/usr/bin/docker rm -f %i [Install] WantedBy=default.target EOF systemctl enable docker-container@ecs-agent.service systemctl start docker-container@ecs-agent.service