Как получить идентификатор экземпляра из экземпляра ec2?
Как я могу узнать instance id
экземпляра ec2 из экземпляра ec2?
36 ответов
См. Документацию 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
в зависимости от того, что установлено на вашей платформе.
На Amazon Linux AMI вы можете сделать:
$ ec2-metadata -i
instance-id: i-1234567890abcdef0
Или на Ubuntu и некоторых других разновидностях Linux, ec2metadata --instance-id
(Эта команда не может быть установлена по умолчанию в Ubuntu, но вы можете добавить ее с помощью sudo apt-get install cloud-utils
)
Как следует из его названия, вы можете использовать команду для получения других полезных метаданных.
На Ubuntu вы можете:
sudo apt-get install cloud-utils
И тогда вы можете:
EC2_INSTANCE_ID=$(ec2metadata --instance-id)
Вы можете получить большую часть метаданных, связанных с экземпляром, следующим образом:
ec2metadata --help Синтаксис: /usr/bin/ec2metadata [параметры] Запрос и отображение метаданных EC2. Если параметры не предоставлены, будут отображены все параметры. Параметры: -h --help показать эту справку --kernel-id показать идентификатор ядра --ramdisk-id показать идентификатор ramdisk --reservation-id показать идентификатор резервирования - ami-id отображает ami id --ami-launch-index отображает ami launch index --ami-manifest-path отображает ami-путь манифеста --ancestor-ami-ids отображает ami-предок идентификатора --product-коды отображают коды продуктов, связанных с ami --availability-zone - отображение зоны размещения ami - id-экземпляра - отображение идентификатора экземпляра - -instance-type - отображение типа экземпляра --local-hostname - отображение локального имени хоста --public-hostname - отображение публичного имени хоста --local-ipv4 отображать локальный IP-адрес ipv4 --public-ipv4 отображать публичный IP-адрес ipv4 --block-device-mapping отображать идентификатор блочного устройства --security-groups отображать группы безопасности --mac отображать экземпляр mac address --profile отобразить профиль экземпляра --instance-action показать действие instance --public-keys отобразить открытые ключи openssh --user-data отображают данные пользователя (на самом деле не метаданные)
Использовать /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"
}
Для всех компьютеров ec2 идентификатор экземпляра можно найти в файле:
/var/lib/cloud/data/instance-id
Вы также можете получить идентификатор экземпляра, выполнив следующую команду:
ec2metadata --instance-id
В AWS Linux:
ec2-metadata --instance-id | cut -d " " -f 2
Выход:
i-33400429
Использование в переменных:
ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";
За .NET
Люди:
string instanceId = new StreamReader(
HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
.GetResponse().GetResponseStream())
.ReadToEnd();
Для пользователей PowerShell:
(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
Для 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]
См. Этот пост - обратите внимание, что IP-адрес в указанном URL-адресе является постоянным (что сначала смутило меня), но возвращаемые данные относятся к вашему экземпляру.
Более современное решение.
Из 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]\)"`
Для Руби:
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]
Последний Java SDK имеет EC2MetadataUtils
:
В Java:
import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();
В Скала:
import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
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
*************************************************************/
}
}
Просто проверьте var/lib/cloud/instance
символическая ссылка, она должна указывать на /var/lib/cloud/instances/{instance-id}
где {instance_id}
Ваш идентификатор экземпляра.
Для 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
Простая одна строка
cat /sys/devices/virtual/dmi/id/board_asset_tag
или
curl_cli -s http://169.254.169.254/latest/meta-data/instance-id
источник: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
Если вы хотите получить список всех доступных экземпляров с помощью 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'])
Вы можете просто сделать 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, который представляет собой простой bash-скрипт, который использует curl для запроса метаданных экземпляра EC2 из запущенного экземпляра EC2, как упомянуто в документации.
Загрузите инструмент:
$ wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
Теперь запустите команду, чтобы получить необходимые данные.
$ec2metadata -i
См:
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
https://aws.amazon.com/items/1825?externalID=1825
Рад помочь..:)
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.
Самый простой подход — использовать aws cli иsts get-caller-identity
.
INSTANCE_ID=$(aws sts get-caller-identity --query UserId --output text | cut -d : -f 2)
- Таким образом, вам не нужно вручную авторизоваться для конечной точки метаданных.
- Он работает на любом Unix AMI в отличие от
ec2-metadata
команда, доступная только для AMI Amazon Linux
Мотивация: Пользователь хотел бы получить метаданные экземпляра aws.
Решение: IP-адрес169.254.169.254
- это локальный адрес ссылки (и действителен только для экземпляра) . aws дает нам ссылку на выделенный Restful API для получения метаданных нашего запущенного экземпляра (обратите внимание, что вам не выставляется счет за HTTP-запросы, используемые для получения метаданных экземпляра и данных пользователя) . для дополнительной документации
Пример:
//Request:
curl http://169.254.169.254/latest/meta-data/instance-id
//Response
ami-123abc
Вы можете получить дополнительные метаданные вашего экземпляра по этой ссылке. http://169.254.169.254/latest/meta-data/<metadata-field>
просто выберите правильные теги:
- ami-id
- ami-launch-index
- ami-manifest-path
- блочное устройство
- отображение
- События
- спячка
- имя хоста
- я
- идентификационные данные
- Экземпляр-действие
- идентификатор экземпляра
- тип экземпляра
- локальное имя хоста
- локальный ipv4
- Mac
- метрики
- сеть
- размещение
- профиль
- идентификатор бронирования
- группы безопасности
- Сервисы
Для экземпляра 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
В вопросе, который вы упомянули в качестве пользователя 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
Альтернативный подход для 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()
Запустите это:
curl http://169.254.169.254/latest/meta-data/
Вы сможете увидеть различные типы атрибутов, которые предоставляет aws.