Đầu tiên, tôi cảm thấy cần phải đăng một câu trả lời mới vì những vấn đề tế nhị sau đây với các câu trả lời hiện có và sau khi nhận được câu hỏi về nhận xét của tôi về câu trả lời của @ qwertzguy . Dưới đây là các vấn đề với các câu trả lời hiện tại:
- Các câu trả lời được chấp nhận từ @MatthieuCerda chắc chắn không làm việc đáng tin cậy, ít nhất là không phải trên bất kỳ trường hợp VPC Tôi đã kiểm tra lại. (Trong trường hợp của tôi, tôi nhận được tên VPC
hostname -d
, được sử dụng cho DNS nội bộ, không phải bất cứ thứ gì có "amazonaws.com" trong đó.)
- Các câu trả lời cao nhất bình chọn từ @qwertzguy không làm việc trên M5 hay c5 trường mới , mà không có tập tin này. Amazon bỏ qua tài liệu này thay đổi hành vi AFAIK, mặc dù trang tài liệu về chủ đề này có ghi "... Nếu / sys / hypanneror / uuid tồn tại ...". Tôi đã hỏi bộ phận hỗ trợ của AWS xem sự thay đổi này có chủ ý hay không, xem bên dưới.
- Câu trả lời từ @Jer không nhất thiết phải hoạt động ở mọi nơi vì việc
instance-data.ec2.internal
tra cứu DNS có thể không hoạt động. Trong một phiên bản Ubuntu EC2 VPC mà tôi vừa thử nghiệm, tôi thấy:
$ curl http://instance-data.ec2.internal
curl: (6) Could not resolve host: instance-data.ec2.internal
điều này sẽ khiến mã dựa vào phương pháp này kết luận sai rằng nó không có trên EC2!
- Câu trả lời để sử dụng
dmidecode
từ @tamale có thể hoạt động, nhưng phụ thuộc vào bạn a.) Có dmidecode
sẵn trong trường hợp của bạn và b.) Có sudo
khả năng root hoặc mật khẩu không có trong mã của bạn.
- Câu trả lời để kiểm tra / sys / thiết bị / ảo / dmi / id / bios_version từ @spkane là sai lầm nguy hiểm! Tôi đã kiểm tra một M5 dụ Ubuntu 14.04, và có một
bios_version
số 1.0
. Tập tin này hoàn toàn không được ghi nhận trên tài liệu của Amazon , vì vậy tôi thực sự sẽ không dựa vào nó.
- Phần đầu tiên của câu trả lời từ @ Chris-Montanaro để kiểm tra URL của bên thứ 3 không đáng tin cậy và việc sử dụng
whois
kết quả là có vấn đề ở nhiều cấp độ. Lưu ý rằng URL được đề xuất trong câu trả lời đó là một trang 404 ngay bây giờ! Thậm chí nếu bạn đã tìm thấy một dịch vụ của bên thứ 3 mà đã làm việc, nó sẽ là tương đối rất chậm (so với kiểm tra một tập tin cục bộ) và có thể chạy vào các vấn đề hạn chế tỷ lệ hoặc các vấn đề mạng, hoặc có thể là ví dụ EC2 của bạn thậm chí không có truy cập mạng bên ngoài.
- Gợi ý thứ hai trong câu trả lời từ @ Chris-Montanaro để kiểm tra http://169.254.169.254/ tốt hơn một chút, nhưng một nhà bình luận khác lưu ý rằng các nhà cung cấp đám mây khác cung cấp URL siêu dữ liệu phiên bản này, vì vậy bạn phải cẩn thận để tránh sai tích cực. Ngoài ra, nó vẫn sẽ chậm hơn nhiều so với một tệp cục bộ, tôi đã thấy kiểm tra này đặc biệt chậm (vài giây để trở lại) trong các trường hợp được tải nặng. Ngoài ra, bạn nên nhớ chuyển một
-m
hoặc --max-time
đối số để cuộn tròn để tránh nó bị treo trong một thời gian rất dài, đặc biệt là trong trường hợp không phải EC2 nơi địa chỉ này có thể dẫn đến hư không và treo (như trong câu trả lời của @ algal ).
Ngoài ra, tôi không thấy rằng bất kỳ ai đã đề cập đến dự phòng tài liệu của Amazon về việc kiểm tra tệp (có thể) /sys/devices/virtual/dmi/id/product_uuid
.
Ai biết rằng việc xác định xem bạn có đang chạy trên EC2 có thể rất phức tạp không?! OK, bây giờ chúng tôi có (hầu hết) các vấn đề với các cách tiếp cận được liệt kê, đây là một đoạn bash được đề xuất để kiểm tra xem bạn có đang chạy trên EC2 không. Tôi nghĩ rằng điều này sẽ hoạt động chung trên hầu hết các phiên bản Linux, các phiên bản Windows là một bài tập cho người đọc.
#!/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
Rõ ràng, bạn có thể mở rộng điều này với các kiểm tra dự phòng thậm chí nhiều hơn, và bao gồm sự hoang tưởng về việc xử lý, ví dụ như một dương tính giả từ việc /sys/hypervisor/uuid
xảy ra để bắt đầu với "ec2" một cách tình cờ, v.v. Nhưng đây là một giải pháp đủ tốt cho mục đích minh họa và có lẽ gần như tất cả các trường hợp sử dụng không bệnh lý.
[†] Nhận lại lời giải thích này từ bộ phận hỗ trợ AWS về thay đổi cho các trường hợp c5 / m5:
Các phiên bản C5 và M5 sử dụng ngăn xếp hypanneror mới và các trình điều khiển hạt nhân liên quan không tạo các tệp trong sysfs (được gắn tại / sys) như các trình điều khiển Xen được sử dụng bởi các loại cá thể cũ / cũ hơn . Cách tốt nhất để phát hiện xem hệ điều hành có chạy trên phiên bản EC2 hay không là tính đến các khả năng khác nhau được liệt kê trong tài liệu bạn liên kết .