คุณจะแสดงรายการอินสแตนซ์โดยใช้ aws cli ใน VPC บางรายการด้วยชื่อแท็กที่อยู่ IP ส่วนตัวของอินสแตนซ์และรหัสอินสแตนซ์ได้อย่างไร


19

สิ่งที่ฉันได้รับมากที่สุดคือการใช้คำสั่งต่อไปนี้

คำสั่งนี้จัดการเพื่อแสดงรายการทุกอินสแตนซ์

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

คำสั่งนี้จัดการเพื่อแสดงรายการที่อยู่ IP ส่วนตัว, รหัสอินสแตนซ์และแท็กทั้งหมดที่ฉันไม่ต้องการ ฉันแค่ต้องการชื่อ

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 เท่านั้น และฉันใช้การรวมกันของ - ตัวกรองและ jq เพื่อให้ได้ผลลัพธ์ที่ฉันต้องการ คำสั่งที่ใกล้เคียงที่สุดคือ aws ec2 อธิบาย - อินสแตนซ์ --filters Name = vpc-id, Values ​​= vpc-e2f17e8b | jq '.Reservations []. Instances [] | {PrivateIpAddress, InstanceId, Tags} 'ฉันแค่ต้องรู้วิธีอ้างอิง Key Key = ชื่อโดยใช้ jq
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เป็น "ไม่มี" วิธีนี้ใช้งานได้ดีกว่า:

$ 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 ของคุณได้มั้ย ฉันได้รับ ID / ชื่ออินสแตนซ์ออกโดยหนึ่งซึ่งอาจเป็นเพราะฉันไม่เข้าใจการขยายเชลล์ทางอ้อมใน sed
jorfus

3
หากอินสแตนซ์ไม่ได้ตั้งชื่อ (ไม่มีชุด Tag: key = ชื่อ) แสดงว่าอินสแตนซ์ถัดไปได้รับการพิมพ์ในบรรทัดเดียวกัน คำสั่ง sed แรกพิมพ์สตริง "None \ n" เพื่อลดปัญหาดังกล่าว คำสั่ง sed ที่สองตัด linefeed ออกจาก instance-id ดังนั้นสตริง 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 - ความยุติธรรมสำหรับโมนิก้า

มันใช้งานได้ แต่ทำไมมันถึงใช้ได้ |กรองบางอย่าง?
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'


คุณจะเพิ่มฟังก์ชั่นหลายอย่างในไฟล์เดียวและเรียกใช้ฟังก์ชันที่คุณต้องการได้อย่างไร
สไตรเกอร์

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

การเพิ่มสิ่งนี้สำหรับผู้ที่จะพบโพสต์นี้เมื่อค้นหาวิธีรับข้อมูลอินสแตนซ์ของคุณ คุณสามารถเพิ่ม VPC ในคำสั่ง select เพื่อรับเช่นกัน

ใน 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.