web-dev-qa-db-ja.com

EC2インスタンス内から地域を見つける

インスタンス内からインスタンスの領域を検索する方法はありますか?

インスタンスIDを見つける のメソッドに似たものを探しています。

116
Gary Richardson

そのURL( http://169.254.169.254/latest/dynamic/instance-identity/document )はもう機能していないようです。使用しようとすると404が表示されます。次のコードがありますが、動作するようです:

EC2_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed 's/[a-z]$//'`"

お役に立てれば。

EDIT:コメントに基づいてsedを改善

127
dannosaur

それを達成するもう1つの方法があります。

REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'`

echo $REGION

us-east-1
74
mgarman

jqを使用しても問題ない場合は、次を実行できます。

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r

私はそれが最もきれいな方法だと思います。

32
Ilya Sher
ec2-metadata --availability-zone | sed 's/.$//'
26
Jose Alban

Ec2-metadataを使用できます。

ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
18
Daniel Kuppitz

正規表現を避けたい場合は、Pythonで実行できる1行のライナーを次に示します。

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | python -c "import json,sys; print json.loads(sys.stdin.read())['region']"
16
Jaeyoung Chun

私がこれまでに見つけた最も簡単な

 curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
15

非常にシンプルなワンライナー

export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}
13
Ravi Kumar

jqがインストールされている場合、次の方法で(おそらく最も「優雅な」方法で)実行することもできます。

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region

これは、きれいな印刷やその他の書式設定を行わずに、単に「地域」の生の値を返します。リファレンス: AWSフォーラム

8
Arbab Nazar

アベイラビリティーゾーンからリージョンを取得し、その最後の文字を取り除きます。

ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//'
6
mohrt

JQを使用:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
5
Spanky

https://unix.stackexchange.com/a/144330/13564 のおかげで、bash 4.2以降では、アベイラビリティゾーンから最後の文字を削除できます。

$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1

これは、リージョンに追加されたアベイラビリティーゾーンにAWSが引き続き単一の文字を使用することを前提としています。

4
Steve Jansen

これは私が見つけた最もクリーンなソリューションです:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/  "region" : "\(.*\)"/\1/p'

例えば。、

export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/  "region" : "\(.*\)"/\1/p')

  • API呼び出しを行わず、EC2インスタンスのメタデータを使用します
  • Curlとbasic sedのみを使用するため、SDKまたはツールへの依存関係はインストールされません。
  • アベイラビリティーゾーン名を解析しようとしないので、AWSがAZ /リージョン名の形式を変更しても心配ありません
4
Kelly Setzer

これらの答えを読んだ後に最終的に見つけた非常に簡単な解決策:

$ hostname -f | cut -d'.' -f2

例:

[centos @ ip-172-31-10-75〜] $ホスト名-f

ip-172-31-10-75.us-west-1.compute.internal

[centos @ ip-172-31-10-75〜] $

[centos @ ip-172-31-10-75〜] $ hostname -f |カット-d '。' -f2

us-west-1

4
S.K. Venkat

AWS Java SDKを使用できる場合、現在のリージョン名(「us-east-1」、「eu-west-1」など)を返すメソッドがあります。

http://docs.aws.Amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/regions/Regions.html#getCurrentRegion()

4
Ken Weiner

または、Ubuntuまたはこのツールを要件にせずに、単純に実行します。

: "${EBS_VOLUME_AVAILABILITY_ZONE:=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)}"
: ${EBS_VOLUME_REGION:="${EBS_VOLUME_AVAILABILITY_ZONE%%*([![:digit:]])}"}
3
flaccid

Jsonを使用する場合は、適切なツールを使用してください。この場合、jqは非常に強力です。

# curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region'
eu-west-1
3
Alan

検索ドメインとしてec2.internalを使用している限り機能する2ライナー:

az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
3
Gil Zellner

良いol powershellでこれをしたい人のために

$var = (curl http://169.254.169.254/latest/dynamic/instance-identity/document | Select-String-Pattern "Zone" | ConvertFrom-Json | Select-Object -ExpandProperty "region")
echo $var
3
dank

これは、eu-central-1およびさまざまな文字ゾーンで機能します。 (上記のsed回答に返信するのに十分な担当者がいません)

ec2-metadata --availability-zone | sed 's/[a-z]$//'
2
Tyler Kellogg

インスタンスから領域を見つけるためのソリューションも探していましたが、ここに私の純粋なBashソリューションがあります:

az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}

aZに3文字以上の領域がある場合を除き、これは私にはわかりません。

1
Ajax

ログインしているEC2に関する情報を見つけるには、ec2-metadataツールを使用できます。

このリンク。 を使用してツールをインストールできます。ツールをインストールしたら、次を実行できます。

# ec2-metadata -z

地域を見つけるために。

このツールには、最新の(10.10)Ubuntu AMIがインストールされています。

0
sheki

Windows上で実行している場合、このpowershellワンライナーを使用できます。

$region=(Invoke-RestMethod "http://169.254.169.254/latest/dynamic/instance-identity/document").region
0
cwa

JSを使用して領域を取得しようとしている場合、これは動作するはずです:

meta.request("/latest/meta-data/placement/availability-zone",function(err,data){
        if(err)
                console.log(err);
        else{
                console.log(data);
                str = data.substring(0, data.length - 1);
                AWS.config.update({region:str});
                ec2 = new AWS.EC2();
            }
     });

これは、メタデータAPI呼び出しへの応答として、AWS DOCSから見つかったマッピングでした。最後の文字を削除するだけで機能します。

  eu-west-1a :eu-west-1
  eu-west-1b :eu-west-1
  eu-west-1c :eu-west-1
  us-east-1a :us-east-1
  us-east-1b :us-east-1
  us-east-1c :us-east-1
  us-east-1d :us-east-1
  ap-northeast-1a :ap-northeast-1
  ap-northeast-1b :ap-northeast-1
  us-west-1a :us-west-1
  us-west-1b :us-west-1
  us-west-1c :us-west-1
  ap-southeast-1a :ap-southeast-1
  ap-southeast-1b :ap-southeast-1
0