Wie die Instanz-ID bekommen innerhalb einer EC2-Instanz?
-
05-07-2019 - |
Frage
Wie kann ich die instance id
einer EC2-Instanz aus der EC2-Instanz herausfinden?
Lösung
Siehe die EC2-Dokumentation zum Thema .
Ausführen:
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Wenn Sie programatic Zugriff auf die Instanz-ID müssen aus einem Skript,
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: $?\"`"
Ein Beispiel einer fortgeschritteneren Anwendung (Instanz-ID sowie der Verfügbarkeit Zone und die Region, etc. abrufen.):
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:'`"
Sie können auch curl
statt wget
, je nach Verwendung, was auf Ihrer Plattform installiert ist.
Andere Tipps
Auf Amazon Linux Ami können Sie tun:
$ ec2-metadata -i
instance-id: i-1234567890abcdef0
Oder auf Ubuntu und einigen anderen Linux-Varianten, ec2metadata --instance-id
(Dieser Befehl ist nicht standardmäßig auf Ubuntu installiert werden kann, aber man kann es mit sudo apt-get install cloud-utils
hinzufügen)
Wie der Name schon sagt, können Sie den Befehl verwenden, um auch noch andere nützliche Metadaten zu erhalten.
Auf Ubuntu können Sie:
sudo apt-get install cloud-utils
Und dann können Sie:
EC2_INSTANCE_ID=$(ec2metadata --instance-id)
Sie können mit der Instanz auf diese Weise verbunden sind die meisten der Metadaten erhalten:
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)
Mit der /dynamic/instance-identity/document
URL, wenn Sie auch brauchen, um abzufragen, als nur die Instanz-ID.
wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document
Diese erhalten Sie auf JSON Daten wie das. - mit nur einem einzelne Anfrage
{
"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"
}
Für .NET
Menschen:
string instanceId = new StreamReader(
HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
.GetResponse().GetResponseStream())
.ReadToEnd();
auf AWS Linux:
ec2-metadata --instance-id | cut -d " " -f 2
Ausgabe:
i-33400429
Unter Verwendung des in Variablen:
ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";
Für Python:
import boto.utils
region=boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]
, welche auf die Einzeiler läuft darauf hinaus:
python -c "import boto.utils; print boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]"
Statt lokaler_Host_Name könnten Sie auch public_hostname, oder:
boto.utils.get_instance_metadata()['placement']['availability-zone'][:-1]
Für Powershell Personen:
(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
Siehe diesen Beitrag -. beachten Sie, dass die IP-Adresse in der angegebenen URL konstant ist (was mich anfangs verwirrt), aber die zurückgegebenen Daten ist spezifisch für die Instanz
Eine modernere Lösung.
Von Amazon Linux der EC2-Metadaten Befehl bereits installiert ist.
Vom Terminal
ec2-metadata -help
Wollen Sie die verfügbaren Optionen geben
ec2-metadata -i
wird wieder
instance-id: yourid
Just Typ:
ec2metadata --instance-id
Für alle EC2 Maschinen, die Instanz-ID kann in der Datei gefunden werden:
/var/lib/cloud/data/instance-id
Sie können auch Instanz-ID erhalten, indem Sie den folgenden Befehl ausführen:
ec2metadata --instance-id
Sie können versuchen, diese:
#!/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]\)"`
Für Rubin:
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]
A c # .net-Klasse-I für EC2 Metadaten aus dem http api schrieb. Ich werde es mit Funktionalität aufbauen je nach Bedarf. Sie können mit ihm laufen, wenn es Ihnen gefällt.
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
*************************************************************/
}
}
Die neueste Java SDK hat EC2MetadataUtils
:
In Java:
import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();
In Scala:
import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
Für C ++ (mit 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
Wenn Sie alle verfügbaren Instanz-ID-Liste erhalten möchten hier mit Python ist der Code:
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 ich ein FUSE-Dateisystem geschrieben Zugriff auf den EC2-Metadaten-Service zur Verfügung zu stellen: https://bitbucket.org/dgc / ec2mdfs . Ich laufe dies auf allen benutzerdefinierten Ami; es erlaubt mir dieses Idiom zu verwenden: cat / EC2 / meta-data / ami-ID
In Go können Sie die Verwendung goamz Paket .
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
}
Hier der GetMetadata Quelle.
Sie einfach die var/lib/cloud/instance
Symlink überprüfen, sollte es zeigen, wo /var/lib/cloud/instances/{instance-id}
{instance_id}
Instanz-ID ist.
Sie können nur eine HTTP-Anforderung machen alle Metadaten zu erhalten, indem die Metadaten Parameter.
curl http://169.254.169.254/latest/meta-data/instance-id
oder
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Sie werden nicht für HTTP-Anforderungen in Rechnung gestellt werden Metadaten und Benutzerdaten zu erhalten.
Else
Sie können EC2 Instanz Metadaten Abfrage-Tool verwenden, die ein einfacher Bash-Skript, das das EC2-Instanz Metadaten in einer laufenden EC2-Instanz abzufragen curl verwendet als in der Dokumentation erwähnt.
Laden Sie das Tool:
$ wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
Jetzt Befehl ausführen, um erforderlichen Daten zu erhalten.
$ec2metadata -i
Siehe:
http: //docs.aws.amazon .com / AWSEC2 / latest / Userguide / EC2-Instanz-metadata.html
https://aws.amazon.com/items/1825?externalID=1825
Happy To Help ..:)
In der Frage, die Sie den Benutzer als root erwähnt haben, eine Sache, die ich erwähnen sollte, ist, dass die Instanz-ID für den Benutzer nicht abhängig ist.
node Entwickler,
var meta = new AWS.MetadataService();
meta.request("/latest/meta-data/instance-id", function(err, data){
console.log(data);
});
Alternativer Ansatz für PHP:
$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document'),true);
$id = $instance['instanceId'];
print_r($instance);
Das eine Menge Daten über die Instanz zur Verfügung stellen wird, die alle schön in einem Array gepackt, ohne externe Abhängigkeiten. Da es eine Anforderung ist, die für mich nie im Stich gelassen oder verzögert sollte es sicher sein, dass es so zu tun, sonst ich für curl gehen würde ()
Für PHP:
$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document));
$id = $instance['instanceId'];
Bearbeiten pro @John
Führen Sie diese:
curl http://169.254.169.254/latest/meta-data/
können Sie verschiedene Arten von Attributen, um zu sehen, die durch aws vorgesehen sind.
Alle Meta-Daten zu EC2 Ressource im Zusammenhang können durch die EC2-Instanz selbst mit Hilfe des folgenden Befehls zugegriffen werden ausgeführt werden:
Curl:
http://169.254.169.254/<api-version>/meta-data/<metadata-requested>
Für Ihren Fall: " Metadaten-requested " sollte Instanz-ID " api-Version " ist in der Regel neueste , das verwendet werden kann.
Weiteres. Hinweis: Sie können auch Informationen im Zusammenhang erhalten unter EC2-Attribute des obigen Befehl mit
ami-id, ami-Launch-Index, ami-manifest-Pfad, Block-device-Kartierungs- /, Hostname, ich bin/, instanz Aktion, Instanz-ID, instance-Typ, local-Hostname, local-ipv4, Mac, Metriken /, Netzwerk/, Platzierung/, Profil, öffentlich-Hostname, öffentlich-ipv4, öffentlich-Tasten /, Reservierung-id, Sicherheitsgruppen, Dienstleistungen /,
Weitere Informationen finden Sie unter folgendem Link: https : //docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
die Instanz Metadaten benutzen Sie
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Für eine Windows-Instanz:
(wget http://169.254.169.254/latest/meta-data/instance-id).Content
oder
(ConvertFrom-Json (wget http://169.254.169.254/latest/dynamic/instance-identity/document).Content).instanceId
Für AWS Elastic Bohnenstengel eb cli laufen eb tags --list