Как узнать, какой кластер ECS связан с ALB - программирование
Подтвердить что ты не робот

Как узнать, какой кластер ECS связан с ALB

Мы запускаем кластер ECS за ELB (для конкретных целей).

У меня есть процесс, который позволяет мне узнать, какой кластер ECS связан с ALB, запросив ALB и отслеживая результаты через целевую группу, а затем экземпляры:


Вот сценарий bash:

ELB_NAME=$(aws route53 list-resource-record-sets --hosted-zone-id <Zone-ID> | jq -r --arg URL "$URL"'.ResourceRecordSets[]|select(.Name==$URL)|.AliasTarget.DNSName')

ELB_NAME=$(echo $ELB_NAME | cut -f 2- -d "." | rev | cut -f 2- -d "." | rev)

ELB_ARN=$(aws elbv2 describe-load-balancers | jq -r --arg ELB_NAME "$ELB_NAME" '.LoadBalancers[]|select((.DNSName|ascii_downcase)==$ELB_NAME)|.LoadBalancerArn')

TG_ARNS=$(aws elbv2 describe-target-groups | jq -r --arg ELB_ARN "$ELB_ARN" '.TargetGroups[]|select(.LoadBalancerArns[]==$ELB_ARN)|.TG_ARN=$(echo $TG_ARNS | cut -f 1 -d " ")

INSTANCE_ID=$(aws elbv2 describe-target-health --target-group-arn $TG_ARN | jq -r '.TargetHealthDescriptions[].Target.Id' | head -n 1)

CLUSTER=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID | jq -r '.Reservations[].Instances[].Tags[]|select(.Key=="aws:cloudformation:stack-name")|.Value' | cut -f 2 -d "-")

Проблема заключается в том, что, когда нет запущенных экземпляров, связанных с кластером ECS, я больше не могу запрашивать их для тега, который возвращает имя стека Cloudformation, запрос целевых объектов из целевой группы пуст.

Как я могу использовать AWS API, чтобы я мог определить, какой кластер ECS будет нацелен на ALB, если у него были запущенные экземпляры?

4b9b3361

Ответ 1

Это не совсем понятно, о чем вы просите, или о цели, которую вы пытаетесь достичь, но следующее должно поставить вас на правильный путь.

"Кластер ECS" на самом деле является просто услугой Amazon, когда вы создаете кластер, на самом деле ничего не предусмотрено. Вы можете представить пустой кластер в качестве записи или заполнителя в службе ECS.

Чтобы делать что-либо с кластером, ему нужны экземпляры. Когда вы загружаете компьютер EC2 из поддерживаемого AMI, соответствующей роли IAM и имени кластера, записанного в файл конфигурации, экземпляр присоединяется к кластеру. (Если вы создаете кластер через консоль AWS, создается шаблон CloudFormation, который обрабатывает подготовку и согласование этих шагов.) Управление кластером ECS может затем планировать задачи и службы на этом экземпляре, как вы определили в службе ECS.

Без каких-либо случаев не может быть никаких контейнеров для прослушивания, поэтому в вашем ALB не может быть никаких целевых групп, которые направляются на что угодно. Таким образом, невозможно get from the ELB to the cluster... как вы просили, когда нет запущенных экземпляров.

Вы можете найти следующие команды - лучший способ определить, есть ли у вас работающий кластер.

Во-первых, используйте команду list-clusters чтобы показать, какие кластеры доступны:

aws ecs list-clusters 
{
    "clusterArns": [
        "arn:aws:ecs:eu-west-1:XXXXXXXXX:cluster/your_cluster"
    ]
}

Затем используйте вывод из этого, чтобы показать, есть ли экземпляры EC2, зарегистрированные в кластере:

aws ecs describe-clusters --clusters your_cluster
{
    "clusters": [
        {
            "status": "ACTIVE", 
            "statistics": [], 
            "clusterName": "your_cluster", 
            "registeredContainerInstancesCount": 1, 
            "pendingTasksCount": 0, 
            "runningTasksCount": 0, 
            "activeServicesCount": 0, 
            "clusterArn": "arn:aws:ecs:eu-west-1:XXXXXXXXX:cluster/your_cluster"
        }
    ], 
    "failures": []
}

Обратите внимание, что свойство registeredContainerInstancesCount показывает количество запущенных экземпляров. Я предполагаю, что у вас есть ваши службы ECS, чтобы регистрировать задачи (контейнеры) с помощью ALB, поэтому, когда счетчик больше 0, это будет возможно.

Таким образом, запрашивая эту собственность должна сказать вам, если ваш кластер "на" или нет:

if [[ $(aws ecs describe-clusters --clusters your_cluster | jq -r '.clusters[].registeredContainerInstancesCount') -gt 0 ]] ; then 
  echo "cluster is on"
else 
  echo "cluster is off"
fi