Путь JMES / AWS - получить имя балансировщика нагрузки для данного идентификатора экземпляра

Мне нужно найти балансировщик нагрузки, к которому подключен данный экземпляр EC2, с помощью интерфейса командной строки AWS. У меня есть рабочее решение, использующее jq, однако я бы хотел избежать установки jq в качестве зависимости и, если возможно, написать запрос в JMESPath. Я застрял в формате запроса выражения JMESPath.

Я нашел этот вопрос: Фильтр LoadBalancer по идентификатору VPC, это именно то, что я пытаюсь сделать, кроме фильтрации по идентификатору экземпляра, а не по идентификатору VPC. Я думаю, проблема в том, что идентификаторы экземпляров находятся в массиве.

Рабочее решение с jq:

 aws elb describe-load-balancers | jq -r '.LoadBalancerDescriptions[] | select(.Instances[].InstanceId == "i-12345678") | .LoadBalancerName

Что я пытаюсь с JMESPath:

aws elb describe-load-balancers --query "LoadBalancerDescriptions[?Instances[].InstanceId=='i-12345678'] | [].LoadBalancerName"

Я чувствую, что очень близок, но упускаю что-то фундаментальное.

Пример вывода в формате JSON команды describe-load-balancers из документации AWS:

{
  "LoadBalancerDescriptions": [
    {
      "Subnets": [
          "subnet-15aaab61"
      ],
      "CanonicalHostedZoneNameID": "Z3DZXE0EXAMPLE",
      "CanonicalHostedZoneName": "my-load-balancer-1234567890.us-west-2.elb.amazonaws.com",
      "ListenerDescriptions": [
          {
              "Listener": {
                  "InstancePort": 80,
                  "LoadBalancerPort": 80,
                  "Protocol": "HTTP",
                  "InstanceProtocol": "HTTP"
              },
              "PolicyNames": []
          },
          {
              "Listener": {
                  "InstancePort": 443,
                  "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-cert",
                  "LoadBalancerPort": 443,
                  "Protocol": "HTTPS",
                  "InstanceProtocol": "HTTPS"
              },
              "PolicyNames": [
                  "ELBSecurityPolicy-2015-03"
              ]
          }
      ],
      "HealthCheck": {
          "HealthyThreshold": 2,
          "Interval": 30,
          "Target": "HTTP:80/png",
          "Timeout": 3,
          "UnhealthyThreshold": 2
      },
      "VPCId": "vpc-a01106c2",
      "BackendServerDescriptions": [
          {
              "InstancePort": 80,
              "PolicyNames": [
                  "my-ProxyProtocol-policy"
              ]
          }
      ],
      "Instances": [
          {
              "InstanceId": "i-207d9717"
          },
          {
              "InstanceId": "i-afefb49b"
          }
      ],
      "DNSName": "my-load-balancer-1234567890.us-west-2.elb.amazonaws.com",
      "SecurityGroups": [
          "sg-a61988c3"
      ],
      "Policies": {
          "LBCookieStickinessPolicies": [
              {
                  "PolicyName": "my-duration-cookie-policy",
                  "CookieExpirationPeriod": 60
              }
          ],
          "AppCookieStickinessPolicies": [],
          "OtherPolicies": [
              "my-PublicKey-policy",
              "my-authentication-policy",
              "my-SSLNegotiation-policy",
              "my-ProxyProtocol-policy",
              "ELBSecurityPolicy-2015-03"
          ]
      },
      "LoadBalancerName": "my-load-balancer",
      "CreatedTime": "2015-03-19T03:24:02.650Z",
      "AvailabilityZones": [
          "us-west-2a"
      ],
      "Scheme": "internet-facing",
      "SourceSecurityGroup": {
          "OwnerAlias": "123456789012",
          "GroupName": "my-elb-sg"
      }
    }
  ]
}

person Chris    schedule 14.07.2016    source источник


Ответы (3)


Поскольку Instances является массивом, вам следует использовать функцию contains для поиска идентификатора вашего экземпляра. .

aws elb describe-load-balancers --query LoadBalancerDescriptions[?contains(Instances[*].InstanceId,`i-12345678`)].LoadBalancerName
person junkangli    schedule 21.05.2020

Используйте LoadBalancerDescriptions[?Instances[*].InstanceId==`i-55555555`] для перебора экземпляров.

LoadBalancerDescriptions[?Instances[0].InstanceId==`i-55555555`] будет использовать только первый элемент в массиве.

person Whitney    schedule 21.05.2020

person    schedule
comment
Я все еще получаю пустой массив: [ec2-user @ i-12345678 ~] $ aws elb describe-load-balancers --query LoadBalancerDescriptions [? Instances [0] .InstanceId == 'i-12345678']. LoadBalancerName [] - person Chris; 14.07.2016