我们在ELB(具体来说是ALB)后面运行ECS集群。
我有一个过程,可以通过查询ALB并将结果追溯到目标组然后再追溯到实例来找出与ECB群集相关联的ECS:
这是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,以便确定ALB在运行实例的情况下将针对哪个ECS集群?
答案 0 :(得分:10)
目前尚不清楚您的要求是什么,或者实际上您想要达到的目的是什么,但是以下内容应该可以使您走上正确的道路。
ECS“集群”实际上只是一项Amazon服务,当您创建集群时,实际上并没有提供任何资源。您可以将空群集视为ECS服务中的记录或占位符。
为了对集群执行任何操作,它需要实例。从支持的AMI,适当的IAM角色和写入配置文件的群集名称启动EC2计算机时,实例将加入群集。 (如果您通过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