ฉันจะค้นหาinstance id
อินสแตนซ์ของ ec2 จากภายในอินสแตนซ์ ec2 ได้อย่างไร
ฉันจะค้นหาinstance id
อินสแตนซ์ของ ec2 จากภายในอินสแตนซ์ ec2 ได้อย่างไร
คำตอบ:
ดูเอกสาร EC2 ในเรื่อง
วิ่ง:
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
หากคุณต้องการเข้าถึง 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: $?\"`"
ตัวอย่างของการใช้งานขั้นสูง (ดึงข้อมูล ID อินสแตนซ์รวมถึงโซนความพร้อมใช้งานและภูมิภาคเป็นต้น):
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
.) ฉันพบนี้เล็ก ๆ น้อย ๆ ให้อ่านง่ายขึ้น - backslashes ที่เพียง แต่ผู้ที่จำเป็นโดย EC2_REGION="$(echo "$EC2_AVAIL_ZONE" | sed -e 's:\([0-9][0-9]*\)[a-z]*$:\1:')"
sed:
http://instance-data/
แทน169.254.169.254
ใน Amazon Linux AMIs คุณสามารถทำได้:
$ 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)
คุณสามารถได้รับข้อมูลเมตาส่วนใหญ่ที่เกี่ยวข้องกับอินสแตนซ์ด้วยวิธีนี้:
ec2metadata - ช่วย ไวยากรณ์: / usr / bin / ec2metadata [options] แบบสอบถามและแสดงข้อมูลเมตาของ EC2 หากไม่มีตัวเลือกใด ๆ ตัวเลือกทั้งหมดจะปรากฏขึ้น ตัวเลือก: -h - ช่วยแสดงความช่วยเหลือนี้ --kernel-id แสดงรหัสเคอร์เนล - ramdisk-id แสดง ramdisk id --resres-id แสดงรหัสการจอง --ami-id แสดง ami id --ami-launch-index แสดงดัชนี ami launch --ami-manifest-path แสดงเส้นทาง ami manifest --ancestor-ami-ids แสดง id บรรพบุรุษ ami - รหัสผลิตภัณฑ์แสดงรหัสผลิตภัณฑ์ Ami ที่เกี่ยวข้อง --avavailable- โซนแสดงโซนตำแหน่ง ami --instance-id แสดงรหัสอินสแตนซ์ - ประเภทเนื้อหาแสดงประเภทอินสแตนซ์ --local-hostname แสดงชื่อโฮสต์ท้องถิ่น --public-hostname แสดงชื่อโฮสต์สาธารณะ --local-ipv4 แสดงที่อยู่ ipv4 ท้องถิ่น --public-ipv4 แสดงที่อยู่ ipv4 สาธารณะ - บล็อกการแมปอุปกรณ์แสดงรหัสอุปกรณ์บล็อก - กลุ่มความปลอดภัยแสดงกลุ่มความปลอดภัย --mac แสดงที่อยู่ mac ของอินสแตนซ์ - โปรไฟล์แสดงโปรไฟล์อินสแตนซ์ --instance-action แสดงอินสแตนซ์แอ็คชัน --public-keys แสดงพับลิกคีย์ openssh - ข้อมูลผู้ใช้แสดงข้อมูลผู้ใช้ (ไม่ใช่ข้อมูลเมตาจริง)
apt-get install
ดึงข้อมูลรุ่น 0.11-0ubuntu1 ซึ่งไม่มียูทิลิตี้นี้ มันถูกบันทึกอยู่ในแพคเกจเพียงแค่นั้น
ใช้/dynamic/instance-identity/document
URL หากคุณต้องการค้นหามากกว่าเพียงแค่ ID อินสแตนซ์ของคุณ
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();
บน AWS Linux:
ec2-metadata --instance-id | cut -d " " -f 2
เอาท์พุท:
i-33400429
ใช้ในตัวแปร:
ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";
สำหรับคนที่มีอำนาจ:
(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 ทั้งหมดสามารถพบ instance-id ได้ในไฟล์:
/var/lib/cloud/data/instance-id
คุณยังสามารถรับ id อินสแตนซ์ได้จากการรันคำสั่งต่อไปนี้:
ec2metadata --instance-id
C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.log
มี Id ของอินสแตนซ์ แต่ยังมีขยะอื่น ๆ อีกมากมาย
ดูโพสต์นี้ - โปรดทราบว่าที่อยู่ 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-metadata ได้รับการติดตั้งแล้ว
จากอาคารผู้โดยสาร
ec2-metadata -help
จะให้ตัวเลือกแก่คุณ
ec2-metadata -i
จะกลับมา
instance-id: yourid
เพียงพิมพ์:
ec2metadata --instance-id
คุณสามารถลองสิ่งนี้:
#!/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();
ในสกาล่า:
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
symlink มันควรชี้ไป/var/lib/cloud/instances/{instance-id}
ที่{instance_id}
อินสแตนซ์ของคุณ id
หากคุณต้องการรับรายการ id อินสแตนซ์ทั้งหมดในไพ ธ อนนี่คือรหัส:
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'])
ในคำถามที่คุณพูดถึงผู้ใช้ว่าเป็นรูทสิ่งหนึ่งที่ฉันควรพูดถึงคือ ID อินสแตนซ์นั้นไม่ได้ขึ้นอยู่กับผู้ใช้
สำหรับนักพัฒนาโหนด
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 อินสแตนซ์ซึ่งเป็นสคริปต์ทุบตีง่าย ๆ ที่ใช้ curl เพื่อสอบถาม Metadata ของอินสแตนซ์ 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
เต็มใจช่วย.. :)
แนวทางอื่นสำหรับ PHP:
$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document'),true);
$id = $instance['instanceId'];
print_r($instance);
ที่จะให้ข้อมูลจำนวนมากเกี่ยวกับอินสแตนซ์ทั้งหมดบรรจุอย่างดีในอาร์เรย์ไม่มีการพึ่งพาภายนอก เนื่องจากเป็นคำขอที่ไม่เคยล้มเหลวหรือล่าช้าสำหรับฉันจึงควรปลอดภัยที่จะทำอย่างนั้นมิฉะนั้นฉันจะไปขดตัว ()
สำหรับ 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>
สำหรับกรณีของคุณ: " metadata ที่ร้องขอ " ควรเป็นinstance-id " api-version " มักเป็นรุ่นล่าสุดที่สามารถใช้ได้
หมายเหตุเพิ่มเติม: คุณสามารถรับข้อมูลที่เกี่ยวข้องกับคุณลักษณะ EC2 ด้านล่างโดยใช้คำสั่งด้านบน
ami-id, ami-launch-index, ami-manifest-path, บล็อกอุปกรณ์การแมป /, ชื่อโฮสต์, iam /, การกระทำของอินสแตนซ์, instance-id, instance-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 elastic beanstalk eb cli run eb tags --list
169.254.169.254
ใน/etc/hosts
กรณีที่ทำให้คุณรู้สึกปลอดภัยมากขึ้นถ้าคุณสนใจ