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.

在容器实例启动时启动任务

根据您的应用程序架构设计,您可能需要在每个容器实例上运行一个特定容器以处理操作或安全问题,例如监控、安全性、指标、服务发现或日志记录。

为此,您可以将容器实例配置为在启动时或在某些 init 系统 (如 Upstart 或 systemd) 中使用用户数据脚本调用 docker run 命令。虽然此方法可行,但它有一些缺点,因为 Amazon ECS 不了解容器并且无法监控 CPU、内存、端口或已使用的任何其他资源。要确保 Amazon ECS 可正确了解所有任务资源,请为要在容器实例上运行的容器创建任务定义。然后,使用 Amazon ECS 在启动时利用 Amazon EC2 用户数据放置任务。

以下过程中的 Amazon EC2 用户数据脚本使用 Amazon ECS 自检 API 来确定容器实例。然后,它将使用 AWS CLI 和 start-task 命令在启动期间对自身运行指定任务。

在容器实例启动时启动任务

  1. 如果您尚未这样做,请按照创建任务定义中的过程操作以使用要在启动时在容器实例上运行的容器创建任务定义。

  2. 修改您的 ecsInstanceRole IAM 角色以便为 StartTask API 操作添加权限。有关更多信息,请参阅 Amazon ECS 容器实例 IAM 角色

    1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

    2. 在导航窗格中,选择 Roles

    3. 选择 ecsInstanceRole. 如果角色不存在,请使用 Amazon ECS 容器实例 IAM 角色中的过程来创建角色并返回此过程。如果角色存在,请选择角色以查看附加的策略。

    4. Inline Policies 部分中,选择 Create Role Policy

    5. Set Permissions 页面上,选择 Custom PolicySelect

    6. 对于 Policy Name,输入 StartTask

    7. 对于 Policy Document,复制并粘贴以下策略,然后选择 Apply Policy

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:StartTask" ], "Resource": "*" } ] }
  3. 按照启动 Amazon ECS 容器实例中的过程 (步骤 7 除外) 启动一个或多个容器实例。然后,将以下 MIME 分段用户数据脚本复制并粘贴到 User data 字段中。将 your_cluster_name 替换为要注册到的容器实例的群集,并将 my_task_def 替换为要在启动时在实例上运行的任务定义。

    注意

    以下 MIME 分段内容使用 Shell 脚本设置配置值和安装程序包。它还将使用 Upstart 作业在 ecs 服务已在运行且自检 API 可用后启动任务。

    Copy
    Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/text/x-shellscript; charset="us-ascii" #!/bin/bash # Specify the cluster that the container instance should register into cluster=your_cluster_name # Write the cluster configuration variable to the ecs.config file # (add any other configuration variables here also) echo ECS_CLUSTER=$cluster >> /etc/ecs/ecs.config # Install the AWS CLI and the jq JSON parser yum install -y aws-cli jq --==BOUNDARY== Content-Type: text/text/upstart-job; charset="us-ascii" #upstart-job description "Amazon EC2 Container Service (start task on instance boot)" author "Amazon Web Services" start on started ecs script exec 2>>/var/log/ecs/ecs-start-task.log set -x until curl -s http://localhost:51678/v1/metadata do sleep 1 done # Grab the container instance ARN and AWS region from instance metadata instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' ) cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster' | awk -F/ '{print $NF}' ) region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}') # Specify the task definition to run at launch task_definition=my_task_def # Run the AWS CLI start-task command to start your task on this container instance aws ecs start-task --cluster $cluster --task-definition $task_definition --container-instances $instance_arn --started-by $instance_arn --region $region end script --==BOUNDARY==--
  4. 验证您的容器实例是否启动到正确的集群中以及您的任务是否已启动。

    1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

    2. 在导航栏中,选择集群所在的区域。

    3. 在导航窗格中,选择 Clusters 并选择托管您的容器实例的群集。

    4. Cluster 页面上,选择 Tasks

       ECS Instances 选项卡

      您启动的每个容器实例均应有在其上运行的任务,并且容器实例 ARN 应在 Started By 列中。

      如果没有看到任务,可以使用 SSH 登录容器实例,在 /var/log/ecs/ecs-start-task.log 文件中查看调试信息。