วิธีรับรหัสอินสแตนซ์จากภายในอินสแตนซ์ ec2


คำตอบ:


534

ดูเอกสาร 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ขึ้นอยู่กับสิ่งที่ติดตั้งบนแพลตฟอร์มของคุณ


@Lopop เห็นได้ชัดว่าคุณรู้ดีกว่าคนที่ Amazon ที่ใช้ EC2 และเขียนเอกสาร อนึ่งไม่มีใครหยุดคุณจากการสร้างชื่อแทน169.254.169.254ใน/etc/hostsกรณีที่ทำให้คุณรู้สึกปลอดภัยมากขึ้นถ้าคุณสนใจ
vladr

2
แล้ว Java SDK ล่ะ มีวิธีใดที่จะได้รับสิ่งนี้โดยไม่ต้องทำ GET บน url นั้นหรือไม่? ดูเหมือนว่าแปลกถ้ามันไม่ได้อยู่ใน SDK
Kevin M

1
มีประโยชน์มากขอบคุณ สำหรับคนอื่น ๆ ที่พยายามหานิพจน์ทั่วไปในบรรทัดสุดท้ายนี่คือสิ่งที่ฉันคิดขึ้นมา: ที่ท้ายบรรทัด ( $) ค้นหาตัวเลขหนึ่งหลักขึ้นไปตามด้วยตัวอักษรตัวเล็กหนึ่งตัวหรือมากกว่า ทดแทนด้วยตัวเลขเท่านั้น (ทับขวา + วงเล็บบอก sed จะจำย่อยซึ่งเป็นที่เล่าด้วย\1.) ฉันพบนี้เล็ก ๆ น้อย ๆ ให้อ่านง่ายขึ้น - backslashes ที่เพียง แต่ผู้ที่จำเป็นโดย EC2_REGION="$(echo "$EC2_AVAIL_ZONE" | sed -e 's:\([0-9][0-9]*\)[a-z]*$:\1:')"sed:
Mark Berry

66
คุณสามารถกำจัดหมายเลขเวทย์มนตร์โดยใช้http://instance-data/แทน169.254.169.254
เจ. พี.

20
ฉันตรวจสอบสิ่งนี้เมื่อ 2016-02-04 ฉันพบว่าชื่อโฮสต์ "อินสแตนซ์ข้อมูล" คือ (a) ไม่อยู่ในเอกสารประกอบนั้นและ (b) ไม่ทำงาน (สำหรับฉัน) บนโฮสต์ EC2 ใหม่ เอกสาร - docs.aws.amazon.com/AWSEC2/latest/UserGuide/ … - กล่าวถึงที่อยู่ 169.254 เท่านั้นและไม่ได้กล่าวถึงชื่อโฮสต์ "อินสแตนซ์ข้อมูล" เช่นใช้169.254.169.254/latest/meta-data/instance-id
JDS

138

ใน Amazon Linux AMIs คุณสามารถทำได้:

$ ec2-metadata -i
instance-id: i-1234567890abcdef0

หรือบน Ubuntu และรสชาติอื่น ๆ ของ linux ec2metadata --instance-id(คำสั่งนี้อาจไม่ได้รับการติดตั้งเป็นค่าเริ่มต้นบน Ubuntu แต่คุณสามารถเพิ่มได้sudo apt-get install cloud-utils)

ตามชื่อแนะนำคุณสามารถใช้คำสั่งเพื่อรับข้อมูลเมตาที่เป็นประโยชน์อื่น ๆ


3
หากคุณกำลังคิดที่จะใช้สิ่งนี้บทความนี้ควรอ่าน (tldr: was เครื่องมือบรรทัดคำสั่งคือ java และ java มีเวลาเริ่มต้นนาน)
เจมส์

คำตอบที่ดีที่สุด
Chuck Le Butt

@ Marc Nope ไม่มีหลัง- ec2มันคือec2metadata --instance-id
Dawny33

5
คำสั่งแตกต่างกันบน Linuxes ที่แตกต่างกันใน Amazon ลินุกซ์มันec2-metadata, บน Ubuntu ec2metadataมันน่าจะเป็น
James

ใช่ James ฉันพบ ec2metadata เดียวกันกับที่ทำงานบน Ubuntu
pyAddict

69

บน 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
    - ข้อมูลผู้ใช้แสดงข้อมูลผู้ใช้ (ไม่ใช่ข้อมูลเมตาจริง)

ภายใต้ Ubuntu lucid apt-get installดึงข้อมูลรุ่น 0.11-0ubuntu1 ซึ่งไม่มียูทิลิตี้นี้ มันถูกบันทึกอยู่ในแพคเกจเพียงแค่นั้น
Aryeh Leib Taurog

7
แพ็คเกจ cloud-utils รวมอยู่ในค่าเริ่มต้นบน Ubuntu 12.04.1 LTS Cluster Compute AMI
แอนดรู

2
ดูเหมือนว่า cloud-utils จะอยู่ใน RHEL / CentOS ด้วยเช่นกัน
Craig Ringer

50

ใช้/dynamic/instance-identity/documentURL หากคุณต้องการค้นหามากกว่าเพียงแค่ 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"
}

1
+1 สำหรับการแสดงรายละเอียดทั้งหมดรวมถึง instanceType ในการโทรแบบง่าย ๆ เพียงครั้งเดียว
Luksurious

1
+1 สำหรับการมีมาตรฐานอย่างเป็นธรรม (wget เท่านั้น) และสายงาน (url อินสแตนซ์ข้อมูลดาต้าไม่ทำงานสำหรับฉันใน amazon linux) โดยไม่ต้องติดตั้งแพ็กเกจเพิ่มเติมเพียงเพื่องานง่าย ๆ นี้
tishma


24

บน AWS Linux:

ec2-metadata --instance-id | cut -d " " -f 2

เอาท์พุท:

i-33400429

ใช้ในตัวแปร:

ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";

วิธีที่สะอาดและรัดกุม ทำงานนอกกรอบสำหรับอินสแตนซ์กับ Ubuntu 14.
berbt

22

สำหรับคนที่มีอำนาจ:

(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")

4
commandet ที่แตกต่างกันเพียง:$instanceId=(Invoke-WebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-id').Content
Sumit Murari

Invoke-WebRequest ไม่สามารถทำงานได้ตลอดเวลาเมื่อเรียกใช้สคริปต์บนอินสแตนซ์ EC2 ที่กล่าวพร้อมกับคำสั่ง ssm send-command (หรือ Send-SSMCommand) มันไม่ได้โดดกล่าวว่าในเอกสาร อาจเป็นไปได้ว่ามันไม่ได้เป็น async ... ซึ่งจะแปลก แต่ตัวเลือกของ stefancaunter ทำงานได้โดยไม่มีปัญหา
J-Roel

22

สำหรับ 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]

boto เวอร์ชันใหม่ทั้งหมดที่ฉันเห็นให้คุณโทรหาคีย์ "instance_id" โดยตรง ฉันได้ทำการแก้ไขที่แนะนำแล้ว
saccharine

8
inst_id = boto.utils.get_instance_metadata () ['instance-id']
atisman

คุณตระหนักดีว่าสิ่งนี้ได้รับพื้นที่ที่อินสแตนซ์อยู่ไม่ใช่อินสแตนซ์ id ตามคำถามที่ถามใช่ไหม
LukeGT

2
สำหรับใครที่สงสัยว่านี่คือ boto แต่ยังไม่ได้อยู่ใน boto3 ดูstackoverflow.com/a/33733852สำหรับวิธีแก้ปัญหาโดยใช้ urllib มีการร้องขอคุณสมบัติแบบเปิดที่github.com/boto/boto3/issues/313 FWIW JS SDK ยังมีสิ่งนี้: docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ การ ใช้งานnew AWS.MetadataService().request('instance-id',function(error,data) { myInstanceId = data; })
Armadillo Jim

20

สำหรับเครื่อง ec2 ทั้งหมดสามารถพบ instance-id ได้ในไฟล์:

    /var/lib/cloud/data/instance-id

คุณยังสามารถรับ id อินสแตนซ์ได้จากการรันคำสั่งต่อไปนี้:

    ec2metadata --instance-id

2
นี่เป็นโซลูชันที่สะอาดมากไม่ต้องการคำขอ HTTP
ยูริ

คำตอบที่ดีที่สุดที่เป็นไปได้จริง
Shlublu

1
คำตอบที่ดี แต่ฉันไม่พบการอ้างอิงสำหรับสิ่งนี้ในเอกสารประกอบ ฉันขอถามได้ไหมว่าเอกสารอ้างอิงของคุณคืออะไร? ข้อกังวลคือถ้าเราจะเรียกใช้รหัสนี้ในการผลิตเราจะรู้ได้อย่างไรว่ามันจะไม่เปลี่ยนแปลงในอนาคต
shaya ajzner

เครื่องlinux ec2 ทั้งหมดอาจจะ แต่ไม่ใช่เครื่อง ec2 ทั้งหมดแน่นอน ไม่มีไฟล์ดังกล่าวใน Windows C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.logมี Id ของอินสแตนซ์ แต่ยังมีขยะอื่น ๆ อีกมากมาย
James

14

ดูโพสต์นี้ - โปรดทราบว่าที่อยู่ IP ใน URL ที่ให้นั้นคงที่ (ซึ่งทำให้ฉันสับสนในตอนแรก) แต่ข้อมูลที่ส่งคืนนั้นเป็นข้อมูลเฉพาะของอินสแตนซ์


ลิงก์มี 404 รายการสำหรับฉัน
repalviglator

ตรวจสอบคำตอบของ @ DEtDev ด้านล่าง; คำตอบของฉันค่อนข้างเก่าและดูเหมือนว่าลิงก์ถูกลบออก
gareth_bowles

10

สำหรับทับทิม:

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]

1
พวก WTF เหรอ! คุณขโมยการแก้ไขของฉัน! stackoverflow.com/review/suggested-edits/4035074
kixorz

3
ขอโทษ ไม่รู้ว่าจะพูดอย่างไร "มันเป็นการแก้ไขที่ดีฉันเป็นโอพียอมรับสิ่งนี้"
เควินเมเยอร์

10

ทางออกร่วมสมัยมากขึ้น

จาก Amazon Linux คำสั่ง ec2-metadata ได้รับการติดตั้งแล้ว

จากอาคารผู้โดยสาร

ec2-metadata -help

จะให้ตัวเลือกแก่คุณ

ec2-metadata -i

จะกลับมา

instance-id: yourid

1
ดีกว่าขึ้นอยู่กับ ip หลอก
Mike D

รวมec2-metadataกับmotdเอกสารของคุณที่นี่: coderwall.com/p/hr_9pw/motds-on-amazon-amis
Mike D

2
ในภาพ Ubuntu คำสั่งคือ "ec2metadata --instance-id" และจะส่งกลับเฉพาะค่า id อินสแตนซ์
Alberto Megía

10

เพียงพิมพ์:

ec2metadata --instance-id

คุณใช้ AMI ตัวไหน
Akash Arya

4
เห็นได้ชัดว่าเป็นคำสั่งสำหรับ Amazon AMI คุณควรอัปเดตคำตอบของคุณ
rambossa

@ WédneyYuriใช่
Akash Arya

9

คุณสามารถลองสิ่งนี้:

#!/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]\)"`

8

คลาส 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
*************************************************************/
    }
}

7

Java SDK ล่าสุดมี EC2MetadataUtils :

ใน Java:

import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();

ในสกาล่า:

import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId

5

สำหรับ 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

3

เพียงตรวจสอบvar/lib/cloud/instancesymlink มันควรชี้ไป/var/lib/cloud/instances/{instance-id}ที่{instance_id}อินสแตนซ์ของคุณ id


1
ฉันจะไม่ใช้สิ่งนี้ คุณไม่ควรใช้การร้องขอ HTTP ที่ได้รับอนุมัติเพื่อรับข้อมูลเมตา
ไดสุเกะอารามากิ

3

หากคุณต้องการรับรายการ 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'])

2

FWIW ผมเขียนระบบแฟ้ม FUSE เพื่อให้สามารถเข้าถึงบริการข้อมูลเมตา EC2 นี้: https://bitbucket.org/dgc/ec2mdfs ฉันเรียกใช้งาน AMI แบบกำหนดเองทั้งหมด มันทำให้ฉันใช้สำนวนนี้: cat / ec2 / meta-data / ami-id


2

ไปในที่ที่คุณสามารถใช้แพคเกจ 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


1

ในคำถามที่คุณพูดถึงผู้ใช้ว่าเป็นรูทสิ่งหนึ่งที่ฉันควรพูดถึงคือ ID อินสแตนซ์นั้นไม่ได้ขึ้นอยู่กับผู้ใช้

สำหรับนักพัฒนาโหนด

var meta  = new AWS.MetadataService();

meta.request("/latest/meta-data/instance-id", function(err, data){
    console.log(data);
});


0

คุณสามารถส่งคำขอ 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

เต็มใจช่วย.. :)


0

แนวทางอื่นสำหรับ PHP:

$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document'),true);
$id = $instance['instanceId'];
print_r($instance);

ที่จะให้ข้อมูลจำนวนมากเกี่ยวกับอินสแตนซ์ทั้งหมดบรรจุอย่างดีในอาร์เรย์ไม่มีการพึ่งพาภายนอก เนื่องจากเป็นคำขอที่ไม่เคยล้มเหลวหรือล่าช้าสำหรับฉันจึงควรปลอดภัยที่จะทำอย่างนั้นมิฉะนั้นฉันจะไปขดตัว ()


0

สำหรับ PHP:

$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document));
$id = $instance['instanceId'];

แก้ไขต่อ @John


แต่ทำไมคุณถึงใช้ GuzzeHttp เพื่อจุดนั้นถ้าคุณมีฟังก์ชั่น curl และ native ใน PHP?
จอห์น

มันเป็นความชอบของฉัน ฉันใช้ guzzle สำหรับสิ่งอื่น ๆ เป็นข้อกำหนดเบื้องต้นสำหรับแพ็คเกจอื่น ๆ เช่นกัน
Beachhouse

$ instance = json_decode (file_get_contents (' 169.254.169.254/latest/dynamic/instance-identity/ ...... ); $ id = $ instance [' instanceId ']; ฉันรู้ว่า Guzzle นั้นแพร่หลายฉันไม่เคยแตะมันเลย เป็นงานง่าย ๆ ที่ฉันจะให้แนวทางที่เบาที่สุด
John


0

ข้อมูลเมตาทั้งหมดที่เกี่ยวข้องกับทรัพยากร 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


0

สำหรับอินสแตนซ์ของ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.