특정 VPC에서 aws cli를 사용하여 태그 이름, 인스턴스의 프라이빗 IP 주소 및 인스턴스 ID를 사용하여 인스턴스를 나열하는 방법은 무엇입니까?


19

가장 가까운 것은 다음 명령을 사용하는 것입니다.

이 명령은 모든 인스턴스 이름을 나열합니다.

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

이 명령은 필요하지 않은 모든 개인 IP 주소, 인스턴스 ID 및 모든 태그를 나열합니다. 이름 만 있으면됩니다

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

왜 이런 식으로 명령을 실행할 수 없는지 잘 모르겠습니다.

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

이 명령은 작동하지만 모든 태그 키 이름을 표시합니다.

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

1
무엇을하는지 이해하지 않고 어딘가에서이 명령을 복사하고 있습니까?
Michael Hampton

실제로 jq를 사용하는 방법과 원하는 기본 json 출력을 얻는 방법을 이해하려고했습니다. 그러나 달성하려는 것에 대한 예를 찾을 수 없었습니다. "태그 [? Key == Name] .Value []"를 키 이름 값 출력용 필터로 사용하는 것은 aws-cli v1.3.0 이후에만 가능합니다. 그리고 --filter와 jq의 조합을 사용하여 원하는 출력을 얻습니다. 가장 가까운 명령은 aws ec2 describe-instances --filters Name = vpc-id, Values ​​= vpc-e2f17e8b | jq '. 예약 []. 인스턴스 [] | {PrivateIpAddress, InstanceId, Tags} 'jq를 사용하여 Tag Key = Name을 참조하는 방법을 알아야합니다.
Imagineer

답변:


24

답변의 형식을 올바르게 지정하려면 백 슬래시를 이스케이프 처리해야합니다.

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

따라서 이것은 실제 명령입니다.

$ 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

그리고 당신은 필요하지 않습니다 .Value[]. 을 사용할 수 있으며 .Value동일한 출력을 제공합니다.

정말 대단해. 나는 이것을 직접 구현할 것이다!

수정 :.Value이 "None" 이면 위의 내용이 작동하지 않습니다 . 이것은 더 잘 작동합니다.

$ 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

sed 명령을 설명해 주시겠습니까? sed의 간접 셸 확장을 이해하지 못하기 때문에 인스턴스 ID / 이름을 얻습니다.
jorfus

3
인스턴스의 이름이 지정되지 않은 경우 (Tag : key = Name이 설정되지 않은 경우) 다음 인스턴스는 같은 줄에 인쇄됩니다. 첫 번째 sed 명령은 문자열 "None \ n"을 인쇄하여 해당 문제를 완화합니다. 두 번째 sed 명령은 인스턴스 피드에서 줄 바꿈을 제거하여 Tag : key = Name 문자열이 같은 줄에 인쇄되도록합니다.
DrStrangepork

8

이 시도

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

3
코드에 대한 설명을 포함해야합니다. 이 코드로 문제를 해결하는 방법과 이유를 설명하면 OP 및 기타 독자가이 문제와 비슷한 문제를 스스로 해결할 수 있으므로 더 유용합니다.
Anthony G-Monica에 대한 정의

이것은 효과가 있지만 실제로 왜 효과가 있습니까? |어떤 종류의 필터입니까?
aairey

7

위의 답변은 괜찮지 만 내가 가장 좋아하는 것은 다음과 같습니다.

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

실제로,이를 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 }

그런 다음 프롬프트에서 'awsls'로 전화하십시오.


하나의 파일에 여러 함수를 어떻게 추가하고 원하는 함수를 호출합니까?
Stryker

2

이 같은?

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

1

인스턴스 상태 "실행 중"에 대한 필터를 추가했습니다. 누군가에게 도움이 될 수 있도록 여기에 게시하십시오.

유스 케이스가 약간 다르므로 Ansible 호스트 파일을 생성하므로 실행중인 모든 호스트에서 개인 IP # 이름을 원합니다.

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

인스턴스 정보를 얻는 방법을 검색 할 때이 게시물을 찾을 사람들을 위해 이것을 추가하십시오. select 문에 VPC를 추가하여 VPC를받을 수도 있습니다.

powershell에서는 다음을 사용할 수 있습니다.

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

AWS CLI를 사용하면 다음을 사용할 수 있습니다.

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

명령을 명령 / 코드로 형식화하기 위해 답변을 편집했습니다. 첫 번째 명령이 끝날 때까지의 기간이 있는지 다시 확인 하시겠습니까? 그렇지 않은 경우, 감사합니다
JimLohse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.