Відповіді:
Див . Документацію EC2 з цього приводу .
Виконати:
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Якщо вам потрібен програмний доступ до ідентифікатора екземпляра з сценарію,
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: $?\"`"
Приклад більш досконалого використання (отримання ідентифікатора екземпляра, а також зони доступності та регіону тощо):
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:'`"
Ви також можете використовувати curl
замість того wget
, що встановлено на вашій платформі.
$
) знайдіть одну чи більше цифр, що слідують за однією або кількома малими літерами. Замініть лише цифри. (Зворотні коси + круглі дужки говорять sed, щоб запам'ятати підрядку, яку відкликали \1
.) Я вважав це трохи легше для читання - єдині зворотні риски - це ті, які вимагає sed : EC2_REGION="$(echo "$EC2_AVAIL_ZONE" | sed -e 's:\([0-9][0-9]*\)[a-z]*$:\1:')"
.
http://instance-data/
замість169.254.169.254
На AMI Amazon Linux ви можете:
$ ec2-metadata -i
instance-id: i-1234567890abcdef0
Або на Ubuntu та деяких інших ароматах Linux ec2metadata --instance-id
(Ця команда може бути не встановлена за замовчуванням на ubuntu, але ви можете додати її за допомогою sudo apt-get install cloud-utils
)
Як випливає з назви, ви можете використовувати команду і для отримання інших корисних метаданих.
-
після ec2
. Цеec2metadata --instance-id
ec2-metadata
, в Ubuntu, здається, є ec2metadata
.
У Ubuntu ви можете:
sudo apt-get install cloud-utils
І тоді ви можете:
EC2_INSTANCE_ID=$(ec2metadata --instance-id)
Ви можете отримати більшість метаданих, пов’язаних із екземпляром таким чином:
ec2metaдані - допомогти Синтаксис: / usr / bin / ec2metadata [параметри] Запит та відображення метаданих EC2. Якщо опції не передбачено, будуть показані всі параметри Параметри: -h - допомогти показати цю допомогу --kernel-id відобразить ідентифікатор ядра --ramdisk-id відобразить ідентифікатор ramdisk - ідентифікатор резервування, ідентифікатор резервування --ami-id відобразить ami id --ami-start-index відображає індекс запуску ami --ami-manifest-path відображає шлях маніфесту ami --ancestor-ami-id відображає ідентифікатор предка ami --продукти-коди відображають пов'язані з ami коди товарів - зона доступності відображення зони розміщення ami --instan-id відобразить ідентифікатор ідентифікатора - відображення типу речовини - тип екземпляра - місцеве ім'я хоста відображає локальне ім'я хоста - ім'я публічного хоста і відображення загального імені хоста --local-ipv4 відображає локальну ipv4 адресу ipv4 --public-ipv4 відображає загальнодоступну ipv4 ip адресу - відображення відображення ідентифікатора блокового пристрою - групи безпеки відображають групи безпеки --mac відобразити адресу екземпляра mac --профіль відображення профілю екземпляра - речовина-дія відображає екземпляр-дію - публічні ключі відображають відкриті відкриті ключі --користувацькі дані відображають дані користувача (фактично не метадані)
apt-get install
lucid отримує версію 0.11-0ubuntu1, яка не містить цієї утиліти. Це було додано в пакет відразу після цього .
Використовуйте /dynamic/instance-identity/document
URL-адресу, якщо вам також потрібно буде запитувати більше, ніж просто ідентифікатор вашого примірника.
wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document
Ви отримаєте такі дані JSON , як ця - лише з одним запитом .
{
"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"
}
Для .NET
людей:
string instanceId = new StreamReader(
HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
.GetResponse().GetResponseStream())
.ReadToEnd();
Для людей, що захищаються:
(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
Для Python:
import boto.utils
region=boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]
який зводиться до одноводкового:
python -c "import boto.utils; print boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]"
Замість local_hostname ви можете також використовувати public_hostname або:
boto.utils.get_instance_metadata()['placement']['availability-zone'][:-1]
new AWS.MetadataService().request('instance-id',function(error,data) { myInstanceId = data; })
Для всіх машин ec2 ідентифікатор екземпляра можна знайти у файлі:
/var/lib/cloud/data/instance-id
Ви також можете отримати ідентифікатор екземпляра, виконавши таку команду:
ec2metadata --instance-id
C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.log
містить ідентифікатор екземпляра, але також має ще безліч інших мотлохів.
Дивіться цю публікацію - зауважте, що IP-адреса у вказаній URL-адресі є постійною (що спочатку мене бентежило), але повернені дані є специфічними для вашого випадку.
Для Рубі:
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]
Більш сучасне рішення.
З Amazon Linux команда метаданих ec2 вже встановлена.
З терміналу
ec2-metadata -help
Дасть вам доступні варіанти
ec2-metadata -i
повернеться
instance-id: yourid
Ви можете спробувати це:
#!/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]\)"`
Клас c # .net, який я написав для метаданих EC2 з http api. Я буду будувати його функціоналом за потребою. Ви можете бігти з ним, якщо вам це подобається.
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
*************************************************************/
}
}
Остання Java SDK має EC2MetadataUtils
:
На Java:
import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();
У Scala:
import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
Для C ++ (використовуючи 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
Просто перевірте var/lib/cloud/instance
посилання, воно повинно вказувати на те, /var/lib/cloud/instances/{instance-id}
де {instance_id}
ваш ідентифікатор ідентифікатора.
Якщо ви хочете отримати список ідентифікаторів усіх екземплярів у python, ось такий код:
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 Я написав файлову систему FUSE, щоб забезпечити доступ до служби метаданих EC2: https://bitbucket.org/dgc/ec2mdfs . Я запускаю це на всіх користувацьких AMI; це дозволяє мені використовувати цю ідіому: cat / ec2 / meta-data / ami-id
У Go ви можете використовувати пакет goamz .
import (
"github.com/mitchellh/goamz/aws"
"log"
)
func getId() (id string) {
idBytes, err := aws.GetMetaData("instance-id")
if err != nil {
log.Fatalf("Error getting instance-id: %v.", err)
}
id = string(idBytes)
return id
}
Ось джерело GetMetaData.
У запитанні, яке ви згадали про користувача як root, одне, що я мушу зазначити, це те, що ідентифікатор екземпляра не залежить від користувача.
Для розробників Node ,
var meta = new AWS.MetadataService();
meta.request("/latest/meta-data/instance-id", function(err, data){
console.log(data);
});
Щоб отримати метадані екземпляра
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Ви можете просто зробити запит HTTP, щоб отримати будь-які метадані, передавши ваші параметри метаданих.
curl http://169.254.169.254/latest/meta-data/instance-id
або
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
З вас не буде виставлено рахунок HTTP-запитів на отримання метаданих та даних користувача.
Інше
Ви можете використовувати інструмент запитів метаданих EC2 Instance, який є простим скриптом bash, який використовує curl для запиту метаданих екземпляра EC2 зсередини запущеного екземпляра EC2, як зазначено в документації.
Завантажте інструмент:
$ wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
тепер запустіть команду, щоб отримати необхідні дані.
$ec2metadata -i
Посилання:
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instan-metadata.html
https://aws.amazon.com/items/1825?externalID=1825
Раді допомогти .. :)
Альтернативний підхід для PHP:
$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document'),true);
$id = $instance['instanceId'];
print_r($instance);
Це дасть багато даних про екземпляр, всі добре упаковані в масив, без зовнішніх залежностей. Оскільки це запит, який ніколи не відмовлявся або не затримувався для мене, це повинно бути безпечно зробити так, інакше я б пішов на curl ()
Для PHP:
$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document));
$id = $instance['instanceId'];
Редагувати на @John
Виконати це:
curl http://169.254.169.254/latest/meta-data/
Ви зможете побачити різні типи атрибутів, які надаються aws.
До всіх метаданих, що відносяться до ресурсу EC2, може бути доступний сам екземпляр EC2 за допомогою наступної команди, що виконується:
CURL:
http://169.254.169.254/<api-version>/meta-data/<metadata-requested>
У вашому випадку: " запитані метадані " повинні бути ідентифікаторами ідентифікатора , " api-версія " зазвичай є останньою, яку можна використовувати.
Додаткова примітка: Ви також можете отримати інформацію, що стосується нижче атрибутів EC2, за допомогою наведеної вище команди.
ami-id, ami-start-index, ami-manifest-path, block-device-mapping /, ім'я хоста, iam /, instance-action, instance-id, type-type, local-hostname, local-ipv4, mac, показники /, мережа /, розміщення /, профіль, ім'я публічного хоста, public-ipv4, відкриті ключі /, ідентифікатор резервування, групи безпеки, послуги /,
Для отримання більш детальної інформації перейдіть за цим посиланням: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
Для екземпляра Windows:
(wget http://169.254.169.254/latest/meta-data/instance-id).Content
або
(ConvertFrom-Json (wget http://169.254.169.254/latest/dynamic/instance-identity/document).Content).instanceId
Для AWS еластичного бінсталка eb cli run eb tags --list
169.254.169.254
в/etc/hosts
разі , що змушує вас почувати себе більш безпечно, ви повинні ... догляд.