Как я могу узнать instance id
экземпляра экземпляра ec2 из экземпляра ec2?
Как получить идентификатор экземпляра из экземпляра ec2?
Ответ 1
Run:
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Если вам нужен программный доступ к идентификатору экземпляра из script,
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
, в зависимости от того, что установлено на вашей платформе.
Ответ 2
В AMI Amazon Linux вы можете:
$ ec2-metadata -i
instance-id: i-1234567890abcdef0
Или, на Ubuntu и некоторых других linux- ec2metadata --instance-id
, ec2metadata --instance-id
(эта команда не может быть установлена по умолчанию на ubuntu, но вы можете добавить ее с помощью sudo apt-get install cloud-utils
)
Как следует из его названия, вы можете использовать эту команду для получения других полезных метаданных.
Ответ 3
В Ubuntu вы можете:
sudo apt-get install cloud-utils
И затем вы можете:
EC2_INSTANCE_ID=$(ec2metadata --instance-id)
Вы можете получить большинство метаданных, связанных с экземпляром, таким образом:
ec2metadata --help Syntax: /usr/bin/ec2metadata [options] Query and display EC2 metadata. If no options are provided, all options will be displayed Options: -h --help show this help --kernel-id display the kernel id --ramdisk-id display the ramdisk id --reservation-id display the reservation id --ami-id display the ami id --ami-launch-index display the ami launch index --ami-manifest-path display the ami manifest path --ancestor-ami-ids display the ami ancestor id --product-codes display the ami associated product codes --availability-zone display the ami placement zone --instance-id display the instance id --instance-type display the instance type --local-hostname display the local hostname --public-hostname display the public hostname --local-ipv4 display the local ipv4 ip address --public-ipv4 display the public ipv4 ip address --block-device-mapping display the block device id --security-groups display the security groups --mac display the instance mac address --profile display the instance profile --instance-action display the instance-action --public-keys display the openssh public keys --user-data display the user data (not actually metadata)
Ответ 4
Используйте URL /dynamic/instance-identity/document
, если вам также нужно запросить больше, чем только ваш идентификатор экземпляра.
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"
}
Ответ 5
Для .NET
Люди:
string instanceId = new StreamReader(
HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
.GetResponse().GetResponseStream())
.ReadToEnd();
Ответ 6
Для 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]
Ответ 7
на AWS Linux:
ec2-metadata --instance-id | cut -d " " -f 2
Вывод:
i-33400429
Использование в переменных:
ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";
Ответ 8
Для людей с ограниченными возможностями:
(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
Ответ 9
См. этот пост - обратите внимание, что IP-адрес в указанном URL-адресе является постоянным (что меня сначала путало), но возвращаемые данные специфичный для вашего экземпляра.
Ответ 10
Более современное решение.
Из Amazon Linux уже установлена команда ec2-metadata.
От терминала
ec2-metadata -help
предоставит вам доступные опции
ec2-metadata -i
вернет
instance-id: yourid
Ответ 11
Просто введите:
ec2metadata --instance-id
Ответ 12
Вы можете попробовать следующее:
#!/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]\)"`
Ответ 13
Для 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]
Ответ 14
Для всех машин ec2 идентификатор экземпляра можно найти в файле:
/var/lib/cloud/data/instance-id
Вы также можете получить экземпляр экземпляра, выполнив следующую команду:
ec2metadata --instance-id
Ответ 15
Класс С#.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
*************************************************************/
}
}
Ответ 16
В последнем Java SDK есть EC2MetadataUtils
:
В Java:
import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();
В Scala:
import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
Ответ 17
Для С++ (с использованием 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
Ответ 18
Если вы хотите получить список доступных экземпляров экземпляра, используя 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'])
Ответ 19
FWIW Я написал файловую систему FUSE для доступа к службе метаданных EC2: https://bitbucket.org/dgc/ec2mdfs. Я запускаю это во всех пользовательских ОИМ; это позволяет мне использовать эту идиому: cat/ec2/meta-data/ami-id
Ответ 20
В 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.
Ответ 21
Просто проверьте символическую ссылку var/lib/cloud/instance
, она должна указывать на /var/lib/cloud/instances/{instance-id}
, где {instance_id}
- ваш экземпляр-идентификатор.
Ответ 22
Вы можете просто сделать 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-запросы для получения метаданных и пользовательских данных.
Else
Вы можете использовать инструмент запроса метаданных экземпляра EC2, который представляет собой простой bash script, который использует завиток для запроса метаданных экземпляра 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
Happy To Help..:)
Ответ 23
Для PHP:
$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document));
$id = $instance['instanceId'];
Изменить за @John
Ответ 24
В вопросе, который вы упоминали пользователя как root, я должен упомянуть, что идентификатор экземпляра не зависит от пользователя.
Для разработчиков Node
var meta = new AWS.MetadataService();
meta.request("/latest/meta-data/instance-id", function(err, data){
console.log(data);
});
Ответ 25
Альтернативный подход для 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()
Ответ 26
Запустите это:
curl http://169.254.169.254/latest/meta-data/
Вы сможете увидеть различные типы атрибутов, которые предоставляет aws.
Ответ 27
Для получения метаданных экземпляра используйте
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Ответ 28
Вы также можете установить awscli и использовать его для получения всей необходимой информации:
AWS_DEFAULT_REGION=your-region aws ec2 describe-instances
Вы получите много выходных данных, поэтому убедитесь, что ваш идефикатор, такой как ip, использует grep и напечатает еще несколько строк:
AWS_DEFAULT_REGION=your-region aws ec2 describe-instances | grep your-ip -A 10 | grep InstanceId
Ответ 29
Все метаданные, относящиеся к ресурсу EC2, могут быть доступны для самого экземпляра EC2 с помощью следующей выполняемой команды:
CURL:
http://169.254.169.254/<api-version>/meta-data/<metadata-requested>
Для вашего случая: " metadata-required " должно быть instance-id, " api-version " обычно самое последнее, что можно использовать.
Дополнительное примечание: Вы также можете получить информацию, относящуюся к атрибутам ниже EC2, используя вышеуказанную команду.
ami-id, ami-launch-index, ami-manifest-path, block-device-mapping/, имя хоста, iam/, instance-action, instance-id, тип экземпляра, local-hostname, local-ipv4, mac, метрики /, сеть/, размещение /, профиль, публичное имя хоста, публичный ipv4, публичные ключи /, идентификатор резервирования, группы безопасности, услуги /,
Для получения дополнительной информации перейдите по этой ссылке: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
Ответ 30
cat/root/.instance_id
проще, глупый: cat/root/.instance_id
:)