首页 文章

如何找出与ALB关联的ECS群集

提问于
浏览
13

我们在ELB后面运行一个ECS集群(ALB,具体而言) .

我有一个进程允许我通过查询ALB并通过目标组追溯结果然后实例来找出哪个ECS集群与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以便我可以确定ALB在运行实例时将针对哪个ECS群集?

1 回答

  • 10

    它并不是很清楚你要求的是什么,或者你想要实现的目的,但是下面的内容应该让你走上正轨 .

    ECS“集群”实际上只是一个亚马逊服务,当您创建集群时,实际上没有配置任何内容 . 您可以将空集群视为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 时,这将是可能的 .

    因此,查询该属性应告诉您群集是否为“ on ”:

    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
    

相关问题