Как узнать, какой кластер ECS связан с ALB
Мы запускаем кластер ECS за ELB (ALB, если быть точным).
У меня есть процесс, который позволяет мне выяснить, какой кластер 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, запрос для целей из целевой группы пуст.
Как я могу использовать API-интерфейс AWS, чтобы определить, на какой кластер ECS будет ориентироваться ALB, если на нем запущены экземпляры?
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