AWS ECS:服务 + 自动扩展与用户数据启动任务

AWS ECS:服务 + 自动扩展与用户数据启动任务

尝试使用 EC2 启动 (不是 Fargate,至少现在) 来理解 ECS。

假设我要使用每个容器实例启动一个长时间运行的任务。此任务的预期机制似乎是一个服务,它将启动我配置的尽可能多的任务实例 - 在这种情况下,我以与容器实例相同数量的任务开始。

自动扩展似乎存在于两个层面:集群可以自动扩展其实例,服务可以自动扩展任务数量。如果没有 Fargate,似乎没有任何方法可以同步这两个层面。

我想到的一个解决此限制的方法是通过 CloudWatch 警报触发扩展,然后在实例创建时使用生命周期钩子来触发服务的扩展。我还没有弄清楚这对于缩减如何起作用 - 是否有一些针对服务缩减的自动生成事件?

然后

我看见关于在容器启动时启动任务的 AWS 指南问题的关键似乎在于这个 MIME 用户数据:

Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0

--==BOUNDARY==
Content-Type: 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/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==--

虽然文章开头有一个免责声明,但我理解它的意思是使用这种awscli运行任务的方法可以减轻所有顾虑。

我是不是漏掉了什么?这是自动缩放服务的可行替代方案吗?

答案1

在与 AWS 的支持人员讨论后,这似乎是一个很好的解决方案。

为了进行设置,我需要使用以 Amazon ECS 优化的 AMI 为基础的启动配置创建一个自动扩展组,并为其分配具有 ECS 权限的角色。然后,我就可以包含用户数据,如下所示。当所有配置正确(并且实例具有公共互联网访问权限)后,实例将在启动时自行注册到我的 ECS 集群,并运行我的任务。

对于拥有独立于您要运行的任务的容器,或者在任务失败时无需重新启动整个容器即可重新启动的任务,这不是一个好的解决方案。

相关内容