Como você listaria instâncias usando o aws cli em determinadas VPC com o Nome da tag, o endereço IP privado da instância e o ID da instância?


19

O mais próximo que eu chego é usando os seguintes comandos.

Este comando consegue listar todos os nomes de instâncias.

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

Este comando consegue listar todos os endereços IP privados, ID da instância e TODAS as tags que eu não preciso. Eu só preciso do nome.

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

Não sei por que não consigo executar o comando desta maneira:

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

Este comando funciona, mas está mostrando todos os nomes das Tags Tags.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'

1
Você está apenas copiando esses comandos de algum lugar sem tentar entender o que eles fazem?
Michael Hampton

Na verdade, não, tentei entender como usar o jq e como obter a saída básica do json que desejo. No entanto, não consegui encontrar exemplos para o que estou tentando alcançar. O uso de "Tags [? Key == Name] .Value []" como um filtro para a saída do Valor do Nome da Chave só é possível após o aws-cli v1.3.0. E eu estou usando uma combinação de --filter e jq para obter a saída que eu quero. O comando mais próximo é instâncias de descrição do aws ec2 --filters Nome = vpc-id, Valores = vpc-e2f17e8b | jq '.Reservations []. Instâncias [] | {PrivateIpAddress, InstanceId, Tags} 'Eu só preciso saber como referenciar a Tag Key = Name usando jq.
Imagineer

Respostas:


24

Você precisa escapar das barras invertidas para formatar a resposta corretamente.

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

Portanto, este é o comando real que você deseja:

$ 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

E você não precisa .Value[]. Você pode simplesmente usar .Value, e isso dará a mesma saída.

Isso é incrível, aliás. Eu mesmo implementarei isso!

CORREÇÃO: O item acima não funcionará se o valor de .Valuefor "Nenhum". Isso funciona melhor:

$ 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

Você pode, por favor, explicar seu comando sed? Estou obtendo IDs / nomes de instância por um que possa ser porque não estou entendendo a expansão indireta do shell no sed.
jorfus

3
Se uma instância não for Nomeada (não tiver Tag: key = Nome definido), a próxima instância será impressa na mesma linha. O primeiro comando sed imprime a sequência "None \ n" para atenuar esse problema. O segundo comando sed retira o feed de linha do ID da instância, para que a string Tag: key = Name seja impressa na mesma linha.
DrStrangepork

8

Tente isto

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t

3
Você deve incluir explicações para o seu código. A descrição de como e por que esse código resolve o problema é mais útil, pois ajuda o OP e outros leitores a resolver esses e outros problemas semelhantes.
Anthony G - justiça para Monica

Isso funciona, mas, de fato, por que funciona? |é algum tipo de filtro?
Aairey 22/10

7

As respostas acima são boas, mas a minha favorita é a mesma;

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 fato, pode-se colocá-lo em uma lista da lista de funções do 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 }

basta chamar a partir do prompt como 'awsls'


Como você adiciona várias funções em um arquivo e apenas chama a função desejada?
Stryker

2

Algo assim?

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

1

Eu adicionei um filtro para o estado da instância "running". Publicá-lo aqui, caso seja útil para qualquer pessoa.

Meu caso de uso é um pouco diferente, estou gerando arquivos de host Ansible, então só quero o nome do IP # privado em todos os hosts em execução.

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 }'

0

Adicionando isso às pessoas que encontrarão esta postagem ao pesquisar como obter as informações da sua instância. Você pode adicionar VPC na instrução select para receber isso também.

No PowerShell você pode usar:

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

Com a CLI da AWS, você pode usar:

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName

Editei sua resposta para formatar os comandos como comandos / código. Você poderia verificar se o período no final do seu primeiro comando precisa estar lá? Se não, edite-o, obrigado
JimLohse
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.