ครั้งแรกผมรู้สึกว่าจำเป็นต้องโพสต์คำตอบใหม่เพราะปัญหาที่ลึกซึ้งต่อไปนี้มีคำตอบที่มีอยู่และหลังจากที่ได้รับคำถามเกี่ยวกับฉันแสดงความคิดเห็นใน @ qwertzguy ของคำตอบ นี่คือปัญหาเกี่ยวกับคำตอบปัจจุบัน:
- คำตอบที่ได้รับการยอมรับจาก @MatthieuCerda แน่นอนไม่ทำงานอย่างน้อยไม่ได้ในกรณีใด ๆ ที่ฉัน VPC ตรวจสอบกับ (ในกรณีของฉันฉันได้รับชื่อ VPC
hostname -d
ซึ่งใช้สำหรับ DNS ภายในไม่ใช่ชื่อ "amazonaws.com" ในนั้น)
- สูงสุดลงมติคำตอบจาก @qwertzguy ไม่ทำงานบน M5 หรือ c5 ใหม่กรณีที่ไม่ได้มีไฟล์นี้ อเมซอนละเลยการบันทึกพฤติกรรมนี้เปลี่ยน AFAIK แม้ว่าหน้าเอกสารในหัวข้อนี้จะพูดว่า "... หาก / sys / hypervisor / uuid มีอยู่ ... " ฉันถามฝ่ายสนับสนุน AWS ว่าการเปลี่ยนแปลงนี้เป็นการจงใจหรือไม่โปรดดูด้านล่าง†
- คำตอบจาก @Jerไม่จำเป็นต้องทำงานทุกที่เพราะ
instance-data.ec2.internal
การค้นหา DNS อาจไม่ทำงาน ในอินสแตนซ์ของ Ubuntu EC2 VPC ที่ฉันเพิ่งทดสอบฉันเห็น:
$ curl http://instance-data.ec2.internal
curl: (6) Could not resolve host: instance-data.ec2.internal
ซึ่งจะทำให้โค้ดที่ใช้วิธีนี้ในการสรุปว่ามันไม่ได้อยู่บน EC2 อย่างผิด ๆ !
- คำตอบที่จะใช้
dmidecode
จาก @tamale อาจทำงานได้ แต่อาศัยอยู่กับคุณ.) มีdmidecode
พร้อมใช้งานบนอินสแตนซ์ของคุณและข.) มีรากหรือsudo
ความสามารถในการใช้รหัสผ่านน้อยจากภายในรหัสของคุณ
- คำตอบที่จะตรวจสอบ sys / / อุปกรณ์ / เสมือน / DMI / ID / bios_versionจาก @spkane เป็นอันตรายทำให้เข้าใจผิด! ฉันจะตรวจสอบหนึ่งตัวอย่าง M5 อูบุนตู 14.04 และมีของ
bios_version
1.0
ไฟล์นี้ไม่ได้รับการบันทึกไว้ในเอกสารของ Amazonดังนั้นฉันจะไม่เชื่อถือมัน
- ส่วนแรกของคำตอบจาก @ Chris-Montanaroเพื่อตรวจสอบ URL ของบุคคลที่สามที่ไม่น่าเชื่อถือและการใช้
whois
กับผลลัพธ์นั้นเป็นปัญหาในหลายระดับ โปรดทราบว่า URL ที่แนะนำในคำตอบนั้นคือหน้า 404 ในขณะนี้! แม้ว่าคุณจะพบบริการของบุคคลที่สามที่ทำงานได้ก็จะค่อนข้างช้ามาก (เทียบกับการตรวจสอบไฟล์ในเครื่อง) และอาจพบปัญหาการ จำกัด อัตราหรือปัญหาเครือข่ายหรืออินสแตนซ์ EC2 ของคุณอาจไม่มี การเข้าถึงเครือข่ายภายนอก
- ข้อเสนอแนะที่สองในคำตอบจาก @ Chris-Montanaroเพื่อตรวจสอบhttp://169.254.169.254/ดีกว่านิดหน่อย แต่ผู้วิจารณ์คนอื่นตั้งข้อสังเกตว่าผู้ให้บริการคลาวด์รายอื่นทำให้ URL เมตาดาต้าอินสแตนซ์นี้พร้อมใช้งานดังนั้นคุณต้องระวัง บวก นอกจากนี้ยังจะช้ากว่าไฟล์ในเครื่องฉันเห็นว่าการตรวจสอบนี้ช้ามาก (หลายวินาทีเพื่อส่งคืน) บนอินสแตนซ์ที่โหลดหนัก นอกจากนี้คุณควรจำไว้ว่าให้ส่งผ่าน
-m
หรือ--max-time
โต้แย้งเพื่อม้วนงอเพื่อหลีกเลี่ยงการถูกแขวนไว้เป็นเวลานานโดยเฉพาะอย่างยิ่งในกรณีที่ไม่ใช่ EC2 ซึ่งที่อยู่นี้อาจนำไปสู่ที่ใดก็ได้และแขวน (ตามคำตอบของ @ algal )
นอกจากนี้ผมไม่เห็นคนที่ได้กล่าวถึงAmazon ของเอกสารทางเลือกของการตรวจสอบสำหรับ (เป็นไปได้) /sys/devices/virtual/dmi/id/product_uuid
ไฟล์
ใครจะรู้ว่าการพิจารณาว่าคุณกำลังทำงานบน EC2 อาจซับซ้อนหรือไม่! ตกลงตอนนี้เรามี (ส่วนใหญ่) ของปัญหาเกี่ยวกับวิธีการที่ระบุไว้ในรายการที่นี่เป็นตัวอย่างทุบตีแนะนำเพื่อตรวจสอบว่าคุณกำลังทำงานบน EC2 ฉันคิดว่าสิ่งนี้ควรใช้งานได้กับทุกอินสแตนซ์ Linux เกือบทุกกรณีอินสแตนซ์ของ Windows เป็นแบบฝึกหัดสำหรับผู้อ่าน
#!/bin/bash
# This first, simple check will work for many older instance types.
if [ -f /sys/hypervisor/uuid ]; then
# File should be readable by non-root users.
if [ `head -c 3 /sys/hypervisor/uuid` == "ec2" ]; then
echo yes
else
echo no
fi
# This check will work on newer m5/c5 instances, but only if you have root!
elif [ -r /sys/devices/virtual/dmi/id/product_uuid ]; then
# If the file exists AND is readable by us, we can rely on it.
if [ `head -c 3 /sys/devices/virtual/dmi/id/product_uuid` == "EC2" ]; then
echo yes
else
echo no
fi
else
# Fallback check of http://169.254.169.254/. If we wanted to be REALLY
# authoritative, we could follow Amazon's suggestions for cryptographically
# verifying their signature, see here:
# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
# but this is almost certainly overkill for this purpose (and the above
# checks of "EC2" prefixes have a higher false positive potential, anyway).
if $(curl -s -m 5 http://169.254.169.254/latest/dynamic/instance-identity/document | grep -q availabilityZone) ; then
echo yes
else
echo no
fi
fi
เห็นได้ชัดว่าคุณสามารถขยายสิ่งนี้ด้วยการตรวจสอบทางเลือกมากขึ้นและรวมถึงความหวาดระแวงเกี่ยวกับการจัดการเช่นการบวกผิด ๆ จาก/sys/hypervisor/uuid
การเริ่มต้นด้วย "ec2" โดยบังเอิญและอื่น ๆ แต่นี่เป็นวิธีแก้ปัญหาที่ดีพอสำหรับวัตถุประสงค์ในการอธิบายและอาจเป็นกรณีการใช้ที่ไม่ใช่ทางพยาธิวิทยาเกือบทั้งหมด
[†] กลับคำอธิบายนี้จากฝ่ายสนับสนุน AWS เกี่ยวกับการเปลี่ยนแปลงสำหรับอินสแตนซ์ c5 / m5:
C5 และ M5 กรณีใช้สแต็คไฮเปอร์ไวเซอร์ใหม่และโปรแกรมควบคุมเคอร์เนลที่เกี่ยวข้องไม่ได้สร้างไฟล์ใน sysfs (ซึ่งจะติดตั้งอยู่ที่ sys /) ในขณะที่คนขับรถ Xen ใช้โดยอื่น ๆ / เก่าประเภทเช่นทำ วิธีที่ดีที่สุดในการตรวจสอบไม่ว่าจะเป็นระบบปฏิบัติการที่ทำงานอยู่ในอินสแตนซ์ EC2 คือการบัญชีสำหรับความเป็นไปได้ที่แตกต่างกันที่ระบุไว้ในเอกสารที่คุณเชื่อมโยง