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의 래퍼 일 뿐이지 만 본질적으로 동일한 작업을 수행합니다.
dannosaur

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

81

이를 달성하는 또 다른 방법이 있습니다.

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찾으려고합니다 . GETus-east-1a
Adam Monsen 2016 년

@AdamMonsen 아마도 일시적인 오류 일 것입니다. 나는 us-east-1a에 있고 훌륭하게 작동합니다.
Florin Andrei

@FlorinAndrei에게 감사합니다. 나에게도 효과가 있습니다.
Adam Monsen

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/.$//'

데비안 기반 시스템의 경우 명령에는 대시가 없습니다.

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

6
지역 이름만으로 순수한 문자열을 얻으십시오.ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
nahsh

ec2-metadata기본적으로 사용 가능한 것이 아닌 것 같습니다-설치 지침을 포함시킬 수 있습니까?
Tim Malone

23

정규 표현식을 피하려면 다음을 사용하여 파이썬으로 할 수있는 한 줄짜리입니다.

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

이 답변은 더 높아야합니다!
코스타스 데미리스

@KostasDemiris 동의합니다. 정규 표현식보다 JSON 구조에서 값을 읽는 것이 좋습니다.
lasec0203

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망했어.
dannosaur

2
central처음에 답을 쓸 때 존재하지 않았습니다. 지금 추가되었습니다.
Daniel Kuppitz

22
AWS가 새로운 지역을 추가 할 때마다 중단되는 스크립트는 나에게 특히 강력한 솔루션처럼 보이지 않습니다.
Ryan B. Lynch

1
grep 대신 awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'AZ 이름의 처음 두 구성 요소 만 유지합니다.
dskrvk

당신은 당신이 사이에 distringuish 어떻게, 처음 두 구성 요소를 유지하는 경우 @dskrvk eu-west-1, eu-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)
Gert van den Berg


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
그것은 두 줄입니다
Christian

1
그러나 이것은 미국 서부 지역에서는 작동하지 않습니다. 반환 curl: (6) Could not resolve host: instance-data; Name or service not known오류입니다.
SK Venkat

1
@SKVenkat VPC의 DNS 설정과 관련이있을 수 있습니다 ... 메타 데이터 -api에 IP를 사용하는 것이 더 안전 해 보입니다 (다른 답변의 절반이 그렇게합니다)
Gert van den Berg

@GertvandenBerg, 나는 그것을 두 번째로 ..
SK Venkat

9

jq를 설치 했다면 다음 과 같이 할 수도 있습니다 (아마도 가장 "우아한"방법).

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

예쁘게 인쇄하거나 다른 형식을 지정하지 않고 "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 2016 년

끝에 쉼표가 나타납니다.
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"). 아마존이이 패턴을 어기면 위의 논리는 더 이상 작동하지 않습니다.
매트 솔 니트

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/.$//'대시 해야합니다
Vladimir Kondratyev

3

Windows에서 실행중인 경우이 powershell one-liner를 사용할 수 있습니다.

$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에 두 글자 이상이있는 지역이없는 한


0

로그인 한 EC2에 대한 정보를 찾으려면 ec2-metadata 도구를 사용할 수 있습니다.

이 링크를 따라 도구를 설치할 수 있습니다 . 도구를 설치 한 후 실행할 수 있습니다

# ec2-metadata -z

지역을 찾을 수 있습니다.

이 도구는 최신 (10.10) Ubuntu AMI와 함께 설치되며


4
이것은 올바르지 않습니다. ec2-metadata -z리전이 아닌 가용 영역 만 표시합니다.
매트 솔 니트

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이전의 더 이상 유효하지 않은 명령입니다.)


선택한 가상 상자 유형에 따라 달라질 수 있습니다. 나는 리눅스를 고수한다.
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.