Câu trả lời:
Xem tài liệu EC2 về chủ đề này .
Chạy:
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Nếu bạn cần truy cập theo chương trình vào ID cá thể từ trong tập lệnh,
die() { status=$1; shift; echo "FATAL: $*"; exit $status; }
EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"
Một ví dụ về sử dụng nâng cao hơn (lấy ID cá thể cũng như vùng khả dụng và vùng, v.v.):
EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"
test -n "$EC2_INSTANCE_ID" || die 'cannot obtain instance-id'
EC2_AVAIL_ZONE="`wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone || die \"wget availability-zone has failed: $?\"`"
test -n "$EC2_AVAIL_ZONE" || die 'cannot obtain availability-zone'
EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
Bạn cũng có thể sử dụng curl
thay vì wget
, tùy thuộc vào những gì được cài đặt trên nền tảng của bạn.
$
), hãy tìm một hoặc nhiều chữ số theo sau một hoặc nhiều chữ cái viết thường. Thay thế chỉ với các chữ số. (Dấu gạch chéo ngược + dấu ngoặc đơn cho sed nhớ một chuỗi con, được gọi lại bằng \1
.) Tôi thấy điều này dễ đọc hơn một chút - dấu gạch chéo ngược duy nhất là những dấu gạch chéo được yêu cầu bởi sed : EC2_REGION="$(echo "$EC2_AVAIL_ZONE" | sed -e 's:\([0-9][0-9]*\)[a-z]*$:\1:')"
.
http://instance-data/
thay vì169.254.169.254
Trên Amazon Linux AMIs bạn có thể làm:
$ ec2-metadata -i
instance-id: i-1234567890abcdef0
Hoặc, trên Ubuntu và một số hương vị linux khác, ec2metadata --instance-id
(Lệnh này có thể không được cài đặt theo mặc định trên ubfox, nhưng bạn có thể thêm nó với sudo apt-get install cloud-utils
)
Như tên của nó cho thấy, bạn cũng có thể sử dụng lệnh để nhận siêu dữ liệu hữu ích khác.
-
sau ec2
. Đó làec2metadata --instance-id
ec2-metadata
, trên Ubuntu có vẻ như vậy ec2metadata
.
Trên Ubuntu bạn có thể:
sudo apt-get install cloud-utils
Và sau đó bạn có thể:
EC2_INSTANCE_ID=$(ec2metadata --instance-id)
Bạn có thể nhận được hầu hết các siêu dữ liệu được liên kết với thể hiện theo cách này:
ec2metadata - trợ giúp Cú pháp: / usr / bin / ec2metadata [tùy chọn] Truy vấn và hiển thị siêu dữ liệu EC2. Nếu không có tùy chọn nào được cung cấp, tất cả các tùy chọn sẽ được hiển thị Tùy chọn: -h - trợ giúp hiển thị trợ giúp này --kernel-id hiển thị id kernel --ramdisk-id hiển thị id ramdisk --reservation-id hiển thị id đặt phòng --ami-id hiển thị id ami --ami-launch-index hiển thị chỉ mục khởi động ami --ami-manifest-path hiển thị đường dẫn kê khai ami --ancestor-ami-ids hiển thị id tổ tiên ami - mã sản phẩm hiển thị mã sản phẩm liên quan đến ami - vùng sẵn có hiển thị vùng vị trí ami --instance-id hiển thị id cá thể --instance-type hiển thị loại thể hiện --local-hostname hiển thị tên máy chủ cục bộ --public-hostname hiển thị tên máy chủ công cộng --local-ipv4 hiển thị địa chỉ ipvv4 cục bộ --public-ipv4 hiển thị địa chỉ IP ipv4 công khai --block-device-maps hiển thị id thiết bị khối - an toàn-nhóm hiển thị các nhóm bảo mật --mac hiển thị địa chỉ mac dụ --profile hiển thị hồ sơ cá nhân --instance-action hiển thị trường hợp hành động Phím công khai hiển thị các khóa công khai --user-data hiển thị dữ liệu người dùng (không thực sự là siêu dữ liệu)
apt-get install
lấy phiên bản 0.11-0ubfox1 không chứa tiện ích này. Nó đã được thêm vào gói ngay sau đó .
Sử dụng /dynamic/instance-identity/document
URL nếu bạn cũng cần truy vấn nhiều hơn chỉ ID cá thể của bạn.
wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document
Điều này sẽ giúp bạn có được dữ liệu JSON như thế này - chỉ với một yêu cầu .
{
"devpayProductCodes" : null,
"privateIp" : "10.1.2.3",
"region" : "us-east-1",
"kernelId" : "aki-12345678",
"ramdiskId" : null,
"availabilityZone" : "us-east-1a",
"accountId" : "123456789abc",
"version" : "2010-08-31",
"instanceId" : "i-12345678",
"billingProducts" : null,
"architecture" : "x86_64",
"imageId" : "ami-12345678",
"pendingTime" : "2014-01-23T45:01:23Z",
"instanceType" : "m1.small"
}
Dành cho .NET
mọi người:
string instanceId = new StreamReader(
HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
.GetResponse().GetResponseStream())
.ReadToEnd();
Đối với người có quyền hạn:
(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
$instanceId=(Invoke-WebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-id').Content
Đối với Python:
import boto.utils
region=boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]
mà sôi xuống với một lớp lót:
python -c "import boto.utils; print boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]"
Thay vì local_hostname, bạn cũng có thể sử dụng public_hostname hoặc:
boto.utils.get_instance_metadata()['placement']['availability-zone'][:-1]
new AWS.MetadataService().request('instance-id',function(error,data) { myInstanceId = data; })
Đối với tất cả các máy ec2, id-id có thể được tìm thấy trong tệp:
/var/lib/cloud/data/instance-id
Bạn cũng có thể lấy id cá thể bằng cách chạy lệnh sau:
ec2metadata --instance-id
C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.log
chứa Id cá thể, nhưng cũng có rất nhiều thứ linh tinh khác.
Xem bài đăng này - lưu ý rằng địa chỉ IP trong URL đã cho là không đổi (lúc đầu làm tôi bối rối), nhưng dữ liệu trả về là cụ thể cho trường hợp của bạn.
Đối với Ruby:
require 'rubygems'
require 'aws-sdk'
require 'net/http'
metadata_endpoint = 'http://169.254.169.254/latest/meta-data/'
instance_id = Net::HTTP.get( URI.parse( metadata_endpoint + 'instance-id' ) )
ec2 = AWS::EC2.new()
instance = ec2.instances[instance_id]
Một giải pháp hiện đại hơn.
Từ Amazon Linux, lệnh siêu dữ liệu ec2 đã được cài đặt.
Từ thiết bị đầu cuối
ec2-metadata -help
Sẽ cung cấp cho bạn các tùy chọn có sẵn
ec2-metadata -i
sẽ trở lại
instance-id: yourid
Chỉ loại:
ec2metadata --instance-id
Bạn có thể thử điều này:
#!/bin/bash
aws_instance=$(wget -q -O- http://169.254.169.254/latest/meta-data/instance-id)
aws_region=$(wget -q -O- http://169.254.169.254/latest/meta-data/hostname)
aws_region=${aws_region#*.}
aws_region=${aws_region%%.*}
aws_zone=`ec2-describe-instances $aws_instance --region $aws_region`
aws_zone=`expr match "$aws_zone" ".*\($aws_region[a-z]\)"`
Một lớp c # .net tôi đã viết cho siêu dữ liệu EC2 từ http api. Tôi sẽ xây dựng nó với chức năng khi cần thiết. Bạn có thể chạy với nó nếu bạn thích nó.
using Amazon;
using System.Net;
namespace AT.AWS
{
public static class HttpMetaDataAPI
{
public static bool TryGetPublicIP(out string publicIP)
{
return TryGetMetaData("public-ipv4", out publicIP);
}
public static bool TryGetPrivateIP(out string privateIP)
{
return TryGetMetaData("local-ipv4", out privateIP);
}
public static bool TryGetAvailabilityZone(out string availabilityZone)
{
return TryGetMetaData("placement/availability-zone", out availabilityZone);
}
/// <summary>
/// Gets the url of a given AWS service, according to the name of the required service and the AWS Region that this machine is in
/// </summary>
/// <param name="serviceName">The service we are seeking (such as ec2, rds etc)</param>
/// <remarks>Each AWS service has a different endpoint url for each region</remarks>
/// <returns>True if the operation was succesful, otherwise false</returns>
public static bool TryGetServiceEndpointUrl(string serviceName, out string serviceEndpointStringUrl)
{
// start by figuring out what region this instance is in.
RegionEndpoint endpoint;
if (TryGetRegionEndpoint(out endpoint))
{
// now that we know the region, we can get details about the requested service in that region
var details = endpoint.GetEndpointForService(serviceName);
serviceEndpointStringUrl = (details.HTTPS ? "https://" : "http://") + details.Hostname;
return true;
}
// satisfy the compiler by assigning a value to serviceEndpointStringUrl
serviceEndpointStringUrl = null;
return false;
}
public static bool TryGetRegionEndpoint(out RegionEndpoint endpoint)
{
// we can get figure out the region end point from the availability zone
// that this instance is in, so we start by getting the availability zone:
string availabilityZone;
if (TryGetAvailabilityZone(out availabilityZone))
{
// name of the availability zone is <nameOfRegionEndpoint>[a|b|c etc]
// so just take the name of the availability zone and chop off the last letter
var nameOfRegionEndpoint = availabilityZone.Substring(0, availabilityZone.Length - 1);
endpoint = RegionEndpoint.GetBySystemName(nameOfRegionEndpoint);
return true;
}
// satisfy the compiler by assigning a value to endpoint
endpoint = RegionEndpoint.USWest2;
return false;
}
/// <summary>
/// Downloads instance metadata
/// </summary>
/// <returns>True if the operation was successful, false otherwise</returns>
/// <remarks>The operation will be unsuccessful if the machine running this code is not an AWS EC2 machine.</remarks>
static bool TryGetMetaData(string name, out string result)
{
result = null;
try { result = new WebClient().DownloadString("http://169.254.169.254/latest/meta-data/" + name); return true; }
catch { return false; }
}
/************************************************************
* MetaData keys.
* Use these keys to write more functions as you need them
* **********************************************************
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
*************************************************************/
}
}
SDK Java mới nhất có EC2MetadataUtils
:
Trong Java:
import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();
Trong Scala:
import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
Đối với C ++ (sử dụng cURL):
#include <curl/curl.h>
//// cURL to string
size_t curl_to_str(void *contents, size_t size, size_t nmemb, void *userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
};
//// Read Instance-id
curl_global_init(CURL_GLOBAL_ALL); // Initialize cURL
CURL *curl; // cURL handler
CURLcode res_code; // Result
string response;
curl = curl_easy_init(); // Initialize handler
curl_easy_setopt(curl, CURLOPT_URL, "http://169.254.169.254/latest/meta-data/instance-id");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_to_str);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
res_code = curl_easy_perform(curl); // Perform cURL
if (res_code != CURLE_OK) { }; // Error
curl_easy_cleanup(curl); // Cleanup handler
curl_global_cleanup(); // Cleanup cURL
Đơn giản chỉ cần kiểm tra các var/lib/cloud/instance
liên kết tượng trưng, nó phải trỏ đến /var/lib/cloud/instances/{instance-id}
nơi {instance_id}
là bạn dụ-id.
Nếu bạn muốn lấy danh sách id tất cả trong python thì đây là mã:
import boto3
ec2=boto3.client('ec2')
instance_information = ec2.describe_instances()
for reservation in instance_information['Reservations']:
for instance in reservation['Instances']:
print(instance['InstanceId'])
FWIW Tôi đã viết một hệ thống tập tin FUSE để cung cấp quyền truy cập vào dịch vụ siêu dữ liệu EC2: https://bitbucket.org/dgc/ec2mdfs . Tôi chạy cái này trên tất cả các AMI tùy chỉnh; nó cho phép tôi sử dụng thành ngữ này: cat / ec2 / meta-data / ami-id
Trong câu hỏi bạn đã đề cập đến người dùng là root, một điều tôi nên đề cập là ID cá thể không phụ thuộc vào người dùng.
Đối với các nhà phát triển Node ,
var meta = new AWS.MetadataService();
meta.request("/latest/meta-data/instance-id", function(err, data){
console.log(data);
});
Để có được siêu dữ liệu cá thể, hãy sử dụng
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Bạn chỉ có thể thực hiện một yêu cầu HTTP để NHẬN bất kỳ Siêu dữ liệu nào bằng cách chuyển các tham số siêu dữ liệu của bạn.
curl http://169.254.169.254/latest/meta-data/instance-id
hoặc là
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Bạn sẽ không được lập hóa đơn cho các yêu cầu HTTP để nhận Siêu dữ liệu và Userdata.
Khác
Bạn có thể sử dụng Công cụ truy vấn siêu dữ liệu EC2 là một tập lệnh bash đơn giản sử dụng curl để truy vấn siêu dữ liệu EC2 từ bên trong một phiên bản EC2 đang chạy như được đề cập trong tài liệu.
Tải xuống công cụ:
$ wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
Bây giờ chạy lệnh để có được dữ liệu cần thiết.
$ec2metadata -i
Tham khảo:
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
https://aws.amazon.com/items/1825?externalID=1825
Vui vẻ giúp đỡ.. :)
Cách tiếp cận khác cho PHP:
$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document'),true);
$id = $instance['instanceId'];
print_r($instance);
Điều đó sẽ cung cấp rất nhiều dữ liệu về thể hiện, tất cả được đóng gói độc đáo trong một mảng, không phụ thuộc bên ngoài. Vì đó là một yêu cầu không bao giờ thất bại hoặc bị trì hoãn đối với tôi, nên an toàn để thực hiện theo cách đó, nếu không tôi sẽ thực hiện curl ()
Đối với PHP:
$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document));
$id = $instance['instanceId'];
Chỉnh sửa mỗi @John
Chạy cái này:
curl http://169.254.169.254/latest/meta-data/
Bạn sẽ có thể thấy các loại thuộc tính khác nhau được cung cấp bởi aws.
Tất cả dữ liệu meta liên quan đến tài nguyên EC2 có thể được truy cập bởi chính đối tượng EC2 với sự trợ giúp của lệnh sau được thực thi:
XOĂN :
http://169.254.169.254/<api-version>/meta-data/<metadata-requested>
Đối với trường hợp của bạn: " yêu cầu siêu dữ liệu " phải là id-id , " phiên bản api " thường là phiên bản mới nhất có thể được sử dụng.
Lưu ý bổ sung: Bạn cũng có thể nhận thông tin liên quan đến các thuộc tính EC2 bên dưới bằng lệnh trên.
ami-id, ami-launch-index, ami-manifest-path, block-device-maps /, hostname, iam /, instance-action, instance-id, instance-type, local-hostname, local-ipv4, mac, số liệu /, mạng /, vị trí /, hồ sơ, tên máy chủ công cộng, công khai ipv4, khóa công khai /, id-id, nhóm bảo mật, dịch vụ /,
Để biết thêm chi tiết, vui lòng theo liên kết sau: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
Ví dụ về Windows:
(wget http://169.254.169.254/latest/meta-data/instance-id).Content
hoặc là
(ConvertFrom-Json (wget http://169.254.169.254/latest/dynamic/instance-identity/document).Content).instanceId
Đối với AWS đàn hồi đậu ebi chạy eb tags --list
169.254.169.254
trong/etc/hosts
nếu mà làm cho bạn cảm thấy an toàn hơn, nên bạn ... chăm sóc.