回答:
この件に関する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
ます。
$
次のとおりです。行の終わり()で、1つ以上の小文字が続く1つ以上の数字を見つけます。数字のみで置き換えます。(バックスラッシュ+括弧は、sedに部分文字列を記憶するように指示し\1
ます。これはで呼び出されます。)これは少し読みやすくなっています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 AMIでは、次のことができます。
$ 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 --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はユーザーデータを表示します(実際にはメタデータではありません)
/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"
}
AWS Linuxの場合:
ec2-metadata --instance-id | cut -d " " -f 2
出力:
i-33400429
変数での使用:
ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";
powershellの場合:
(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が含まれていますが、他にも多くのジャンクが含まれています。
この投稿を参照してください-指定されたURLのIPアドレスは一定です(最初は混乱しました)が、返されるデータはインスタンスに固有です。
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]
より現代的なソリューション。
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]\)"`
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
*************************************************************/
}
}
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
あなたが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'])
FWIW EC2メタデータサービスへのアクセスを提供するFUSEファイルシステムを作成しました:https : //bitbucket.org/dgc/ec2mdfs。これをすべてのカスタムAMIで実行します。このイディオムを使用することができます:cat / ec2 / meta-data / ami-id
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ソースです。
rootとしてユーザーについて言及した質問で、インスタンスIDはユーザーに依存しないということを1つ挙げておきます。
ノード開発者にとって、
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リクエストに対して課金されることはありません。
そうしないと
ドキュメントに記載されているように、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
お力になれて、嬉しいです.. :)
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()に行きます
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-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
AWS Elastic beanstalk eb cli runの場合 eb tags --list
169.254.169.254
inのエイリアスを作成するのを止め/etc/hosts
られる人はいません。