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-1과 us-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.