Có cách nào để tra cứu khu vực của một thể hiện từ trong thể hiện không?
Tôi đang tìm kiếm một cái gì đó tương tự như phương pháp tìm id cá thể .
http://169.254.169.254/latest/meta-data/placement/availability-zone
và xóa ký tự cuối cùng.
Có cách nào để tra cứu khu vực của một thể hiện từ trong thể hiện không?
Tôi đang tìm kiếm một cái gì đó tương tự như phương pháp tìm id cá thể .
http://169.254.169.254/latest/meta-data/placement/availability-zone
và xóa ký tự cuối cùng.
Câu trả lời:
URL đó ( http://169.254.169.254/latest/dynamic/instance-identity/document ) sẽ không còn hoạt động nữa. Tôi nhận được 404 khi tôi cố gắng sử dụng nó. Tôi có đoạn mã sau có vẻ hoạt động:
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]$//'`"
Hi vọng điêu nay co ich.
EDIT: Cải thiện sed
dựa trên ý kiến
ec2-metadata
chỉ là một trình bao bọc cho API này, nhưng về cơ bản cũng làm điều tương tự.
sed 's/[a-z]$//
Có một cách nữa để đạt được điều đó:
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
cố gắng truy cập GET
URL đó từ một máy 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/.$//'
Đối với các hệ thống dựa trên debian, lệnh không có dấu gạch ngang.
ec2metadata --availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
ec2-metadata
dường như không phải là thứ có sẵn theo mặc định - bạn có thể bao gồm các hướng dẫn cài đặt không?
Nếu bạn muốn tránh biểu thức chính quy, đây là một lớp lót bạn có thể làm với 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']"
Bạn có thể sử dụng siêu dữ liệu ec2:
ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
eu-central-1
.
central
đã không tồn tại khi tôi ban đầu viết câu trả lời của mình. Nó được thêm vào bây giờ.
awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'
sẽ chỉ giữ hai thành phần đầu tiên của tên AZ.
eu-west-1
, eu-west-2
và eu-west-3
(Ngoài ra us-west-1
và us-west-2
) @OP: chỉ cần phù hợp '[a-z][a-z]-[a-z]*-[0-9][0-9]*'
dường như an toàn hơn (có nghĩa là một regex cơ bản, nó có thể được thực hiện ngắn hơn với RE mở rộng). (Regex hiện tại sẽ phá vỡ ca
khu vực, af
khu vực và me
khu vực)
Dễ nhất tôi tìm thấy cho đến nay
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
rất đơn giản
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
lỗi.
Nếu bạn đã cài đặt jq , bạn cũng có thể thực hiện theo cách này (có thể là phương pháp "duyên dáng" nhất) theo cách này:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
Điều này chỉ đơn giản trả về giá trị thô của "vùng" mà không có bất kỳ định dạng in đẹp hoặc định dạng nào khác. Tham khảo: Diễn đàn AWS
Nếu bạn có thể sử dụng SDK Java AWS, hiện tại có một phương thức sẽ trả về tên khu vực hiện tại (chẳng hạn như "us-East-1", "eu-west-1"):
Đây là giải pháp sạch nhất tôi tìm thấy:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p'
Ví dụ,
export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p')
Cảm ơn https://unix.stackexchange.com/a/144330/135640 , với bash 4.2+, chúng tôi chỉ có thể tách char cuối cùng khỏi vùng khả dụng:
$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1
Điều này giả định AWS tiếp tục sử dụng một ký tự cho các vùng khả dụng được gắn vào khu vực.
region=${region%?}
2 lớp lót hoạt động miễn là bạn đang sử dụng ec2.iternal làm miền tìm kiếm của bạn:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
Hoặc không làm cho Ubuntu hoặc công cụ này là một yêu cầu và chỉ cần làm:
: "${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:]])}"}
Điều này hoạt động cho eu-trung tâm-1 cũng như các khu vực chữ cái khác nhau. (Tôi không có đủ đại diện để trả lời câu trả lời sed ở trên)
ec2-metadata --availability-zone | sed 's/[a-z]$//'
ec2metadata --availability-zone | sed 's/.$//'
(không có dấu gạch ngang)
Để tìm hiểu thông tin về EC2 mà bạn đã đăng nhập, bạn có thể sử dụng công cụ siêu dữ liệu ec2.
Bạn có thể cài đặt công cụ bằng cách theo liên kết này. Sau khi cài đặt công cụ, bạn có thể chạy
# ec2-metadata -z
để tìm ra khu vực.
Công cụ này được cài đặt với Ubuntu AMIs mới nhất (10.10),
ec2-metadata -z
Chỉ hiển thị vùng sẵn có, không phải khu vực.
Nếu bạn đang tìm kiếm để có được khu vực bằng cách sử dụng JS, điều này sẽ hoạt động:
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();
}
});
Đây là ánh xạ được tìm thấy từ AWS DOCS, để đáp lại lệnh gọi API siêu dữ liệu, chỉ cần cắt bớt ký tự cuối cùng sẽ hoạt động.
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
(không có dấu gạch ngang) là lệnh hiện tại để cung cấp cho bạn tất cả thông tin lưu trữ aws về hộp ec2 của bạn. đây là cách tiếp cận thanh lịch và an toàn nhất ( ec2-metadata
là lệnh cũ, không còn hợp lệ.)
Một phương thức chỉ sử dụng egrep, sẽ hoạt động trên hầu hết mọi phiên bản linux xuất hiện mà không phải cài đặt bất kỳ công cụ bổ sung nào. Tôi đã thử nghiệm điều này với một danh sách tất cả các khu vực AWS hiện tại và tất cả chúng đều khớp.
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]')
Tại một số điểm vì hầu hết các câu trả lời này đã được đăng, AWS đã làm điều hợp lý và thực hiện một đường dẫn mới : latest/meta-data/placement/region
.
Điều này có nghĩa là có được khu vực nên đơn giản như
REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"
Bạn có thể nhận được khu vực ví dụ bằng cách sử dụng yêu cầu curl này
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1