머신이 EC2 인스턴스인지 확인하는 방법 인 호스트에서 일부

EC2 인스턴스 인 호스트에서 일부 스크립트를 실행하고 싶지만 호스트가 실제로 EC2 인스턴스 인지 확인하는 방법을 모르겠습니다 .

몇 가지 테스트를했지만 충분하지 않습니다.

  • 바이너리 ec2_userdata가 사용 가능한지 테스트하십시오 (그러나 항상 해당되는 것은 아님).
  • http://169.254.169.254/latest/meta-data “의 가용성을 테스트하십시오.


답변

실제로 호스트가 EC2 인스턴스인지 감지하는 매우 간단한 방법이 있습니다. 퍼블릭 IP의 역방향 조회를 확인하십시오. EC2 반전은 놓치기 매우 어렵습니다.

또한 수정하지 않은 경우 호스트 이름이 반대로되어 더 쉽게 찾을 수 있습니다.

EC2 인스턴스 태그를 가져 오는 표준 방법이므로 실제로 “매직 IP”를 사용할 수도 있지만 EC2 네트워크에 있지 않은 경우 일반적으로 그렇지 않은 타임 아웃을 기다려야합니다. 바람직한…

이러한 방법으로 충분하지 않은 경우 IP를 만든 후 Amazon EC2 IP 블록 내에 있는지 확인하십시오.

편집 :이 작은 쉘 비트를 사용할 수 있습니다 :

#!/bin/bash
LOCAL_HOSTNAME=$(hostname -d)
if [[ ${LOCAL_HOSTNAME} =~ .*\.amazonaws\.com ]]
then
        echo "This is an EC2 instance"
else
        echo "This is not an EC2 instance, or a reverse-customized one"
fi

하지만 [[는 bashism입니다. Python 또는 Perl uniline YMMV를 사용할 수도 있습니다.


답변

오류 메시지를 피하고 스크립트에 사용 예를 포함시키기 위해 Hannes의 답변을 변경했습니다.

if [ -f /sys/hypervisor/uuid ] && [ `head -c 3 /sys/hypervisor/uuid` == ec2 ]; then
    echo yes
else
    echo no
fi

Windows 인스턴스에서는 작동하지 않습니다. 컬에 비해 이점은 EC2와 비 EC2 모두에서 순간에 가깝다는 것입니다.


답변

먼저 기존 답변에 대한 다음과 같은 미묘한 문제로 인해 @qwertzguy의 답변에 대한 내 의견에 대한 질문을받은 후 새로운 답변을 게시해야한다고 생각했습니다 . 현재 답변과 관련된 문제는 다음과 같습니다.

  1. 허용 대답 @MatthieuCerda에서 확실히 이상하지 나에 대해 검사 어떤 VPC 인스턴스에 안정적으로 작동하지 않습니다. (내 경우 hostname -d에는 “amazonaws.com”이없는 내부 DNS에 사용되는에 대한 VPC 이름을 얻 습니다.)
  2. @qwertzguy 의 최고 투표 답변 은이 파일이없는 새 m5 또는 c5 인스턴스 에서 작동하지 않습니다. 있지만,이 행동 변화 AFAIK를 문서화하는 무시 아마존 문서 페이지 이 주제에 대한 말을 않는 “… 하면 / SYS / 하이퍼 바이저 / UUID 존재 …”. 이 변경이 의도적인지 AWS 지원에 요청했습니다. 아래 †를 참조하십시오.
  3. DNS 조회가 작동하지 않을 수 있기 때문에 @Jer답변이 모든 곳에서 반드시 작동하는 것은 아닙니다 instance-data.ec2.internal. 방금 테스트 한 Ubuntu EC2 VPC 인스턴스
    $ curl http://instance-data.ec2.internal
    curl: (6) Could not resolve host: instance-data.ec2.internal

    에서이 방법에 의존하는 코드가 EC2에 있지 않다고 잘못 판단하게됩니다!
  4. @tamale 에서 사용dmidecode 하는 대답 은 효과가있을 수 있지만 a.) dmidecode인스턴스에서 사용할 수 있고 b.) sudo코드 내에서 루트 또는 암호가없는 기능 이 있어야 합니다.
  5. 대답은 / SYS / 장치를 확인 / 가상 / DMI / ID / bios_version @spkane에서 위험하게 오해의 소지가있다! 나는 1 개 우분투 14.04 M5 인스턴스를 확인하고있어 bios_version1.0. 이 파일은 Amazon의 doc에 전혀 문서화되어 있지 않으므로 실제로 의존하지는 않습니다.
  6. 신뢰할 수없는 타사 URL을 확인 하고 결과에 사용하는 @ Chris-Montanaro답변 중 첫 번째 부분은 whois여러 수준에서 문제가 있습니다. 해당 답변에서 제안 된 URL은 현재 404 페이지입니다. 당신이 일을했던 제 3 자 서비스를 발견했다하더라도, 그것은 비교적 것이 매우 (로컬 파일을 확인 비해) 느리고 가능 속도 제한 문제 또는 네트워크 문제로 실행, 또는 아마도 당신의 EC2 인스턴스도 가지고 있지 않습니다 외부 네트워크 액세스.
  7. @ Chris-Montanarohttp://169.254.169.254/ 를 확인 하는 대답에 대한 두 번째 제안은 조금 낫지 만 다른 클라우드 제공 업체는 다른 클라우드 공급자 가이 인스턴스 메타 데이터 URL을 사용할 수 있다고 언급하므로 거짓을 피해야합니다. 긍정적. 또한 로컬 파일보다 훨씬 느릴 것입니다.로드가 많은 인스턴스 에서이 검사가 특히 느리게 (수 초) 반환되는 것을 보았습니다. 또한, 특히 @ algal ‘s answer 에서와 같이이 주소가 아무데도 멈추거나 중단 될 수있는 EC2가 아닌 인스턴스에서 매우 오랫동안 중단되지 않도록 컬에 인수 -m또는 --max-time인수 를 전달 해야합니다 .

또한 (가능한) 파일 확인에 대한 아마존의 문서화 된 폴백을 언급 한 사람은 아무도 없습니다 /sys/devices/virtual/dmi/id/product_uuid.

EC2에서 실행 중인지 판단하는 것이 너무 복잡하다는 것을 누가 알았습니까?! 이제 나열된 접근법에 대한 문제가 대부분 있었으므로 EC2에서 실행 중인지 확인하기 위해 제안 된 bash 스 니펫이 있습니다. 나는 이것이 거의 모든 Linux 인스턴스에서 일반적으로 작동해야한다고 생각합니다 .Windows 인스턴스는 독자에게 연습입니다.

#!/bin/bash

# This first, simple check will work for many older instance types.
if [ -f /sys/hypervisor/uuid ]; then
  # File should be readable by non-root users.
  if [ `head -c 3 /sys/hypervisor/uuid` == "ec2" ]; then
    echo yes
  else
    echo no
  fi

# This check will work on newer m5/c5 instances, but only if you have root!
elif [ -r /sys/devices/virtual/dmi/id/product_uuid ]; then
  # If the file exists AND is readable by us, we can rely on it.
  if [ `head -c 3 /sys/devices/virtual/dmi/id/product_uuid` == "EC2" ]; then
    echo yes
  else
    echo no
  fi

else
  # Fallback check of http://169.254.169.254/. If we wanted to be REALLY
  # authoritative, we could follow Amazon's suggestions for cryptographically
  # verifying their signature, see here:
  #    https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
  # but this is almost certainly overkill for this purpose (and the above
  # checks of "EC2" prefixes have a higher false positive potential, anyway).
  if $(curl -s -m 5 http://169.254.169.254/latest/dynamic/instance-identity/document | grep -q availabilityZone) ; then
    echo yes
  else
    echo no
  fi

fi

분명히, 더 많은 폴백 검사를 통해이를 확장 할 수 /sys/hypervisor/uuid있으며 우연히 “ec2″로 시작 하는 오 탐지 등의 처리에 대한 편집증을 포함시킬 수 있습니다. 그러나 이것은 예시 목적으로 사용되며 거의 모든 병리학 적 사용 사례에 대한 충분한 솔루션입니다.

[†] c5 / m5 인스턴스 변경에 대한 AWS 지원의 설명을 다음에서 확인하십시오.

C5 및 M5 인스턴스는 새로운 하이퍼 바이저 스택 을 사용하며 관련 커널 드라이버는 다른 / 이전 인스턴스 유형에서 사용 하는 Xen 드라이버가 그렇듯이 sysfs (/ sys에 마운트 됨)에 파일을 만들지 않습니다 . 운영 체제가 EC2 인스턴스에서 실행 중인지 여부를 감지하는 가장 좋은 방법은 연결설명서에 나열된 다양한 가능성을 설명하는 것 입니다.


답변

IP 대신 EC2 내부 도메인 이름으로 메타 데이터를 찾으십시오. 그러면 EC2에 있지 않은 경우 빠른 DNS 오류가 발생하고 IP 충돌 또는 라우팅 문제가 발생하지 않습니다.

curl -s http://instance-data.ec2.internal && echo "EC2 instance!" || echo "Non EC2 instance!"

일부 배포판에서는 매우 기본적인 시스템 또는 설치 단계 초기에 컬을 사용할 수 없습니다. 사용 wget과 대신 :

wget -q http://instance-data.ec2.internal && echo "EC2 instance!" || echo "Non EC2 instance!"


답변

목표가 EC2 인스턴스인지 아니면 Google과 같은 다른 종류의 클라우드 인스턴스인지를 알리는 것이라면 dmidecode매우 잘 작동하며 네트워킹이 필요하지 않습니다. EC2와 GCE의 메타 데이터 URL 경로가 다르기 때문에 다른 접근 방식과 비교하여이 방법을 선호합니다.

# From a google compute VM
$ sudo dmidecode -s bios-version
Google

# From an amazon ec2 VM
$ sudo dmidecode -s bios-version
4.2.amazon


답변

호스트 이름이 변경 될 수 있습니다. 퍼블릭 IP에 대해 whois를 실행하십시오.

if [[ ! -z $(whois $(curl -s shtuff.it/myip/short) | grep -i amazon) ]]; then
  echo "I'm Amazon"
else
  echo "I'm not Amazon"
fi

또는 AWS 메타 데이터 URL을 누르십시오

if [[ ! -z $(curl -s http://169.254.169.254/1.0/) ]]; then
  echo "I'm Amazon"
else
  echo "I'm not Amazon"
fi


답변

이것은 ec2의 Linux 호스트에서도 잘 작동하며 네트워크 및 관련 시간 초과가 필요하지 않습니다.

grep -q amazon /sys/devices/virtual/dmi/id/bios_version

아마존 이이 항목을 다음과 같이 정의하기 때문에 작동합니다.

$ cat /sys/devices/virtual/dmi/id/bios_version
4.2.amazon