Cómo obtener direcciones de IP de instancias de grupo de escalado automático

16

¿Cómo puedo obtener direcciones IP privadas de todas las instancias que forman parte de un grupo de AutoScaling? Estoy tratando de hacer alguna operación en todas las instancias que forman parte de un grupo de autoescalado.

Ramesh Kumar
fuente

Respuestas:

16

He escrito un pequeño script como el siguiente para obtener la lista de IP:

#! / bin / bash
para i en `aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk '{print $ 2}' | cortar -d ',' -f1 | sed -e 's / "// g'`
hacer
aws ec2 describe-instancias --instance-ids $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | cabeza -1 | cortar -d "," -f1
hecho;
Ramesh Kumar
fuente
votación con todas mis manos
Jameel Grand
voto negativo porque no es prudente analizar json con grep y awk
xenoterracide
puede usar el jqcomando para analizar json
Chase T.
Respuesta perfecta, gracias.
John Humphreys - w00te
10

Como alternativa, mi versión sin jq / awk / sed / cut

$ aws autoscaling describe-auto-scaling-instances --region us-east-1 --output text \
--query "AutoScalingInstances[?AutoScalingGroupName=='ASG-GROUP-NAME'].InstanceId" \
| xargs -n1 aws ec2 describe-instances --instance-ids $ID --region us-east-1 \
--query "Reservations[].Instances[].PrivateIpAddress" --output text
10.228.43.71
10.230.178.160
10.228.15.171
10.233.160.163
10.228.18.123
10.225.222.195
10.237.149.97
10.136.163.109
10.152.35.71
10.233.157.230

Versión más optimizada

# aws ec2 describe-instances --region us-east-1 --instance-ids \
$(aws autoscaling describe-auto-scaling-instances --region us-east-1 --output text \
--query "AutoScalingInstances[?AutoScalingGroupName=='ASG_NAME'].InstanceId") \
--query "Reservations[].Instances[].PrivateIpAddress"
[
    "10.230.178.160",
    "10.152.35.71",
    "10.233.157.230",
    "10.237.149.97",
    "10.228.15.171",
    "10.136.163.109",
    "10.225.222.195",
    "10.233.160.163",
    "10.228.43.71",
    "10.228.18.123"
]

Si solo necesita una lista simple en la salida, puede agregar otra tubería

| jq -r '.[]'

ALex_hha
fuente
esto crea muchas solicitudes de "describir instancias", la mía solo crea una, quiero decir, podrías hacer que solo creara dos, pero tendrías que dejar de usar
xargs
this creates many "describe-instances" requests¿y? Según tengo entendido, su consulta solo funcionará con etiquetas que no son universales, en mi humilde opinión
ALex_hha
El tuyo no es universal tampoco puedo usar el nombre en mis consultas, es un nombre generado que forma parte de un sistema automatizado. Punto es que esto crea unas 10 más 1 peticiones RPC, por tanto, será lento dependiendo del número de casos que tiene
xenoterracide
En realidad, OP no especificó por qué criterios necesita hacer una búsqueda, por lo que es un área gris :)
ALex_hha
Sí, lo sé, así que solo estaba sugiriendo que puede hacer que las consultas sean más eficientes
xenoterracide
1

Similar a la respuesta de Ramesh aquí hay un pequeño guión agradable basado en la instancia actual y su grupo. Asegúrese de establecer su región y en este caso omito la instancia actual (utilizada para la agrupación en clúster). También puede cambiar PrivateIpAddress a Public si es necesario.

#!/bin/bash
wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
sudo chmod u+x ec2-metadata
INSTANCE_ID=$(./ec2-metadata | grep instance-id | awk 'NR==1{print $2}')
AG_NAME=$(aws autoscaling describe-auto-scaling-instances --instance-ids ${INSTANCE_ID} --region eu-west-1 --query AutoScalingInstances[].AutoScalingGroupName --output text)
for ID in $(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names ${AG_NAME} --region eu-west-1 --query AutoScalingGroups[].Instances[].InstanceId --output text);
do
    if [ "${ID}" == ${INSTANCE_ID} ] ; then
        continue;
    fi
    IP=$(aws ec2 describe-instances --instance-ids $ID --region eu-west-1 --query Reservations[].Instances[].PrivateIpAddress --output text)
    # Do what you want with ${IP} here
done
7 maravillas
fuente
1

también puede usar jqpara analizar la salida, es una mala idea usar awk, grep o sed, etc., para analizar una estructura de nodo, similar a que sea una mala idea usar expresiones regulares para analizar html.

$ aws ec2 describe-instances \
--instance-ids $(aws autoscaling describe-auto-scaling-groups \
    |jq -r '.AutoScalingGroups[]| select( .Tags[].Value == "playground").Instances[].InstanceId' \
    |paste -s -d" ") \
| jq -r '.Reservations[].Instances[].PrivateIpAddress'
192.169.0.202
192.169.0.177
192.169.0.160
xenoterracida
fuente
JFYI: aws cli alredy puede filtrar json mediante la opción --query.
ALex_hha
No parece funcionar exactamente de la misma manera
xenoterracide
pero sí, esa es otra forma de hacerlo.
xenoterracide
solo eche un vistazo a mi versión
ALex_hha
Voy a dejar esto aquí, porque incluso si no es la mejor respuesta, creo que jqes una herramienta útil, y dejarlo aquí puede permitir que las personas lo descubran, incluso si con Amazon puedes hacerlo todo con el awscomando
xenoterracide
0

También puede buscar en la interfaz de usuario de la consola web de AWS en EC2 -> Grupos de escalado automático -> Pestaña Instancias. Verá todas las instancias bajo ASG actual, luego puede hacer clic en cada ID de instancia para obtener la IP (lo redirigirá a una vista diferente).

alucinante
fuente
Sí, pero quiero la lista completa, tengo ASG con más de 100 instancias y quiero una lista de IP para aplicar algunas cosas.
Ramesh Kumar
A continuación se muestra el pequeño script que escribí para obtener la lista de IP.
Ramesh Kumar
en ese caso usaría cli, estás en lo correcto.
mindblowwn
0
$instanceIPs = aws ec2 describe-instances --filters "Name=tag:Name,Values=<name-of-your-auto-scaling-group>" --query 'Reservations[].Instances[].PrivateDnsName' --output text

$instanceIPsArray = $instanceIPs.Trim() -split("`t")
foreach($ip in $instanceIPsArray)
{
    //Do something
}
Jeremy
fuente
0

Esto devolverá todos los ips privados de instancias en un ASG

PRIVATEIPS=$(aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=$(aws autoscaling describe-auto-scaling-instances --instance-ids="$(ec2metadata --instance-id)" | jq -r '.AutoScalingInstances[].AutoScalingGroupName')" --query 'Reservations[].Instances[].PrivateIpAddress' --output text --region $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/\(.*\)[a-z]/\1/'))
Josh Edwards
fuente