EC2インスタンス内からリージョンを検索する


131

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

インスタンスID見つける方法に似たものを探しています



8
すべてのシェルスクリプトを気にしない人のための短い回答:可用性ゾーンを取得しhttp://169.254.169.254/latest/meta-data/placement/availability-zone、最後の文字を削除します。
Sarsaparilla

回答:


147

その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]$//'`"

お役に立てれば。

編集:sedコメントに基づいて改善


4
これはEC2インスタンスで実行さ、AWSのバックエンドを利用しています。他の場所では機能しません(そのIPがAPIPAであるためです)。また、メタデータソースに接続せずにインスタンス内から直接この情報を取得する方法はありません。これは、169.254.169.254 APIが使用可能であり、スクリプトがそれに応じてネットワーク障害を処理することを前提としています。ec2-metadataはこのAPIの単なるラッパーですが、基本的に同じことを行います。
ダンノサウルス2015

1
これは文書化されたものですか?どうやって見つけたのですか?
meawoppl

2
正直なところ、その2ライナーを思いついたときは、正しいリージョンを特定するために使用できるものを探すためにAPIを探していました。AWSのメタデータAPIは完全にここに文書化されている:docs.aws.amazon.com/AWSEC2/latest/UserGuide/...
dannosaurを

12
EC2_REGIONに提供されているコマンドよりもはるかに単純なsed replaceコマンド:sed 's/[a-z]$//
threejeez

2
これがブートスクリプトにある場合は、メタデータサービスがまだインスタンス化されていない可能性があります。インスタンス化されている場合は、しばらくしてからもう一度お試しください。メタデータの場所が利用可能になるまで、起動後10〜15秒かかることがわかりました。
vacri 2018年

81

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

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

echo $REGION

us-east-1

これは任意のリージョン/ az(および任意のAMI)で機能しますか?のマシンからそのURLにアクセス404 - Not FoundしようとしGETていますus-east-1a
Adam Monsen 2012年

@AdamMonsenはおそらく一時的なエラーでした。私はus-east-1aにいます。
Florin Andrei 14年

@FlorinAndreiに感謝します。今も私のために働く。
Adam Monsen 2014年

3
jqの場合:curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
Yaron

4
awkを使用:curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F\" '/region/ {print $4}'
Yaron

38

の使用jqに問題がない場合は、次のコマンドを実行できます。

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

それが一番きれいな方法だと思います。


31
ec2-metadata --availability-zone | sed 's/.$//'

debianベースのシステムの場合、コマンドにはダッシュがありません。

ec2metadata --availability-zone | sed 's/.$//'

6
:領域のみ名で純粋な文字列を取得しますec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
nahsh

ec2-metadataデフォルトで利用できるものではないようです-インストール手順を含めることができますか?
Tim Malone

23

正規表現を避けたい場合は、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']"

この答えはもっと高いはずです!
Kostas Demiris 2016

@KostasDemiris同意する、正規表現よりもJSON構造から値を読み取る方がはるかに重要です。
lasec0203 2017

1
これは、jqがインストールされていない場合に最適な方法のように思われます。AWSがこれを169.254.169.254/latest/meta-data/placement/regionのようなものとして公開することを本当に期待するでしょう...
Krenair

17

ec2-metadataを使用できます。

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

2
これで、あなたが入っeu-central-1ているなら、あなたはねじ込まれています。
ダンノサウルス2015

2
central最初に答えを書いたときは存在しませんでした。今追加されました。
Daniel Kuppitz、2015

22
AWSが新しいリージョンを追加するたびに中断するスクリプトは、特に強力なソリューションのようには思えません。
ライアンB.リンチ

1
grepの代わりにawk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'、AZ名の最初の2つのコンポーネントのみを保持します。
dskrvk 2016

あなたはちょうどあなたが間distringuishんどのように、最初の二つの成分を保持する場合@dskrvk eu-west-1eu-west-2及びeu-west-3(がもus-west-1us-west-2)@OP:ちょうどマッチングが'[a-z][a-z]-[a-z]*-[0-9][0-9]*'より安全と思われる(基本的な正規表現であること、それは、拡張REを短くすることができます)。(現在の正規表現は、上に壊れるca、領域af領域とme領域)
ゲルトヴァンデンバーグ


14

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

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

4
それは2行です
Christian

1
しかし、これはus-west-1リージョンでは機能しません。curl: (6) Could not resolve host: instance-data; Name or service not knownエラーを返します。
SK Venkat 2018

1
@SKVenkatこれはVPCのDNS設定に関連している可能性があります... metadata-apiにIPを使用する方が安全に見えます(他の回答の半分はそれを行います)
Gert van den Berg

@GertvandenBerg、私は2番目のそれ...
SKヴェンカト

9

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

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

これは、「印刷」やその他のフォーマットを行わずに、単に「地域」の生の値を返します。リファレンス:AWSフォーラム


7

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

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

6

JQを使用:

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


4

これは私が見つけた最もきれいな解決策です:

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と基本的なsedのみを使用するため、SDKやツールへの依存関係はインストールされない可能性があります。
  • アベイラビリティーゾーン名を解析しようとしないので、AWSがAZ /リージョン名の形式を変更しても心配ありません

うん、ありがとう。この結果は、jsonオブジェクトに簡単にデシリアライズできます。
dynamiclynk 2015年

最後にカンマが出ます。
Craig

4

https://unix.stackexchange.com/a/144330/135640のおかげで、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がリージョンに追加されたアベイラビリティーゾーンに単一の文字を引き続き使用することを前提としています。


5
私たちは常にシェルの最後のキャラクターを取り除くことができました:region=${region%?}
David Jones

4

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

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

4

良い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

または、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:]])}"}

2
現在、アベイラビリティーゾーンは常に小文字のリージョン名が付加されているため、これが機能することに注意してください(例:リージョンは「us-west-1」、ゾーンは「us-west-1a」)。Amazonがこのパターンに違反した場合、上記のロジックは機能しなくなります。
Matt Solnit、2011

3

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

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

3

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

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

ec2metadata --availability-zone | sed 's/.$//'(ダッシュなしで)する必要があります
ウラジミールコンドラチェフ

3

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

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

1

インスタンスからリージョンを見つけるためのソリューションも探していましたが、これが私の純粋なBashソリューションです。

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

AZに3文字以上ある地域がない限り、私は知らない。


0

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

このリンクからツールをインストールできます。 ツールをインストールした後、実行できます

# ec2-metadata -z

地域を見つけるために。

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


4
これは誤りです。 ec2-metadata -zリージョンではなく、アベイラビリティーゾーンのみを表示します。
Matt Solnit、2011

0

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

ec2metadata(ダッシュなし)は、ec2ボックスに関するすべてのawsホスティング情報を提供する現在のコマンドです。これは最もエレガントで安全なアプローチです。(ec2-metadataは古く、もはや有効なコマンドではありません。)


これは、選択した仮想ボックスのタイプによって異なります。私はLinuxを使います。
GViz

0

egrepのみを使用する方法。追加のツールをインストールする必要なく、起動したほとんどすべてのLinuxインスタンスで機能します。現在のすべてのAWSリージョンのリストに対してこれをテストしましたが、すべてが一致しています。

curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]'

正規表現の説明:

  • "(\ w)+"これは任意の数の文字に一致します
  • 「-」は単一のダッシュのみに一致します
  • 「[0-9]」は任意の1つの数字に一致します

これを変数に入れる場合は、次のようにします。

region=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]')


0

sedおよびcurlソリューションの場合、形式が少し変更されたようです。私にとっては

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

0

これらの回答のほとんどが投稿された後のある時点で、AWSは合理的なことを行い、新しいパスを実装しました。 latest/meta-data/placement/region

つまり、リージョンの取得は、

REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"

0

このカールリクエストを使用してインスタンスリージョンを取得できます

$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.