¿Cómo haría para enumerar instancias usando aws cli en ciertas VPC con el nombre de etiqueta, la dirección IP privada de la instancia y la identificación de la instancia?

19

Lo más cercano que tengo es usar los siguientes comandos.

Este comando logra enumerar todos los nombres de instancias.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value[]'

Este comando logra enumerar todas las direcciones IP privadas, id de instancia y TODAS las etiquetas que no necesito. Solo necesito el nombre.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b | jq '.Reservations[].Instances[] | {PrivateIpAddress, InstanceId, Tags}'

No estoy seguro de por qué no puedo ejecutar comandos de esta manera:

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags[?Key==`Name`].Value[]'

Este comando funciona pero muestra todos los nombres de las etiquetas clave.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'
Imagineer
fuente
1
¿Estás copiando estos comandos desde algún lugar sin tratar de entender lo que hacen?
Michael Hampton
En realidad no, intenté entender cómo usar jq y cómo obtener la salida json básica que quiero. Sin embargo, no pude encontrar ningún ejemplo de lo que estoy tratando de lograr. El uso de "Etiquetas [? Clave == Name] .Valor []" como filtro para la salida de Valor de nombre de clave solo es posible después de aws-cli v1.3.0. Y estoy usando una combinación de --filter y jq para obtener la salida que quiero. El comando más cercano es aws ec2 describe-instancia --filtros Nombre = vpc-id, Valores = vpc-e2f17e8b | jq '. Reservas []. Instancias [] | {PrivateIpAddress, InstanceId, Tags} 'Solo necesito saber cómo hacer referencia a Tag Key = Name usando jq.
Imagineer

Respuestas:

24

Debe escapar de las barras diagonales inversas para formatear la respuesta correctamente.

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'

Entonces este es el comando real que deseas:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2

Y no lo necesitas .Value[]. Simplemente puede usar .Value, y eso dará el mismo resultado.

Esto es impresionante, por cierto. ¡Lo implementaré yo mismo!

CORRECCIÓN: Lo anterior no funcionará si el valor de .Valuees "Ninguno". Esto funciona mejor:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2
10.101.255.8    i-f6c2450a      None
10.101.255.7    i-34a6afce Server3
DrStrangepork
fuente
¿Puedes explicar tu comando sed? Estoy obteniendo ID / nombres de instancia por uno, lo que podría deberse a que no estoy entendiendo la expansión indirecta del shell en el sed.
jorfus
3
Si una instancia no tiene nombre (no tiene etiqueta: clave = nombre establecido), la siguiente instancia se imprime en la misma línea. El primer comando sed imprime la cadena "None \ n" para mitigar ese problema. El segundo comando sed elimina el avance de línea del id de instancia, de modo que la cadena Tag: key = Name se imprime en la misma línea.
DrStrangepork
8

Prueba esto

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t
alf-man
fuente
3
Debe incluir una explicación para su código. Describir cómo y por qué este código resuelve el problema es más útil, ya que ayuda al OP y a otros lectores a resolver este y otros problemas similares.
Anthony G - justicia para Monica
Esto funciona, pero de hecho, ¿por qué funciona? |es algún tipo de filtro?
aairey
7

Las respuestas anteriores están bien, pero mi favorita es la misma;

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t

de hecho, uno puede colocarlo en una lista de funciones BASH;

awsls () { aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t }

luego simplemente llame desde el indicador como 'awsls'

Jorge de la Torre
fuente
¿Cómo agrega múltiples funciones en un archivo y simplemente llama a la función que desea?
Stryker
2

¿Algo como esto?

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
Alan
fuente
1

Agregué un filtro, por ejemplo, estado "en ejecución". Publicarlo aquí en caso de que sea útil para alguien.

Mi caso de uso es ligeramente diferente, estoy generando archivos de host Ansible, así que solo quiero el nombre privado de IP # en todos los hosts en ejecución.

aws ec2 describe-instances --profile=$PROFILE --filters Name=vpc-id,Values=$VPCID Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /' | awk '{print $1 " #" $2 }'
jorfus
fuente
0

Agregue esto para las personas que encontrarán esta publicación cuando busquen cómo obtener su información de instancia. Puede agregar VPC en la instrucción select para recibir eso también.

En powershell puedes usar:

(Get-EC2Instance -ProfileName Profile).Instances | select InstanceId,PrivateIPAddress,PublicIpAddress @{Name="Servername";Expression={$_.tags | where key -eq "Name" | select Value -expand Value}} | Format-Table.

Con la AWS CLI puede usar:

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName
Jose Adams
fuente
Edité su respuesta para formatear los comandos como comandos / código. ¿Podría verificar que el período al final de su primer comando deba estar allí? Si no,
edítelo