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

Amazon ECS CLI 教程

这些简单教程说明了 Amazon ECS CLI 的几种不同的命令和功能。我们提供了使用 Fargate 和 EC2 启动类型的教程。您必须先安装并配置 Amazon ECS CLI,然后才能启动此教程。有关更多信息,请参阅 安装 Amazon ECS CLI

使用 Fargate 启动类型的 Amazon ECS CLI 教程

本教程说明了如何使用 Fargate 启动类型设置群集和部署任务。预计您已设置 AWS 账户,并已安装和配置 AWS CLI。有关如何配置环境的更多信息,请参阅 AWS 命令行界面

步骤 1:先决条件

Amazon ECS 需要获得权限,您的 Fargate 任务才能在 CloudWatch 中存储日志。提前创建角色策略,以便日后可以引用。

创建任务执行角色

  1. 使用以下内容创建名为 execution-assume-role.json 的文件:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 使用 AWS CLI 创建任务执行角色:

    aws iam --region us-east-1 create-role --role-name ecsExecutionRole --assume-role-policy-document file://execution-assume-role.json
  3. 使用 AWS CLI 附加任务执行角色策略:

    aws iam --region us-east-1 attach-role-policy --role-name ecsExecutionRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

步骤 2:配置 ECS CLI

ECS CLI 需要获得凭据才能代表您发出 API 请求。它可以从环境变量、AWS 配置文件或 Amazon ECS 配置文件中提取凭据。有关更多信息,请参阅 配置 Amazon ECS CLI

创建 ECS CLI 配置

  1. 创建群集配置:

    ecs-cli configure --cluster tutorial --region us-east-1 --default-launch-type FARGATE --config-name tutorial
  2. 使用您的访问密钥和私有密钥创建配置文件:

    ecs-cli configure profile --access-key AWS_ACCESS_KEY_ID --secret-key AWS_SECRET_ACCESS_KEY --profile-name tutorial

    注意

    如果这是您首次配置 ECS CLI,则这些配置将被标记为默认值。如果这不是您首次配置 ECS CLI,请参阅 ecs-cli configure defaultecs-cli configure profile default,以将其设置为默认配置和配置文件。

步骤 3:创建群集和安全组

使用 ecs-cli up 命令创建 Amazon ECS 群集。由于您在群集配置中指定 Fargate 作为您的默认启动类型,因此该命令将创建一个空群集和配置有两个公有子网的一个 VPC。

ecs-cli up

注意

创建您的资源时,完成此命令可能需要几分钟的时间。记下创建的 VPC 和子网 ID,以后将会用到它们。

利用之前的输出中的 VPC ID,使用 AWS CLI 创建一个安全组:

aws ec2 create-security-group --group-name "my-sg" --description "My security group" --vpc-id "VPC_ID"

使用 AWS CLI 添加一个安全组规则,以允许端口 80 的入站访问:

aws ec2 authorize-security-group-ingress --group-id "security_group_id" --protocol tcp --port 80 --cidr 0.0.0.0/0

步骤 4:创建复合文件

在此步骤中,创建一个简单的 Docker 复合文件,此文件将创建 WordPress 应用程序。此时,Amazon ECS CLI 支持 Docker 复合文件语法版本 1 和 2。

以下是复合文件,您可以对它称作 docker-compose.ymlwordpress 容器将开放端口 80 以便将流量传入 Web 服务器。它还会配置容器日志,以转到之前创建的 CloudWatch 日志组。这是针对 Fargate 任务建议的最佳实践。

version: '2' services: wordpress: image: wordpress ports: - "80:80" logging: driver: awslogs options: awslogs-group: tutorial awslogs-region: us-east-1 awslogs-stream-prefix: wordpress

除了 Docker 复合信息,您还需要为服务指定某些 Amazon ECS 特定的参数。使用上一步中的 VPC、子网和安全组 ID,创建一个名为 ecs-params.yml 且包含以下内容的文件:

version: 1 task_definition: task_execution_role: ecsExecutionRole ecs_network_mode: awsvpc task_size: mem_limit: 0.5GB cpu_limit: 256 run_params: network_configuration: awsvpc_configuration: subnets: - "subnet ID 1" - "subnet ID 2" security_groups: - "security group ID" assign_public_ip: ENABLED

注意

assign_public_iptask_size 参数仅对 Fargate 任务有效。如果启动类型更改为 EC2,则此任务定义将会失败。

步骤 5:将复合文件部署到集群

在创建复合文件后,您可以使用 ecs-cli compose service up 将其部署到您的群集。默认情况下,此命令将查找当前目录中名为 docker-compose.ymlecs-params.yml 的文件;您可以使用 --file 选项指定不同的 Docker 复合文件,并使用 --ecs-params 选项指定不同的 ECS Params 文件。默认情况下,通过此命令创建的资源具有标题中的当前目录,但您可以使用 --project-name 选项覆盖该目录。--create-log-groups 选项将为容器日志创建 CloudWatch 日志组。

ecs-cli compose --project-name tutorial service up --create-log-groups

步骤 6:查看集群上正在运行的容器

在部署复合文件后,您可以使用 ecs-cli compose service ps 查看正在服务中运行的容器。

ecs-cli compose --project-name tutorial service ps

输出:

WARN[0000] Skipping unsupported YAML option... option name=networks WARN[0000] Skipping unsupported YAML option for service... option name=networks service name=wordpress Name State Ports TaskDefinition a06a6642-12c5-4006-b1d1-033994580605/wordpress RUNNING 54.146.193.73:80->80/tcp tutorial:9

在上述示例中,您可以查看复合文件中的 wordpress 容器以及 Web 服务器的 IP 地址和端口。如果将 Web 浏览器指向该地址,应会显示 WordPress 安装向导。此外,输出中还显示容器的 task-id。复制任务 ID;您将在下一步中使用它。

步骤 7:查看容器日志

查看任务日志:

ecs-cli logs --task-id a06a6642-12c5-4006-b1d1-033994580605 --follow

注意

--follow 选项告知 ECS CLI 持续轮询日志。

步骤 8:在群集上扩展任务

您可以使用 ecs-cli compose service scale 向上扩展任务计数,以增加应用程序的实例数量。在此示例中,正在运行的应用程序计数增至两个。

ecs-cli compose --project-name tutorial service scale 2

现在,您的群集中应拥有两个以上的容器:

ecs-cli compose --project-name tutorial service ps

输出:

WARN[0000] Skipping unsupported YAML option... option name=networks WARN[0000] Skipping unsupported YAML option for service... option name=networks service name=wordpress Name State Ports TaskDefinition 880f09ed-613d-44bf-99bb-42ca44f82904/wordpress RUNNING 34.224.60.24:80->80/tcp tutorial:9 a06a6642-12c5-4006-b1d1-033994580/wordpress RUNNING 54.146.193.73:80->80/tcp tutorial:9

步骤 9:清除

在结束此教程后,应清除您的资源以便这些资源不再产生任何费用。首先,删除服务,以便它停止现有容器且不尝试运行任何其他任务。

ecs-cli compose --project-name tutorial service down

现在,关闭您的集群,这将清除您先前使用 ecs-cli up 创建的资源。

ecs-cli down --force

使用 EC2 启动类型的 Amazon ECS CLI 教程

步骤 1:配置 ECS CLI

ECS CLI 需要获得凭据才能代表您发出 API 请求。它可以从环境变量、AWS 配置文件或 Amazon ECS 配置文件中提取凭据。有关更多信息,请参阅 配置 Amazon ECS CLI

创建 ECS CLI 配置

  1. 创建群集配置:

    ecs-cli configure --cluster ec2-tutorial --region us-east-1 --default-launch-type EC2 --config-name ec2-tutorial
  2. 使用您的访问密钥和私有密钥创建配置文件:

    ecs-cli configure profile --access-key AWS_ACCESS_KEY_ID --secret-key AWS_SECRET_ACCESS_KEY --profile-name ec2-tutorial

    注意

    如果这是您首次配置 ECS CLI,则这些配置将被标记为默认值。如果这不是您首次配置 ECS CLI,请参阅 ecs-cli configure defaultecs-cli configure profile default,以将其设置为默认配置和配置文件。

步骤 2:创建您的群集

您应执行的首个操作是创建 Amazon ECS 容器实例的集群,您可使用 ecs-cli up 命令在该集群上启动容器。虽然您在使用此命令配置集群时有许多选项可供选择,但大多数选项是可选的。在此示例中,您创建一个包含两个 t2.medium 容器实例的简单集群,这两个实例使用 id_rsa 密钥对进行 SSH 访问(此处替换您自己的密钥对)。

默认情况下,为容器实例创建的安全组将为入站流量打开端口 80。您可以使用 --port 选项指定要打开的其他端口,或者,如果有更复杂的安全组要求,则可指定现有安全组使用 --security-group 选项。

ecs-cli up --keypair id_rsa --capability-iam --size 2 --instance-type t2.medium

创建您的资源时,完成此命令可能需要几分钟的时间。现在您已拥有集群,可以创建 Docker 复合文件并部署该文件。

步骤 3:创建复合文件

在此步骤中,创建一个简单的 Docker 复合文件,此文件将创建包含 Web 服务器和 MySQL 数据库的 WordPress 应用程序。此时,Amazon ECS CLI 支持 Docker 复合文件语法版本 1 和 2。

Amazon ECS CLI 的复合文件中支持以下参数:

  • command

  • cpu_shares

  • dns

  • dns_search

  • entrypoint

  • environment:如果复合文件中未指定环境变量值,但该值存在于 shell 环境中,则 shell 环境变量值将传递到为任何关联的任务或服务创建的任务定义。

    重要

    建议不要对敏感信息 (如凭证数据) 使用纯文本环境变量。

  • env_file

    重要

    建议不要对敏感信息 (如凭证数据) 使用纯文本环境变量。

  • extra_hosts

  • hostname

  • image

  • labels

  • links

  • log_driver (仅限复合文件版本 1)

  • log_opt (仅限复合文件版本 1)

  • logging (仅限复合文件版本 2)

    • driver

    • options

  • mem_limit (以字节为单位)

  • mem_reservation (以字节为单位)

  • ports

  • privileged

  • read_only

  • security_opt

  • ulimits

  • user

  • volumes

  • volumes_from

  • working_dir

重要

此时不支持 build 指令。

有关 Docker 复合文件语法的更多信息,请参阅 Docker 文档中的复合文件参考

以下是复合文件,您可以对它称作 hello-world.yml。每个容器均有 100 个 CPU 单位和 500 MiB 内存。wordpress 容器将为容器实例开放端口 80 以便将流量传入 Web 服务器。还将定义容器的日志记录配置。

version: '2' services: wordpress: image: wordpress cpu_shares: 100 mem_limit: 524288000 ports: - "80:80" links: - mysql logging: driver: awslogs options: awslogs-group: tutorial-wordpress awslogs-region: us-east-1 awslogs-stream-prefix: wordpress mysql: image: mysql cpu_shares: 100 mem_limit: 524288000 environment: MYSQL_ROOT_PASSWORD: password logging: driver: awslogs options: awslogs-group: tutorial-mysql awslogs-region: us-east-1 awslogs-stream-prefix: mysql

步骤 4:将复合文件部署到集群

在创建复合文件后,您可以使用 ecs-cli compose up 命令将其部署到您的集群。默认情况下,此命令查找当前目录中的名为 docker-compose.yml 的文件,但您可以使用 --file 选项指定其他文件。默认情况下,通过此命令创建的资源具有标题中的当前目录,但您可以使用 --project-name project_name 选项覆盖该目录。--create-log-groups 选项将为容器日志创建 CloudWatch 日志组。

ecs-cli compose --file hello-world.yml up --create-log-groups

步骤 5:查看集群上正在运行的容器

在部署复合文件后,您可以使用 ecs-cli ps 命令查看正在您的集群上运行的容器。

ecs-cli ps
Name State Ports TaskDefinition 340488e0-a307-4322-b41c-99f1b70e97f9/wordpress RUNNING 52.89.204.137:80->80/tcp ecscompose-docker-compose:2 340488e0-a307-4322-b41c-99f1b70e97f9/mysql RUNNING ecscompose-docker-compose:2

在上述示例中,您可以查看复合文件中的 wordpressmysql 容器以及 Web 服务器的 IP 地址和端口。如果将 Web 浏览器指向该地址,应会显示 WordPress 安装向导。

步骤 6:在集群上扩展任务

您可以使用 ecs-cli compose scale 命令向上扩展任务计数以便拥有应用程序的更多实例。在此示例中,您可以将应用程序的计数增至两个。

ecs-cli compose --file hello-world.yml scale 2

现在,您的集群中应拥有两个以上的容器。

ecs-cli ps

输出:

Name State Ports TaskDefinition 340488e0-a307-4322-b41c-99f1b70e97f9/wordpress RUNNING 52.89.204.137:80->80/tcp ecscompose-docker-compose:2 340488e0-a307-4322-b41c-99f1b70e97f9/mysql RUNNING ecscompose-docker-compose:2 f80d82d5-3724-4f2f-86b1-5ee5891ce995/mysql RUNNING ecscompose-docker-compose:2 f80d82d5-3724-4f2f-86b1-5ee5891ce995/wordpress RUNNING 52.89.205.89:80->80/tcp ecscompose-docker-compose:2

步骤 7:从复合文件创建 ECS 服务

现在,您已了解您的容器运行正常,可以确保容器在发生故障或停止时被替换。可以使用 ecs-cli compose service up 命令从复合文件创建服务来执行此操作。此命令从最新复合文件创建任务定义(如果任务定义不存在),并使用此任务定义创建预期计数为 1 的 ECS 服务。

在启动您的服务之前,请使用 ecs-cli compose down 命令从复合文件停止容器,以便有可使用的空集群。

ecs-cli compose --file hello-world.yml down

现在,您可以创建服务。

ecs-cli compose --file hello-world.yml service up

输出:

INFO[0000] Using ECS task definition TaskDefinition=ecscompose-docker-compose:2 INFO[0000] Created an ECS Service serviceName=ecscompose-service-docker-compose taskDefinition=ecscompose-docker-compose:2 INFO[0000] Updated ECS service successfully desiredCount=1 serviceName=ecscompose-service-docker-compose INFO[0000] Describe ECS Service status desiredCount=1 runningCount=0 serviceName=ecscompose-service-docker-compose INFO[0015] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=ecscompose-service-docker-compose

步骤 8:清除

在结束此教程后,应清除您的资源以便这些资源不再产生任何费用。首先,删除服务,以便它停止现有容器且不尝试运行任何其他任务。

ecs-cli compose --file hello-world.yml service rm

输出:

INFO[0000] Updated ECS service successfully desiredCount=0 serviceName=ecscompose-service-docker-compose INFO[0000] Describe ECS Service status desiredCount=0 runningCount=1 serviceName=ecscompose-service-docker-compose INFO[0015] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=ecscompose-service-docker-compose INFO[0015] Deleted ECS service service=ecscompose-service-docker-compose INFO[0015] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=ecscompose-service-docker-compose

现在,关闭您的集群,这将清除您先前使用 ecs-cli up 创建的资源。

ecs-cli down --force

输出:

INFO[0000] Waiting for your cluster resources to be deleted INFO[0000] Cloudformation stack status stackStatus=DELETE_IN_PROGRESS INFO[0061] Cloudformation stack status stackStatus=DELETE_IN_PROGRESS INFO[0121] Deleted cluster cluster=ecs-cli-demo