Amazon-Web-Services

AWS ECS:服務 + 自動擴展與使用者數據啟動任務

  • March 12, 2018

嘗試使用 EC2 啟動(不是 Fargate,至少目前是這樣)圍繞 ECS。

假設我想使用每個容器實例啟動一個長時間執行的任務。預期的機制似乎是一個服務,它將啟動與我配置一樣多的任務實例——在這種情況下,我從與容器實例相同數量的任務開始。

自動縮放似乎存在於兩層:集群可以自動縮放其實例,服務可以自動縮放任務的數量。如果沒有 Fargate,似乎沒有任何方法可以同步這兩個層。

我想出解決這個限制的一種方法是讓集群上的 CloudWatch 警報觸發橫向擴展,然後在實例創建上使用生命週期掛鉤來觸發服務的橫向擴展。我還沒有弄清楚這將如何用於縮減 - 是否有一些自動生成的服務縮減事件?

然後

我看到了 AWS guide to started a Task on container launch。問題的癥結似乎是這個 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用於執行任務的方法將減輕所有擔憂。

我錯過了什麼?這是具有自動縮放功能的服務的可行替代方案嗎?

在與 AWS 的支持人員討論後,這似乎是解決我的問題的一個很好的解決方案。

為了進行設置,我需要使用以 Amazon ECS 優化 AMI 為基礎的啟動配置創建一個自動擴展組,並為其分配一個具有 ECS 權限的角色。然後我能夠包含使用者數據,如圖所示。當一切配置正確(並且實例具有公共 Internet 訪問權限)時,實例將在啟動時將自己註冊到我的 ECS 集群,它們將執行我的任務。

對於擁有獨立於您要執行的任務的容器,或者對於可以在失敗時重新啟動而不重新啟動整個容器的任務,這不是一個好的解決方案。

引用自:https://serverfault.com/questions/899284