มีวิธีค้นหาพื้นที่ของอินสแตนซ์จากภายในอินสแตนซ์หรือไม่
http://169.254.169.254/latest/meta-data/placement/availability-zone
และลบอักขระสุดท้าย
http://169.254.169.254/latest/meta-data/placement/region
มีวิธีค้นหาพื้นที่ของอินสแตนซ์จากภายในอินสแตนซ์หรือไม่
http://169.254.169.254/latest/meta-data/placement/availability-zone
และลบอักขระสุดท้าย
http://169.254.169.254/latest/meta-data/placement/region
คำตอบ:
URL นั้น ( http://169.254.169.254/latest/dynamic/instance-identity/document ) ไม่ทำงานอีกต่อไป ฉันได้รับ 404 เมื่อฉันพยายามใช้มัน ฉันมีรหัสต่อไปนี้ซึ่งดูเหมือนจะใช้งานได้:
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]$//'`"
หวังว่านี่จะช่วยได้
แก้ไข:ปรับปรุงsed
ตามความคิดเห็น
ec2-metadata
เป็นเพียง Wrapper สำหรับ API นี้ แต่โดยพื้นฐานแล้วจะทำสิ่งเดียวกัน
sed 's/[a-z]$//
มีอีกวิธีหนึ่งในการบรรลุเป้าหมายดังกล่าว:
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
การพยายามที่จะGET
URL 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}'
หากคุณพอใจกับการใช้jq
งานคุณสามารถเรียกใช้สิ่งต่อไปนี้:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r
ฉันเดาว่ามันเป็นวิธีที่สะอาดที่สุด
ec2-metadata --availability-zone | sed 's/.$//'
สำหรับระบบที่ใช้เดเบียนคำสั่งจะไม่มีเส้นประ
ec2metadata --availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
ec2-metadata
ดูเหมือนจะไม่ใช่สิ่งที่มีให้โดยค่าเริ่มต้นคุณสามารถใส่คำแนะนำในการติดตั้งได้หรือไม่
หากคุณต้องการหลีกเลี่ยงนิพจน์ทั่วไปนี่คือหนึ่งซับที่คุณสามารถทำได้กับ 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']"
คุณสามารถใช้ ec2-metadata:
ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
eu-central-1
คุณกำลังเมา
central
ไม่มีอยู่ตอนแรกที่ฉันเขียนคำตอบ เพิ่มแล้ว
awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'
จะเก็บไว้เพียงสององค์ประกอบแรกของชื่อ AZ
eu-west-1
, eu-west-2
และeu-west-3
(นอกจากนี้us-west-1
และus-west-2
) @OP: เพียงแค่การจับคู่'[a-z][a-z]-[a-z]*-[0-9][0-9]*'
ดูเหมือนว่าปลอดภัยมากขึ้น (นั่นคือ regex พื้นฐานก็สามารถทำสั้นกับ RE ขยาย) (regex ปัจจุบันจะแตกในca
ภูมิภาคaf
ภูมิภาคและme
ภูมิภาค)
ง่ายที่สุดที่ฉันพบจนถึงตอนนี้
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
ง่ายมากหนึ่งซับ
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
ข้อผิดพลาด
หากคุณติดตั้งjqคุณสามารถใช้วิธีนี้ (อาจเป็นวิธีที่ "สง่างาม" ที่สุด) ด้วยวิธีนี้:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
สิ่งนี้จะส่งคืนค่าดิบของ "ภูมิภาค" โดยไม่ต้องพิมพ์สวยหรือจัดรูปแบบอื่น ๆ ข้อมูลอ้างอิง: AWS Forum
รับภูมิภาคจากโซนความพร้อมใช้งานตัดตัวอักษรตัวสุดท้ายออก
ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//'
ใช้ JQ:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
หากคุณสามารถใช้ AWS Java SDK ตอนนี้มีวิธีที่จะส่งคืนชื่อภูมิภาคปัจจุบัน (เช่น "us-east-1", "eu-west-1"):
นี่เป็นวิธีที่สะอาดที่สุดที่ฉันพบ:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p'
เช่น,
export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p')
ขอบคุณhttps://unix.stackexchange.com/a/144330/135640ด้วย bash 4.2+ เราสามารถถอดถ่านตัวสุดท้ายออกจากโซนว่าง:
$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1
สิ่งนี้ถือว่า AWS ยังคงใช้อักขระตัวเดียวสำหรับโซนความพร้อมใช้งานที่ต่อท้ายภูมิภาค
region=${region%?}
2 ซับที่ใช้งานได้ตราบเท่าที่คุณใช้ ec2.internal เป็นโดเมนการค้นหาของคุณ:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
สำหรับใครก็ตามที่ต้องการทำสิ่งนี้ด้วย ol powershell ที่ดี
$var = (curl http://169.254.169.254/latest/dynamic/instance-identity/document | Select-String-Pattern "Zone" | ConvertFrom-Json | Select-Object -ExpandProperty "region")
echo $var
หรืออย่าทำให้ Ubuntu หรือเครื่องมือนี้เป็นข้อกำหนดและทำ:
: "${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:]])}"}
หากคุณทำงานกับ json - ใช้เครื่องมือที่เหมาะสม jq มีประสิทธิภาพมากในกรณีนี้
# curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region'
eu-west-1
ใช้งานได้กับ eu-central-1 เช่นเดียวกับโซนตัวอักษรต่างๆ (ฉันมีตัวแทนไม่เพียงพอที่จะตอบกลับคำตอบด้านบน)
ec2-metadata --availability-zone | sed 's/[a-z]$//'
ec2metadata --availability-zone | sed 's/.$//'
(ไม่มีเส้นประ)
หากคุณใช้ Windows คุณสามารถใช้ PowerShell one-Liner:
$region=(Invoke-RestMethod "http://169.254.169.254/latest/dynamic/instance-identity/document").region
กำลังมองหาวิธีแก้ปัญหาเพื่อค้นหาภูมิภาคจากอินสแตนซ์และนี่คือโซลูชัน Bash ที่แท้จริงของฉัน:
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}
เว้นแต่จะมีภูมิภาคที่ AZ มีตัวอักษรมากกว่าสองตัวซึ่งฉันไม่ทราบ
เมื่อถึงจุดหนึ่งเนื่องจากมีการโพสต์คำตอบเหล่านี้ส่วนใหญ่ AWS ได้ทำสิ่งที่สมเหตุสมผลและใช้เส้นทางใหม่: latest/meta-data/placement/region
ทำสิ่งที่เหมาะสมและดำเนินการเส้นทางใหม่:
ซึ่งหมายความว่าการรับภูมิภาคควรจะง่ายพอ ๆ
REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"
สำหรับการค้นหาข้อมูลเกี่ยวกับ EC2 ที่คุณลงชื่อเข้าใช้คุณสามารถใช้เครื่องมือ ec2-metadata
คุณสามารถติดตั้งเครื่องมือได้ตามลิงค์นี้ หลังจากติดตั้งเครื่องมือคุณสามารถเรียกใช้
# ec2-metadata -z
เพื่อค้นหาภูมิภาค
เครื่องมือนี้มาพร้อมกับ Ubuntu AMI ล่าสุด (10.10)
ec2-metadata -z
แสดงเฉพาะโซนความพร้อมใช้งานไม่ใช่ภูมิภาค
หากคุณต้องการรับภูมิภาคโดยใช้ JS สิ่งนี้ควรได้ผล:
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();
}
});
นี่คือการแมปที่พบจาก AWS DOCS เพื่อตอบสนองต่อการเรียก API ข้อมูลเมตาเพียงแค่ตัดทอนอักขระสุดท้ายก็น่าจะใช้ได้
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
(ไม่มีเส้นประ) เป็นคำสั่งปัจจุบันเพื่อให้ข้อมูลโฮสติ้ง aws เกี่ยวกับกล่อง ec2 ของคุณ นี่คือแนวทางที่สง่างามและปลอดภัยที่สุด ( ec2-metadata
เป็นคำสั่งเก่าที่ไม่ถูกต้องอีกต่อไป)
วิธีการที่ใช้เฉพาะ egrep ซึ่งควรใช้ได้กับอินสแตนซ์ linux ส่วนใหญ่ที่หมุนโดยไม่ต้องติดตั้งเครื่องมือเพิ่มเติมใด ๆ ฉันทดสอบสิ่งนี้กับรายการของภูมิภาค AWS ปัจจุบันทั้งหมดและทั้งหมดตรงกัน
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]')
สำหรับโซลูชัน sed และ curl ดูเหมือนว่ารูปแบบจะเปลี่ยนไปเล็กน้อย สำหรับฉันได้ผล
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | sed -n 's/ "region" : "\(.*\)"[,]/\1/p'
คุณอาจได้รับพื้นที่อินสแตนซ์โดยใช้คำขอ curl นี้
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1