EC2 인스턴스에서 인스턴스 ID를 얻는 방법은 무엇입니까?


답변:


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.


@Leopd, EC2를 구현하고 문서를 작성한 Amazon 직원보다 분명히 더 잘 알고 있습니다. 덧붙여, 아무도 별칭을 만드는에서 당신을 멈추지 169.254.169.254/etc/hosts당신은, 즉 취하면 더 안심한다 ...주의.
vladr

2
Java SDK는 어떻습니까? 해당 URL에서 GET을 수행하지 않고도이를 얻을 수있는 방법이 있습니까? SDK에없는 경우 이상해 보입니다
Kevin M

1
매우 도움이되었습니다. 감사합니다. 마지막 줄에서 정규 표현식을 찾으려고 시도하는 다른 사람들을 위해 다음과 같이 생각해 냈습니다. 줄 끝 ( $)에서 하나 이상의 소문자로 하나 이상의 숫자를 찾으십시오. 숫자로만 대체하십시오. (백 슬래시 + 괄호는 sed에게 하위 문자열을 기억하도록 지시합니다.이 문자열 \1은 약간 더 읽기 쉽습니다 EC2_REGION="$(echo "$EC2_AVAIL_ZONE" | sed -e 's:\([0-9][0-9]*\)[a-z]*$:\1:')".)
Mark Berry

66
당신은 사용하여 매직 넘버를 제거 할 수 있습니다 http://instance-data/대신169.254.169.254
제이 P.

20
나는 2016-02-04에 이것을 확인했다. "인스턴스 데이터"호스트 이름이 (a) 해당 문서에 나열되어 있지 않으며 (b) 새 EC2 호스트에서 작동하지 않습니다. docs.aws.amazon.com/AWSEC2/latest/UserGuide/… 문서 에는 169.254 주소 만 언급되어 있으며 "instance-data"호스트 이름은 언급되어 있지 않습니다. 즉 169.254.169.254/latest/meta-data/instance-id
JDS

138

Amazon Linux AMI에서 다음을 수행 할 수 있습니다.

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

또는 우분투와 다른 리눅스 풍미에서 ec2metadata --instance-id(이 명령은 우분투에는 기본적으로 설치되지 않을 수도 있지만을 사용하여 추가 할 수 있습니다 sudo apt-get install cloud-utils)

이름에서 알 수 있듯이이 명령을 사용하여 다른 유용한 메타 데이터도 얻을 수 있습니다.


3
이것을 사용하는 것에 대해 생각하고 있다면, 이 기사 는 읽을 가치가있다 (tldr : 커맨드 라인 툴은 자바 였고 자바는 시작 시간이 길다)
James

가장 좋은 답변
Chuck Le Butt

@ 마크 노프. 아니 -ec2. 그것은이다ec2metadata --instance-id
Dawny33

5
명령은 Linux마다 다릅니다. Amazon Linux에서는 ec2-metadata, Ubuntu에서는는 것 같습니다 ec2metadata.
James

James는 우분투에서 작동하는 것과 동일한 ec2metadata를 발견했습니다.
pyAddict 2018 년

69

우분투에서는 다음을 수행 할 수 있습니다.

sudo apt-get install cloud-utils

그리고 당신은 할 수 있습니다 :

EC2_INSTANCE_ID=$(ec2metadata --instance-id)

이 방법으로 인스턴스와 관련된 대부분의 메타 데이터를 얻을 수 있습니다.

ec2metadata --help
구문 : / usr / bin / ec2metadata [옵션]

EC2 메타 데이터를 쿼리하고 표시합니다.

옵션이 제공되지 않으면 모든 옵션이 표시됩니다

옵션 :
    -h --help이 도움말을 표시합니다

    --kernel-id 커널 ID를 표시합니다
    --ramdisk-id 램 디스크 ID를 표시합니다
    --reservation-id 예약 ID를 표시합니다

    --ami-id는 ami id를 표시합니다
    --ami-launch-index ami 실행 색인을 표시합니다
    --ami-manifest-path ami 매니페스트 경로를 표시합니다
    -조상 -ami-ids는 조상 ID를 표시합니다
    --product-codes는 ami 관련 제품 코드를 표시합니다
    --availability-zone은 ami 배치 영역을 표시합니다

    --instance-id 인스턴스 ID를 표시합니다
    -인스턴스 유형 인스턴스 유형을 표시합니다

    --local-hostname은 로컬 호스트 이름을 표시합니다
    --public-hostname은 공개 호스트 이름을 표시합니다

    --local-ipv4는 로컬 ipv4 ip 주소를 표시합니다
    --public-ipv4는 공개 ipv4 IP 주소를 표시합니다

    --block-device-mapping 블록 장치 ID를 표시합니다
    --security-groups는 보안 그룹을 표시합니다

    --mac 인스턴스 mac 주소를 표시합니다
    --profile 인스턴스 프로파일을 표시합니다
    -인스턴스 액션은 인스턴스 액션을 표시

    --public-keys는 openssh 공개 키를 표시합니다
    --user-data 사용자 데이터를 표시합니다 (실제로는 메타 데이터가 아님).

Ubuntu에서 apt-get installlucid는이 유틸리티를 포함하지 않는 버전 0.11-0ubuntu1을 검색합니다. 그 직후 패키지에 추가 되었습니다 .
Aryeh Leib Taurog

7
cloud-utils 패키지는 기본적으로 Ubuntu 12.04.1 LTS 클러스터 컴퓨팅 AMI에 포함되어 있습니다.
앤드류

2
클라우드 유틸 너무 RHEL / CentOS는 것 같다
크레이그 벨소리를

50

/dynamic/instance-identity/document인스턴스 ID 이상을 쿼리해야하는 경우 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"
}

1
한 번의 간단한 호출로 instanceType을 포함한 모든 세부 정보를 표시하는 +1
Luksurious

1
이 간단한 작업을 위해 추가 패키지를 설치하지 않고 상당히 표준 (wget 만 해당) 및 작업 라인 (인스턴스 데이터 URL이 amazon Linux에서 작동하지 않음) +1.
tishma

27

.NET사람들을 위해 :

string instanceId = new StreamReader(
      HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
      .GetResponse().GetResponseStream())
    .ReadToEnd();

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
그냥 다른 지휘관 :$instanceId=(Invoke-WebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-id').Content
Sumit Murari

Invoke-WebRequest는 ssm send-command (또는 Send-SSMCommand)를 사용하여 해당 EC2 인스턴스에서 스크립트를 실행할 때 항상 작동하지 않습니다. 그것은 실제로 문서 에서 말하지 않습니다 . 아마도 그것은 비동기가 아닙니다 ... 이상한 것입니다. 그러나 stefancaunter의 옵션은 지금까지 아무런 문제없이 작동합니다.
J-Roel

22

파이썬의 경우 :

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"키를 직접 호출 할 수 있습니다. 제안 된 관련 수정 사항을 작성했습니다.
사카린

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

이것이 질문에 따라 인스턴스 ID가 아닌 인스턴스가있는 지역을 얻는다는 것을 알고 있습니까?
LukeGT

2
궁금한 사람은 boto에 있지만 아직 boto3에는 없습니다. urllib를 사용하는 해결 방법 은 stackoverflow.com/a/33733852 를 참조하십시오 . 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 요청이 필요없는 매우 깨끗한 솔루션입니다.
Yuri

실제로 가장 좋은 답변
Shlublu

1
큰 대답이지만 설명서에서 이에 대한 참조를 찾을 수 없습니다. 당신의 참조가 무엇인지 물어봐도 될까요? 문제는 프로덕션 환경에서이 코드를 실행할 경우 향후 변경되지 않을 것임을 어떻게 알 수 있습니까?
shaya ajzner

모든 리눅스 ec2 머신, 아마도 모든 ec2 머신은 아닙니다 . Windows에는 그러한 파일이 없습니다. C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.log인스턴스 ID를 포함하지만 다른 정크도 많이 있습니다.
제임스

14

이 게시물을 참조하십시오 -주어진 URL의 IP 주소는 일정하지만 (처음에는 혼란 스럽지만) 반환 된 데이터는 인스턴스에 따라 다릅니다.


Link is 404ing for me
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
죄송합니다. "좋은 편집입니다. 저는 OP입니다. 이것을 수락하십시오"라고 말하는 방법을 몰랐습니다.
Kevin Meyer

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
마이크 D

2
우분투 이미지에서 명령은 "ec2metadata --instance-id"이며 인스턴스 ID 값만 반환합니다
Alberto Megía


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

http API에서 EC2 메타 데이터를 위해 작성한 c # .net 클래스입니다. 필요에 따라 기능으로 구축하겠습니다. 원하는 경우 실행할 수 있습니다.

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 다음 .

자바에서 :

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/instance심볼릭 링크를 확인하면 인스턴스 ID가 /var/lib/cloud/instances/{instance-id}어디에 있는지 가리켜 야합니다 {instance_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 EC2 메타 데이터 서비스 ( https://bitbucket.org/dgc/ec2mdfs) 에 대한 액세스를 제공하기 위해 FUSE 파일 시스템을 작성했습니다 . 모든 사용자 지정 AMI에서이 기능을 실행합니다. cat / ec2 / meta-data / ami-id라는 관용구를 사용할 수 있습니다.


2

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 소스입니다.


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 요청에 대해서는 요금이 청구되지 않습니다.

그밖에

설명서에 언급 된대로 curl을 사용하여 실행중인 EC2 인스턴스 내에서 EC2 인스턴스 메타 데이터를 쿼리하는 간단한 bash 스크립트 인 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);

그것은 인스턴스에 대한 많은 데이터를 제공 할 것입니다. 그것은 결코 실패하지 않았거나 지연 된 요청이므로 그렇게하는 것이 안전해야합니다. 그렇지 않으면 curl ()


0

PHP의 경우 :

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

@ 존당 편집


그러나 PHP에 curl 및 native 함수가있는 경우 왜 GuzzeHttp를 사용하여 그러한 목적으로 사용합니까?
John

내 취향입니다. 나는 다른 많은 것들을 위해 guzzle을 사용한다. 그것은 많은 다른 패키지들에 대한 일반적인 전제 조건이다.
Beachhouse

$ instance = json_decode (file_get_contents ( ' 169.254.169.254/latest/dynamic/instance-identity/… ); $ id = $ instance ['instanceId ']; 나는 Guzzle이 널리 퍼져 있다는 것을 알고 있습니다. 가장 간단한 접근 방식을 제공하겠습니다
John


0

EC2 리소스와 관련된 모든 메타 데이터는 다음 명령을 실행하여 EC2 인스턴스 자체에서 액세스 할 수 있습니다.

곱슬 곱슬하다 :

http://169.254.169.254/<api-version>/meta-data/<metadata-requested>

귀하의 경우 : " 메타 데이터 요청 "은 instance-id 이어야합니다 . " api-version "은 일반적으로 사용 가능한 최신 버전 입니다.

추가 참고 : 위 명령을 사용하여 아래 EC2 속성과 관련된 정보를 얻을 수도 있습니다.

ami-id, ami-launch-index, ami-manifest-path, block-device-mapping /, hostname, iam /, instance-action, instance-id, 인스턴스 유형, 로컬 호스트 이름, local-ipv4, mac, 측정 항목 /, 네트워크 /, 게재 위치 /, 프로필, 공개 호스트 이름, 공개 ipv4, 공개 키 /, 예약 ID, 보안 그룹, 서비스 /,

자세한 내용은 다음 링크를 참조 하십시오 : 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.