Apakah ada cara untuk mencari wilayah instance dari dalam instance?
Saya mencari sesuatu yang mirip dengan metode menemukan instance id .
http://169.254.169.254/latest/meta-data/placement/availability-zone
dan hapus karakter terakhir.
Apakah ada cara untuk mencari wilayah instance dari dalam instance?
Saya mencari sesuatu yang mirip dengan metode menemukan instance id .
http://169.254.169.254/latest/meta-data/placement/availability-zone
dan hapus karakter terakhir.
Jawaban:
URL itu ( http://169.254.169.254/latest/dynamic/instance-identity/document ) tampaknya tidak berfungsi lagi. Saya mendapatkan 404 ketika saya mencoba menggunakannya. Saya memiliki kode berikut yang tampaknya berfungsi:
EC2_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed 's/[a-z]$//'`"
Semoga ini membantu.
EDIT: Ditingkatkan sed
berdasarkan komentar
ec2-metadata
hanyalah pembungkus untuk API ini, tetapi pada dasarnya melakukan hal yang sama.
sed 's/[a-z]$//
Ada satu cara lagi untuk mencapai itu:
REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'`
echo $REGION
us-east-1
404 - Not Found
mencoba GET
URL itu dari mesin di us-east-1a
.
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F\" '/region/ {print $4}'
ec2-metadata --availability-zone | sed 's/.$//'
Untuk sistem berbasis debian, perintahnya adalah tanpa tanda hubung.
ec2metadata --availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
ec2-metadata
tampaknya tidak menjadi sesuatu yang tersedia secara default - dapatkah Anda memasukkan instruksi instalasi?
Jika Anda ingin menghindari ekspresi reguler, berikut adalah satu-liner yang dapat Anda lakukan dengan Python:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | python -c "import json,sys; print json.loads(sys.stdin.read())['region']"
Anda dapat menggunakan ec2-metadata:
ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
eu-central-1
Anda sedang kacau.
central
tidak ada ketika saya awalnya menulis jawaban saya. Sudah ditambahkan sekarang.
awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'
hanya akan menyimpan dua komponen pertama dari nama AZ.
eu-west-1
, eu-west-2
dan eu-west-3
(Juga us-west-1
dan us-west-2
) @OP: hanya mencocokkan '[a-z][a-z]-[a-z]*-[0-9][0-9]*'
tampaknya lebih aman (itu adalah regex dasar, itu dapat dibuat lebih pendek dengan RE diperpanjang). (Regex saat ini akan menembus ca
wilayah, wilayah, af
dan me
wilayah)
Paling mudah saya temukan sejauh ini
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
sangat sederhana satu liner
export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}
curl: (6) Could not resolve host: instance-data; Name or service not known
kesalahan.
Jika Anda telah menginstal jq , Anda juga dapat melakukannya (mungkin metode yang paling "anggun") dengan cara ini:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
Ini hanya mengembalikan nilai mentah "wilayah" tanpa pencetakan cantik atau format lainnya. Referensi: Forum AWS
Jika Anda dapat menggunakan AWS Java SDK, sekarang ada metode yang akan mengembalikan nama wilayah saat ini (seperti "us-east-1", "eu-west-1"):
Ini adalah solusi terbersih yang saya temukan:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p'
Misalnya,
export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p')
Berkat https://unix.stackexchange.com/a/144330/135640 , dengan bash 4.2+ kami hanya dapat menghapus karakter terakhir dari zona ketersediaan:
$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1
Ini mengasumsikan AWS terus menggunakan satu karakter untuk zona ketersediaan ditambahkan ke wilayah tersebut.
region=${region%?}
2 liner yang berfungsi selama Anda menggunakan ec2.internal sebagai domain pencarian Anda:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
Atau jangan menjadikan Ubuntu atau alat ini persyaratan dan cukup lakukan:
: "${EBS_VOLUME_AVAILABILITY_ZONE:=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)}"
: ${EBS_VOLUME_REGION:="${EBS_VOLUME_AVAILABILITY_ZONE%%*([![:digit:]])}"}
Ini berfungsi untuk eu-central-1 serta berbagai zona huruf. (Saya tidak punya cukup perwakilan untuk membalas jawaban sed di atas)
ec2-metadata --availability-zone | sed 's/[a-z]$//'
ec2metadata --availability-zone | sed 's/.$//'
(tanpa tanda hubung)
Sedang mencari solusi untuk menemukan wilayah dari instance dan di sini adalah solusi Bash murni saya:
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}
kecuali ada daerah di mana AZ memiliki lebih dari dua huruf, yang saya tidak sadari.
Untuk mengetahui informasi tentang EC2 yang Anda masuki, Anda dapat menggunakan alat ec2-metadata.
Anda dapat menginstal alat dengan mengikuti tautan ini. Setelah menginstal alat, Anda dapat menjalankan
# ec2-metadata -z
untuk mengetahui wilayah tersebut.
Alat ini diinstal dengan AMI Ubuntu terbaru (10,10),
ec2-metadata -z
hanya menunjukkan zona ketersediaan, bukan wilayah.
Jika Anda ingin mendapatkan wilayah menggunakan JS, ini harusnya berfungsi:
meta.request("/latest/meta-data/placement/availability-zone",function(err,data){
if(err)
console.log(err);
else{
console.log(data);
str = data.substring(0, data.length - 1);
AWS.config.update({region:str});
ec2 = new AWS.EC2();
}
});
Ini adalah pemetaan yang ditemukan dari AWS DOCS, sebagai respons terhadap panggilan API metadata, cukup pangkas karakter terakhir yang seharusnya berfungsi.
eu-west-1a :eu-west-1
eu-west-1b :eu-west-1
eu-west-1c :eu-west-1
us-east-1a :us-east-1
us-east-1b :us-east-1
us-east-1c :us-east-1
us-east-1d :us-east-1
ap-northeast-1a :ap-northeast-1
ap-northeast-1b :ap-northeast-1
us-west-1a :us-west-1
us-west-1b :us-west-1
us-west-1c :us-west-1
ap-southeast-1a :ap-southeast-1
ap-southeast-1b :ap-southeast-1
ec2metadata
(no dash) adalah perintah saat ini untuk memberikan Anda semua info hosting aws tentang kotak EC2 Anda. ini adalah pendekatan yang paling elegan dan aman. ( ec2-metadata
adalah perintah lama, tidak lagi valid.)
Metode yang hanya menggunakan egrep, yang seharusnya bisa digunakan pada kebanyakan instance linux yang berputar tanpa harus menginstal tooling tambahan apa pun. Saya menguji ini terhadap daftar semua wilayah AWS saat ini dan semuanya cocok.
curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]'
region=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]')
Pada titik tertentu karena sebagian besar jawaban ini telah diposting, AWS melakukan hal yang masuk akal dan menerapkan jalur baru: latest/meta-data/placement/region
.
Ini berarti mendapatkan wilayah harus sesederhana
REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"
Anda mungkin mendapatkan wilayah contoh menggunakan permintaan ikal ini
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1