인스턴스 메타데이터 검색 - Amazon Elastic Compute Cloud

인스턴스 메타데이터 검색

실행 중인 인스턴스에서 인스턴스 메타데이터를 사용할 수 있기 때문에 Amazon EC2 콘솔 또는 AWS CLI를 사용할 필요가 없습니다. 이는 인스턴스에서 실행할 스크립트를 작성할 때 유용합니다. 예를 들어, 사용자는 인스턴스 메타데이터에서 인스턴스의 로컬 IP 주소에 액세스하여 외부 애플리케이션과의 연결을 관리할 수 있습니다.

인스턴스 메타데이터는 몇 가지 범주로 분류될 수 있습니다. 각 인스턴스 메타데이터 범주에 대한 설명은 인스턴스 메타데이터 카테고리 단원을 참조하십시오.

실행 중인 모든 인스턴스 메타데이터 범주를 살펴보려면 다음 IPv4 또는 IPv6 URI를 사용합니다.

http://169.254.169.254/latest/meta-data/
http://[fd00:ec2::254]/latest/meta-data/

IP 주소는 링크-로컬 주소이며 인스턴스에서만 유효합니다. 자세한 내용은 Wikipedia에서 Link-local address를 참조하십시오.

참고

이 단원의 예에서는 인스턴스 메타데이터 서비스의 IPv4 주소(169.254.169.254)를 사용합니다. IPv6 주소를 통해 EC2 인스턴스의 인스턴스 메타데이터를 검색하는 경우, 대신 IPv6 주소(fd00:ec2::254)를 활성화하고 사용해야 합니다. 인스턴스 메타데이터 서비스의 IPv6 주소는 IMDSv2 명령과 호환됩니다. IPv6 주소는 Nitro 시스템에 구축된 인스턴스에서만 액세스할 수 있습니다.

명령 형식은 IMDSv1를 사용하는지 또는 IMDSv2를 사용하는지에 따라 다릅니다. 기본적으로 두 가지 인스턴스 메타데이터 서비스를 모두 사용할 수 있습니다. IMDSv2를 사용해야 하도록 설정하려면 IMDSv2 사용 단원을 참조하십시오.

다음 예제와 같이 cURL과 같은 도구를 사용할 수 있습니다.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/

인스턴스 메타데이터 및 사용자 데이터를 가져오기 위해 사용되는 HTTP 요청 비용은 청구되지 않습니다.

Considerations

인스턴스 메타데이터 검색 문제를 방지하려면 다음을 고려하세요.

  • AWS SDK는 기본적으로 IMDSv2 호출을 사용합니다. IMDSv2 호출에 응답이 없으면 SDK는 호출을 다시 시도하고 여전히 실패하면 IMDSv1를 사용합니다. 이로 인해 지연이 발생할 수 있습니다. 컨테이너 환경에서 홉 제한이 1인 경우 컨테이너로의 이동이 추가 네트워크 홉으로 간주되므로 IMDSv2 응답이 반환되지 않습니다. IMDSv1로 폴백하는 프로세스와 그로 인한 지연을 방지하려면 컨테이너 환경에서 홉 제한을 2로 설정하는 것이 좋습니다. 자세한 내용은 인스턴스 메타데이터 옵션 구성 섹션을 참조하세요.

  • IMDSv2의 경우 토큰을 검색할 때 /latest/api/token을 사용해야 합니다. 버전별 경로(예: /2021-03-23/api/token)에 대해 PUT 요청을 실행하면 메타데이터 서비스에서 403 Forbidden 오류가 반환됩니다. 이는 의도된 동작입니다.

응답 및 오류 메시지

모든 인스턴스 메타데이터는 텍스트(HTTP 콘텐츠 유형 text/plain)로 반환됩니다.

특정 메타데이터 리소스를 요청하면 적절한 값이 반환되거나 소스를 이용할 수 없는 경우 404 - Not Found HTTP 오류 코드가 반환됩니다.

일반 메타데이터 리소스(/로 끝나는 URI)를 요청한 경우 이용 가능한 리소스 목록이 반환되거나 해당 리소스가 없는 경우 404 - Not Found HTTP 오류 코드가 반환됩니다. 목록 항목은 개별 라인에 표시되고 줄바꿈(ASCII 10)으로 끝납니다.

인스턴스 메타데이터 서비스 버전 2를 사용하여 수행한 요청의 경우 다음 HTTP 오류 코드가 반환될 수 있습니다.

  • 400 - Missing or Invalid ParametersPUT 요청이 유효하지 않습니다.

  • 401 - UnauthorizedGET 요청이 유효하지 않은 토큰을 사용합니다. 권장되는 작업은 새 토큰을 생성하는 것입니다.

  • 403 - Forbidden – 요청이 허용되지 않거나 인스턴스 메타데이터 서비스가 꺼져 있습니다.

인스턴스 메타데이터 검색 예제

인스턴스 메타데이터의 사용 가능한 버전 가져오기

이 예제를 통해 이용 가능한 인스턴스 메타데이터 버전을 가져올 수 있습니다. 이 버전과 Amazon EC2 API 버전은 서로 상관이 없습니다. 이전 버전의 구조 및 정보를 사용하는 스크립트인 경우 이전 버전을 사용할 수 있습니다.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/ 1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01 2009-04-04 2011-01-01 2011-05-01 2012-01-12 2014-02-25 2014-11-05 2015-10-20 2016-04-19 2016-06-30 2016-09-02 latest
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/ 1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01 2009-04-04 2011-01-01 2011-05-01 2012-01-12 2014-02-25 2014-11-05 2015-10-20 2016-04-19 2016-06-30 2016-09-02 latest

최고 수준 메타데이터 항목 가져오기

이 예제는 최고 수준 메타데이터 항목을 가져옵니다. 자세한 내용은 인스턴스 메타데이터 카테고리 섹션을 참조하세요.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname iam/ instance-action instance-id instance-life-cycle instance-type local-hostname local-ipv4 mac metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname iam/ instance-action instance-id instance-type local-hostname local-ipv4 mac metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/

다음 예제에서는 이전 예제에서 얻은 몇 가지 최상위 메타데이터 항목의 값을 가져옵니다. IMDSv2 요청에서는 토큰이 만료되지 않았다고 가정하고 이전 예제 명령에서 생성한 저장된 토큰을 사용합니다.

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id ami-0abcdef1234567890
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-id ami-0abcdef1234567890

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/reservation-id r-0efghijk987654321
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/reservation-id r-0efghijk987654321

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-hostname ip-10-251-50-12.ec2.internal
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-hostname ip-10-251-50-12.ec2.internal

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-hostname ec2-203-0-113-25.compute-1.amazonaws.com
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-hostname ec2-203-0-113-25.compute-1.amazonaws.com

사용 가능한 퍼블릭 키 목록 가져오기

이 예제를 통해 이용 가능한 퍼블릭 키 목록을 획득할 수 있습니다.

IMDSv2
[ec2-user ~]$ `curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key

퍼블릭 키 0을 이용할 수 있는 형식 표시

이 예제는 퍼블릭 키 0을 이용할 수 있는 형식을 보여줍니다.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-keys/0/ openssh-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/ openssh-key

퍼블릭 키 0(OpenSSH 키 형식) 가져오기

이 예제에서는 퍼블릭 키 0(OpenSSH 키 형식)을 획득합니다.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6 b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ 21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4 nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6 b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ 21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4 nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key

인스턴스에 대한 서브넷 ID 가져오기

이 예제에서는 인스턴스에 대한 서브넷 ID를 가져옵니다.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id subnet-be9b61d7
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id subnet-be9b61d7

쿼리 조절

쿼리는 인스턴스당 인스턴스 메타데이터 서비스로 스로틀링되고, 한 인스턴스에서 인스턴스 메타데이터 서비스로의 동시 연결 수에도 제한이 있습니다.

인스턴스 메타데이터 서비스를 사용하여 AWS 보안 자격 증명을 가져올 경우, 모든 트랜잭션 중에 또는 많은 스레드나 프로세스에서 동시에 자격 증명을 쿼리하지 마십시오. 이렇게 하면 조절이 발생할 수 있습니다. 자격 증명 만료일이 다가오기 전까지는 자격 증명을 캐시에 저장하는 것이 좋습니다.

인스턴스 메타데이터 서비스를 액세스하는 동안 조절이 발생하면 지수 백오프 전략으로 쿼리를 다시 시도하십시오.

인스턴스 메타데이터 서비스 액세스 제한

로컬 방화벽 규칙을 사용하여 인스턴스 메타데이터 서비스에 대한 일부 또는 모든 프로세스의 액세스를 비활성화할 수 있습니다.

참고

Nitro 시스템에 구축된 인스턴스 IMDS는 VPC 안의 네트워크 어플라이언스(예: 가상 라우터)가 패킷을 IMDS 주소로 전달할 때 자체 네트워크에서 연결할 수 있으므로 인스턴스의 기본 원본/대상 확인은 사용 중지됩니다. VPC 외부 소스에서 IMDS에 연결할 수 없도록 하려면 대상 IPv4 주소가 IMDS 169.254.169.254이고 IPv6 엔드포인트를 활성화한 경우 IPv6 주소가 IMDS fd00:ec2::254인 패킷을 삭제하도록 네트워크 어플라이언스의 구성을 수정하는 것이 좋습니다.

iptables를 사용하여 액세스 제한

다음 예제에서는 Linux iptables 및 해당 owner 모듈을 사용하여 Apache 웹 서버(기본 설치 사용자 ID apache 기준)가 169.254.169.254에 액세스할 수 없도록 설정합니다. 이 예제에서는 거부 규칙을 사용하여 해당 사용자로 실행하는 모든 프로세스의 모든 인스턴스 메타데이터 요청(IMDSv1이든 IMDSv2든 상관없이)을 거부합니다.

$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner --uid-owner apache --jump REJECT

또는 허용 규칙을 사용하여 특정 사용자 또는 그룹에 대한 액세스만 허용할 수도 있습니다. 허용 규칙을 사용하면 어떤 소프트웨어가 인스턴스 메타데이터에 액세스해야 하는지를 결정해야 하므로, 허용 규칙은 보안 관점에서 더 관리하기 쉬울 수 있습니다. 허용 규칙을 사용하면 인스턴스의 소프트웨나 구성을 나중에 변경하는 경우 소프트웨어가 메타데이터 서비스(액세스할 의도가 없는 서비스)에 액세스하도록 우발적으로 허용할 가능성이 낮습니다. 방화벽 규칙을 변경할 필요 없이 허용 그룹에서 사용자를 추가하고 제거할 수 있도록, 그룹 사용을 허용 규칙과 결합할 수도 있습니다.

다음 예제에서는 사용자 계정 trustworthy-user에서 실행 중인 프로세스를 제외하고 모든 프로세스가 인스턴스 메타데이터 서비스에 액세스할 수 없도록 설정합니다.

$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner ! --uid-owner trustworthy-user --jump REJECT
참고
  • 로컬 방화벽 규칙을 사용하려면 이전 예제 명령을 필요에 맞게 조정해야 합니다.

  • 기본적으로 iptables 규칙은 시스템 재부팅 후에 지속되지 않습니다. 여기서 설명하지 않는 OS 기능을 사용하여 이 규칙이 지속되도록 할 수 있습니다.

  • iptables owner 모듈은 그룹이 지정된 로컬 사용자의 기본 그룹인 경우에만 그룹 멤버십과 일치합니다. 기타 그룹은 일치되지 않습니다.

PF 또는 IPFW를 사용하여 액세스 제한

FreeBSD 또는 OpenBSD를 사용하는 경우 PF 또는 IPFW를 사용할 수도 있습니다. 다음 예제에서는 인스턴스 메타데이터 서비스에 대한 액세스를 루트 사용자만으로 제한합니다.

PF

$ block out inet proto tcp from any to 169.254.169.254
$ pass out inet proto tcp from any to 169.254.169.254 user root

IPFW

$ allow tcp from any to 169.254.169.254 uid root
$ deny tcp from any to 169.254.169.254
참고

PF 및 IPFW 명령의 순서가 중요합니다. PF는 기본적으로 마지막 일치하는 규칙으로 설정되고 IPFW는 기본적으로 첫 번째 일치하는 규칙으로 설정됩니다.