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

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

下面的示例用户数据脚本在启动时配置 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