Amazon Elastic Container Service
开发人员指南 (API 版本 2014-11-13)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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

具有 Amazon EFS 文件系统的 Amazon ECS-Optimized Amazon Linux AMI 容器实例

该示例用户数据脚本将从 Amazon ECS-optimized Amazon Linux AMI 启动的实例配置为使用现有的 Amazon EFS 文件系统。有关更多信息,请参阅 Tutorial: Using Amazon EFS File Systems with Amazon ECS

该脚本执行以下操作:

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

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

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

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

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

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 容器实例

#!/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 ExecStartPre=-/usr/bin/docker rm -f %i 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 stop %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 容器实例

#!/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 ExecStartPre=-/usr/bin/docker rm -f %i 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 stop %i [Install] WantedBy=default.target EOF systemctl enable docker-container@ecs-agent.service systemctl start docker-container@ecs-agent.service

默认 Windows 用户数据

该示例用户数据脚本显示在使用集群创建向导 时 Windows 容器实例接收的默认用户数据。下面的脚本执行以下操作:

  • 将集群名称设置为 windows

  • 启用任务的 IAM 角色。

  • json-file 以及 awslogs 设置为可用的日志记录驱动程序。

您可以将该脚本用于自己的容器实例(前提是它们是从 Amazon ECS-optimized Windows AMI 启动的),但请记得替换 -Cluster windows 行来指定自己的集群名称(如果您使用的不是名为 windows 的集群)。

<powershell> Initialize-ECSAgent -Cluster windows -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' </powershell>

Windows 代理安装用户数据

该示例用户数据脚本将在使用 Windows_Server-2016-English-Full-Containers AMI 启动的实例上安装 Amazon ECS 容器代理。该脚本已根据 Amazon ECS 容器代理的 GitHub 存储库 README 页面中的代理安装说明进行了调整。

注意

此脚本作为示例分享。使用 Amazon ECS-optimized Windows AMI 的 Windows 容器更容易上手。有关更多信息,请参阅创建集群

您可以将该脚本用于自己的容器实例(前提是它们是使用 Windows_Server-2016-English-Full-Containers AMI 版本启动的)。请记得替换 windows 行来指定自己的集群名称(如果您使用的不是名为 windows 的集群)。

<powershell> # Set up directories the agent uses New-Item -Type directory -Path ${env:ProgramFiles}\Amazon\ECS -Force New-Item -Type directory -Path ${env:ProgramData}\Amazon\ECS -Force New-Item -Type directory -Path ${env:ProgramData}\Amazon\ECS\data -Force # Set up configuration $ecsExeDir = "${env:ProgramFiles}\Amazon\ECS" [Environment]::SetEnvironmentVariable("ECS_CLUSTER", "windows", "Machine") [Environment]::SetEnvironmentVariable("ECS_LOGFILE", "${env:ProgramData}\Amazon\ECS\log\ecs-agent.log", "Machine") [Environment]::SetEnvironmentVariable("ECS_DATADIR", "${env:ProgramData}\Amazon\ECS\data", "Machine") # Download the agent $agentVersion = "latest" $agentZipUri = "https://s3.amazonaws.com/amazon-ecs-agent/ecs-agent-windows-$agentVersion.zip" $zipFile = "${env:TEMP}\ecs-agent.zip" Invoke-RestMethod -OutFile $zipFile -Uri $agentZipUri # Put the executables in the executable directory. Expand-Archive -Path $zipFile -DestinationPath $ecsExeDir -Force Set-Location ${ecsExeDir} # Set $EnableTaskIAMRoles to $true to enable task IAM roles # Note that enabling IAM roles will make port 80 unavailable for tasks. [bool]$EnableTaskIAMRoles = $false if (${EnableTaskIAMRoles}) { $HostSetupScript = Invoke-WebRequest https://raw.githubusercontent.com/aws/amazon-ecs-agent/master/misc/windows-deploy/hostsetup.ps1 Invoke-Expression $($HostSetupScript.Content) } # Install the agent service New-Service -Name "AmazonECS" ` -BinaryPathName "$ecsExeDir\amazon-ecs-agent.exe -windows-service" ` -DisplayName "Amazon ECS" ` -Description "Amazon ECS service runs the Amazon ECS agent" ` -DependsOn Docker ` -StartupType Manual sc.exe failure AmazonECS reset=300 actions=restart/5000/restart/30000/restart/60000 sc.exe failureflag AmazonECS 1 Start-Service AmazonECS </powershell>