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.254inのエイリアスを作成するのを止め/etc/hostsられる人はいません。
vladr

2
Java SDKではどうですか?そのURLでGETを行わずにこれを取得する方法はありますか?SDKにない場合は奇妙に見える
Kevin M

1
とても助かります、ありがとう。最後の行の正規表現を理解しようとしている他の人のために、私が思いついたのは$次のとおりです。行の終わり()で、1つ以上の小文字が続く1つ以上の数字を見つけます。数字のみで置き換えます。(バックスラッシュ+括弧は、sedに部分文字列を記憶するように指示し\1ます。これはで呼び出されます。)これは少し読みやすくなっています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
Jay P.

20
2016-02-04に確認しました。「instance-data」ホスト名が(a)そのドキュメントに記載されておらず、(b)新しいEC2ホストでは(私にとって)機能しないことがわかりました。ドキュメント-docs.aws.amazon.com/AWSEC2/latest/UserGuide/…-は、169.254のアドレスについてのみ言及しており、「instance-data」ホスト名については言及していません。つまり、169.254.169.254 / latest / meta
idを

138

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

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

または、Ubuntuやその他のLinuxフレーバーではec2metadata --instance-id(このコマンドはデフォルトではubuntuにインストールされていない可能性がありますが、で追加できますsudo apt-get install cloud-utils

その名前が示すように、コマンドを使用して他の有用なメタデータも取得できます。


3
これを使用することを考えている場合、この記事は一読の価値があります(tldr:コマンドラインツールはJavaであり、Javaの起動時間は長いです)
James

ベストアンサー
チャックルバット

@Marc Nope。いいえ-ec2です。それはec2metadata --instance-id
Dawny33

5
コマンドはLinuxによって異なります。AmazonLinuxのec2-metadata場合、Ubuntuの場合と異なりますec2metadata
James

ジェームズさん、同じec2metadataがUbuntuで動作していることがわかりました。
pyAddict

69

Ubuntuでできること:

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は、ramdisk IDを表示します
    --reservation-id予約IDを表示します

    --ami-id ami idを表示します
    --ami-launch-index ami起動インデックスを表示します
    --ami-manifest-pathはamiマニフェストパスを表示します
    --ancestor-ami-idsはami先祖IDを表示します
    --product-codesはamiに関連付けられた製品コードを表示します
    --availability-zone AMI配置ゾーンを表示します

    --instance-idはインスタンスIDを表示します
    --instance-typeインスタンスタイプを表示します

    --local-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はユーザーデータを表示します(実際にはメタデータではありません)

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にあるようです
クレイグリンガー2013年

50

/dynamic/instance-identity/documentインスタンスID以外のクエリも必要な場合は、URLを使用します。

wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document

これにより、このようなJSONデータが取得されます- リクエスト1つだけです。

{
    "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を含むすべての詳細を表示するための+1
Luksurious

1
この単純なタスクのためだけに追加のパッケージをインストールすることなく、かなり標準(wgetのみ)と作業ライン(amazon linuxではインスタンスデータのURLが機能しませんでした)を持つ+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を使用するインスタンスの
追加設定なしでの作業

22

powershellの場合:

(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 '13

ssm send-command(またはSend-SSMCommand)を使用してEC2インスタンスでスクリプトを実行すると、Invoke-WebRequestが常に機能するとは限りません。それは本当にドキュメントには書かれていません。おそらくそれは非同期ではありません...それは奇妙でしょう。しかし、これまでのところstefancaunterのオプションは問題なく機能します。
J-Roel 2017

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」を直接呼び出すことができます。関連する提案された編集を行いました。
サッカリン

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

これは、質問が要求されたインスタンスIDではなく、インスタンスが存在するリージョンを取得することを理解していますか?
LukeGT、2015年

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; })
アルマジロジム・

20

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

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

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

    ec2metadata --instance-id

2
これは、HTTPリクエストを必要としない、非常にクリーンなソリューションです。
ユーリ

実際の最良の答え
Shlublu 2018年

1
すばらしい答えですが、ドキュメントでこれに関するリファレンスを見つけることができませんでした。あなたのリファレンスは何ですか?懸念事項は、このコードを本番環境で実行する場合、将来的に変更されないことをどのようにして確認できるかということです。
shaya ajzner 2018年

すべてのLinux ec2マシン、おそらくすべてではありませんが、すべての ec2マシン。Windowsではそのようなファイルはありません。 C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.logインスタンスIDが含まれていますが、他にも多くのジャンクが含まれています。
James

14

この投稿を参照してください-指定されたURLのIPアドレスは一定です(最初は混乱しました)が、返されるデータはインスタンスに固有です。


リンクは私のために404ingです
repalviglator

以下の@DEtDevの回答を確認してください。私の回答はかなり古く、リンクが削除されているようです。
gareth_bowles

10

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]

1
なんてこった!あなたは私の編集を盗んだ!stackoverflow.com/review/suggested-edits/4035074
kixorz

3
ごめんなさい。「良い編集です。私はOPです。これを受け入れてください」と言う方法がわかりませんでした。
Kevin Meyer 14

10

より現代的なソリューション。

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

ターミナルから

ec2-metadata -help

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

ec2-metadata -i

戻ります

instance-id: yourid

1
疑似IPに依存するよりもはるかに良い
マイクD

ここec2-metadataで、あなたのmotdドキュメントと組み合わせてください:coderwall.com/p/hr_9pw/motds-on-amazon-amis
Mike D

2
Ubuntuイメージでは、コマンドは「ec2metadata --instance-id」であり、インスタンスID値のみを返します
AlbertoMegíaMar


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次のものがあります。

Javaの場合:

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

Scalaの場合:

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

あなたが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

FWIW EC2メタデータサービスへのアクセスを提供するFUSEファイルシステムを作成しました:https : //bitbucket.org/dgc/ec2mdfs。これをすべてのカスタム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

rootとしてユーザーについて言及した質問で、インスタンスIDはユーザーに依存しないということを1つ挙げておきます。

ノード開発者にとって、

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'];

@Johnごとに編集


しかし、PHPにcurl関数とネイティブ関数がある場合、なぜその目的でGuzzeHttpを使用するのでしょうか。
John

それは私の好みです。私は他の多くのことにguzzleを使用していますが、それは他の多くのパッケージにも共通の前提条件です。
ビーチハウス2017

$ 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-requested "はinstance-idである必要があり、 " api-version "は通常使用できる最新のものです。

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

ami-id、ami-launch-index、ami-manifest-path、block-device-mapping /、ホスト名、iam /、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、services /、

詳細については、次のリンクを参照してください: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.