Saya ingin menjalankan beberapa skrip pada host yang merupakan instance EC2 tapi saya tidak tahu bagaimana memastikan bahwa host tersebut benar - benar instance EC2.
Saya telah melakukan beberapa tes, tetapi ini tidak cukup:
- Uji apakah biner ec2_userdata tersedia (tetapi ini tidak selalu benar)
- Uji ketersediaan " http://169.254.169.254/latest/meta-data " (tetapi apakah ini akan selalu benar? Dan apa ini "IP ajaib"?)
amazon-ec2
Kelindil
sumber
sumber
Jawaban:
Yah sebenarnya, ada cara yang sangat sederhana untuk mendeteksi apakah host adalah instance EC2: periksa reverse lookup IP publik Anda. Pembalikan EC2 cukup sulit untuk dilewatkan.
Juga, jika Anda tidak memodifikasinya, nama host harus Anda balikkan, membuatnya semakin mudah dikenali.
Anda mungkin juga menggunakan "IP ajaib" yang Anda bicarakan, karena memang cara standar untuk mendapatkan tag EC2 Instance, namun, jika Anda tidak berada di jaringan EC2, Anda harus menunggu waktu tunggu, yang umumnya tidak diinginkan ...
Jika metode ini tidak cukup, cukup lakukan whois IP Anda dan periksa apakah Anda ada di dalam dan blok Amazon EC2.
EDIT: Anda dapat menggunakan bit shell kecil ini:
Hati-hati, [[adalah bashism. Anda juga dapat menggunakan Python atau Perl uniline, YMMV.
sumber
hostname -d
kembalieu-west-1.compute.internal
Mengubah jawaban Hannes untuk menghindari pesan kesalahan dan menyertakan contoh penggunaan dalam skrip:
Ini tidak berfungsi dalam instance Windows. Keuntungan lebih dari curl adalah karena hampir instan pada EC2 dan non-EC2.
sumber
ec2
- false positive. Ini tidak mungkin (kemungkinan 1-in-256) dan hanya jika Anda menggunakan hypervisor yang mengisi file itu. Itu sebabnya dokumentasi yang ditautkan di atas mengatakan "Anda mungkin melihat contoh EC2".Pertama, saya merasa perlu memposting jawaban baru karena masalah halus berikut dengan jawaban yang ada, dan setelah menerima pertanyaan tentang komentar saya pada jawaban @ qwertzguy . Inilah masalah dengan jawaban saat ini:
hostname -d
, yang digunakan untuk DNS internal, bukan apa pun dengan "amazonaws.com" di dalamnya.)instance-data.ec2.internal
DNS lookup mungkin tidak bekerja. Pada contoh Ubuntu EC2 VPC yang baru saja saya uji, saya melihat:$ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal
yang akan menyebabkan kode mengandalkan metode ini untuk menyimpulkan itu bukan pada EC2!dmidecode
dari @tamale dapat bekerja, tetapi bergantung pada Anda.) Memilikidmidecode
tersedia pada contoh Anda, dan b.) Memiliki akar atausudo
kemampuan sandi-kurang dari dalam kode Anda.bios_version
dari1.0
. File ini tidak didokumentasikan sama sekali di dokumen Amazon , jadi saya benar-benar tidak akan bergantung padanya.whois
pada hasilnya bermasalah pada beberapa level. Perhatikan URL yang disarankan dalam jawaban itu adalah halaman 404 sekarang! Bahkan jika Anda menemukan layanan pihak ke-3 yang bekerja, itu akan relatif sangat lambat (dibandingkan dengan memeriksa file secara lokal) dan mungkin mengalami masalah pembatasan tingkat atau masalah jaringan, atau mungkin instance EC2 Anda bahkan tidak memiliki akses jaringan luar.-m
atau--max-time
menggulung agar tidak menggantung untuk waktu yang sangat lama, terutama pada contoh non-EC2 di mana alamat ini dapat mengarah ke mana-mana dan menggantung (seperti dalam jawaban @ algal ).Juga, saya tidak melihat bahwa ada orang yang menyebutkan mundurnya Amazon yang didokumentasikan untuk memeriksa file (mungkin)
/sys/devices/virtual/dmi/id/product_uuid
.Siapa yang tahu bahwa menentukan apakah Anda menggunakan EC2 bisa sangat rumit ?! Oke, sekarang kami memiliki (sebagian besar) masalah dengan pendekatan terdaftar yang tercantum, berikut ini cuplikan bash yang disarankan untuk memeriksa apakah Anda menjalankan EC2. Saya pikir ini harus bekerja secara umum pada hampir semua contoh Linux, contoh Windows adalah latihan untuk pembaca.
Jelas, Anda dapat memperluas ini dengan lebih banyak lagi fallback cheque, dan menyertakan paranoia tentang penanganan, mis. Salah positif
/sys/hypervisor/uuid
terjadi mulai dengan "ec2" secara kebetulan dan sebagainya. Tetapi ini adalah solusi yang cukup baik untuk tujuan ilustrasi dan mungkin hampir semua kasus penggunaan non-patologis.[†] Dapatkan kembali penjelasan dari dukungan AWS ini tentang perubahan untuk instance c5 / m5:
sumber
elif
blok itu, dan itulah sebabnyaelif
tes menggunakan-r
operator tes, yang memeriksa apakah file tersebut ada dan bahwa Anda telah membaca izin untuk file tersebut.Cari metadata dengan nama domain internal EC2 alih-alih IP, yang akan mengembalikan kegagalan DNS cepat jika Anda tidak menggunakan EC2, dan menghindari konflik IP atau masalah perutean:
Pada beberapa distro, sistem yang sangat mendasar, atau sangat awal pada tahap pemasangan, curl tidak tersedia. Menggunakan wget gantinya:
sumber
-bash: !": event not found
. Gunakan kutipan tunggal untukecho
itu sebagai gantinya.Jika tujuannya adalah untuk mengetahui apakah ini adalah contoh EC2 ATAU jenis cloud contoh lain, seperti google, maka
dmidecode
berfungsi dengan sangat baik dan tidak diperlukan jaringan. Saya suka ini vs beberapa pendekatan lain karena jalur url metadata berbeda untuk EC2 dan GCE.sumber
1.0
- tidak disebutkanamazon
.Nama host cenderung berubah, jalankan whois terhadap IP publik Anda:
atau tekan url meta-data AWS
sumber
Ini juga berfungsi dengan baik untuk host Linux di ec2 dan tidak memerlukan jaringan dan batas waktu terkait:
grep -q amazon /sys/devices/virtual/dmi/id/bios_version
Ini berfungsi, karena Amazon mendefinisikan entri ini seperti:
$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon
sumber
1.0
. Tidak disebutkanamazon
.tapi saya tidak tahu seberapa portabel ini di seluruh distribusi.
sumber
Jawaban cepat:
Saya telah menggunakan salah satu jawaban yang diposting di sini selama lebih dari setahun - tetapi itu tidak berfungsi pada tipe instance 'c5' yang baru (saya sedang mengerjakan peningkatan dari 'c4' sekarang).
Saya suka solusi ini karena sepertinya paling tidak mungkin pecah di masa depan.
Pada jenis instance yang lebih lama, dan yang lebih baru, file ini ada dan dimulai dengan 'EC2'. Saya memeriksa Ubuntu yang berjalan di VirtualBox (yang saya juga perlu mendukung) dan berisi string 'VirtualBox'.
Seperti yang dicatat oleh poster sebelumnya (tapi mudah untuk dilewatkan) - ada dokumentasi Amazon tentang cara untuk melakukan ini - yang termasuk jawaban saya.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_inances.html
sumber
Mungkin Anda bisa menggunakan "facter":
"Facter adalah pustaka lintas platform untuk mengambil fakta sistem operasi sederhana, seperti sistem operasi, distribusi linux, atau alamat MAC."
http://www.puppetlabs.com/puppet/related-projects/facter/
Sebagai contoh, jika kita melihat fakta ec2 (facter-1.6.12 / lib / facter / ec2.rb):
sumber
Jika Anda memiliki curl diinstal, perintah ini akan mengembalikan 0 jika Anda menjalankan dalam EC2 dan non-nol jika Anda tidak:
Mencoba menarik metadata EC2 menyatakan AMI-ID. Jika ini tidak berhasil setelah 3 detik, ia menganggap itu tidak berjalan di EC2.
sumber
Agak terlambat ke pesta ini, namun saya menemukan posting ini dan kemudian menemukan dokumentasi AWS ini:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_inances.html
Ini, tentu saja, membutuhkan overhead jaringan meskipun Anda dapat mengatur batas waktu keriting seperti:
Itu menetapkan batas waktu menjadi 5s.
sumber