web-dev-qa-db-ja.com

ec2インスタンス内からインスタンスIDを取得する方法

Ec2インスタンス内からec2インスタンスのinstance idを見つけるにはどうすればよいですか?

343
flybywire

このテーマに関する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を使うこともできます。

486
vladr

Amazon Linux AMIでは、次のことができます。

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

あるいは、Ubuntuや他のいくつかのLinuxフレーバーでは、ec2metadata --instance-id(このコマンドはデフォルトではubuntuにインストールされないかもしれませんが、Sudo apt-get install cloud-utilsで追加することができます)

その名前が示すように、あなたは他の有用なメタデータも得るためにコマンドを使うことができます。

118
James

Ubuntuでは、次のことができます。

Sudo apt-get install cloud-utils

そして、次のことができます。

EC2_INSTANCE_ID=$(ec2metadata --instance-id)

この方法で、インスタンスに関連付けられているメタデータの大部分を取得できます。

 ec2metadata --help 
構文:/ usr/bin/ec2metadata [options] 
 
 EC2メタデータを照会して表示します。
 
 ]オプションが指定されていない場合は、すべてのオプションが表示されます。
 
オプション:
 -h --helpこのヘルプを表示します
 
 --kernel -idカーネルID 
を表示します。--ramdisk-id RAMディスクID 
を表示します。--reservation-id予約ID 
 
 --AMI-id表示を表示します。 AMI ID 
 --AMI-launch-index AMI起動インデックス
を表示します。--AMI-manifest-path AMIマニフェストパスを表示します
 --ancestor-AMI-idディスプレイAMIの祖先ID 
  -  product-codesは、AMIに関連する製品コードを表示します。
  -  availability-zoneは、AMI配置ゾーンを表示します
 
 --instance-idインスタンスIDを表示します
 --instance-typeインスタンスタイプを表示します
 
 --loc al-hostnameはローカルのホスト名を表示します
 --public-hostnameはパブリックのホスト名を表示します
 
 --local-ipv4ローカルのipv4 IPアドレスを表示します
 --public -ipv4パブリックipv4 ipアドレスを表示します。
 
 --block-device-mappingブロックデバイスIDを表示します
 --security-groupsセキュリティグループを表示します
 [ --macインスタンスのMACアドレスを表示します[ - ] --profileインスタンスのプロファイルを表示します[ - ] --instance-actionインスタンスの動作を表示します[[]] [ - ]  - -public-keysはopensshの公開鍵を表示します
 --user-dataはユーザデータを表示します(実際にはメタデータではありません)
57
rhunwicks

インスタンスID以外にもクエリが必要な場合は、/dynamic/instance-identity/document 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"
}
43
Konrad Kiss

.NETの場合:

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

aWS Linuxの場合:

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

出力:

i-33400429

変数を使う:

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

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]
18
benlast

PowerShellの人々のために:

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

この記事 を参照してください - 与えられたURLのIPアドレスは一定であることに注意してください(これは最初は私を混乱させました)が、返されるデータはあなたのインスタンスに固有のものです。

12
gareth_bowles

ただタイプ:

ec2metadata --instance-id
8
Akash Arya

より現代的な解決策。

Amazon Linuxからec2-metadataコマンドはすでにインストールされています。

ターミナルから

ec2-metadata -help

利用可能なオプションを提供します

ec2-metadata -i

戻ります

instance-id: yourid
8
DetDev

すべてのec2マシンの場合、instance-idはファイルにあります。

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

次のコマンドを実行してインスタンスIDを取得することもできます。

    ec2metadata --instance-id
8
Aman

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]
7
Kevin Meyer

これを試すことができます:

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

最新のJava SDKにはEC2MetadataUtilsがあります。

Javaの場合:

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

Scalaでは:

import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
6
Scott Smith

私は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
*************************************************************/
    }
}
6
bboyle1234

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
4

あなたがpythonを使用してすべての利用可能なインスタンス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
Vikas Satpute

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
dmikalova

私はEC2メタデータサービスへのアクセスを提供するためにFuseファイルシステムを書きました: https://bitbucket.org/dgc/ec2mdfs 。私はこれをすべてのカスタムAMIで実行します。それは私がこのイディオムを使うことを可能にします:cat/ec2/meta-data/AMI-id

1
dgc

var/lib/cloud/instanceシンボリックリンクをチェックするだけで、/var/lib/cloud/instances/{instance-id}を指すはずです。ここで{instance_id}はあなたのインスタンスIDです。

1
greg

あなたがrootとしてユーザーを述べた質問で、私が言及するべきであることの一つはインスタンスIDがユーザーに依存していないということです。

Node開発者向け

var meta  = new AWS.MetadataService();

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

EC2リソースに関連するすべてのメタデータは、実行されている次のコマンドを使用してEC2インスタンス自体からアクセスできます。

CURL:

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

あなたのケースでは: "metadata-requested"はinstance-idであるべきです、「api-version」は通常最新に使用できます。

追加の注意:上記のコマンドを使用して、EC2属性の下に関連する情報を取得することもできます。

AMI ID、AMI起動インデックス、AMIマニフェストパス、ブロックデバイスマッピング/、ホスト名、iam /、インスタンスアクション、インスタンスID、インスタンスタイプ、ローカルホスト名、ローカルipv4、mac、 metrics /、network /、placement /、プロファイル、public-hostname、public-ipv4、public-keys /、予約ID、セキュリティグループ、サービス/、

詳細については、このリンクをたどってください。 https://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

0
Vipin Sharma

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
0
demonicdaron

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
John

PHPの場合

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

@ Johnごとに編集

0
Beachhouse

これを実行してください。

curl http://169.254.169.254/latest/meta-data/

Awsによって提供されるさまざまなタイプの属性を見ることができます。

もっと見るにはこのリンクを使ってください

0

インスタンスメタデータを取得するには

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

あなたは、MetadataとUserdataを取得するためのHTTPリクエストに対して請求されることはありません。

Else

EC2インスタンスメタデータクエリツールは、ドキュメントに記載されているようにcurlを使用して実行中のEC2インスタンス内からEC2インスタンスメタデータをクエリする単純なbashスクリプトです。

ツールをダウンロードしてください。

$ 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
Sarat Chandra

AWS Elastic Beanstalkの場合はeb tags --listを実行します。

0
user2584621