인스턴스 메타데이터 검색
실행 중인 인스턴스에서 인스턴스 메타데이터를 사용할 수 있기 때문에 Amazon EC2 콘솔 또는 AWS CLI를 사용할 필요가 없습니다. 이는 인스턴스에서 실행할 스크립트를 작성할 때 유용합니다. 예를 들어, 사용자는 인스턴스 메타데이터에서 인스턴스의 로컬 IP 주소에 액세스하여 외부 애플리케이션과의 연결을 관리할 수 있습니다.
인스턴스 메타데이터는 몇 가지 범주로 분류될 수 있습니다. 각 인스턴스 메타데이터 범주에 대한 설명은 인스턴스 메타데이터 카테고리 섹션을 참조하세요.
실행 중인 모든 인스턴스 메타데이터 범주를 살펴보려면 다음 IPv4 또는 IPv6 URI를 사용합니다.
IPv4
http://169.254.169.254/latest/meta-data/
IPv6
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/
Windows 인스턴스에서 인스턴스 메타데이터를 검색하는 명령은 Windows 인스턴스용 Amazon EC2 사용 설명서의 인스턴스 메타데이터 검색 섹션을 참조하세요.
비용
인스턴스 메타데이터 및 사용자 데이터를 가져오기 위해 사용되는 HTTP 요청 비용은 청구되지 않습니다.
고려 사항
인스턴스 메타데이터 검색 문제를 방지하려면 다음을 고려하세요.
-
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 Parameters
– PUT
요청이 유효하지 않습니다.
-
401 - Unauthorized
– GET
요청이 유효하지 않은 토큰을 사용합니다. 권장되는 작업은 새 토큰을 생성하는 것입니다.
-
403 - Forbidden
– 요청이 허용되지 않거나 인스턴스 메타데이터 서비스가 꺼져 있습니다.
다음 예제에서는 Linux 인스턴스에서 사용할 수 있는 명령을 제공합니다. Windows 인스턴스에서 인스턴스 메타데이터를 검색하는 명령은 Windows 인스턴스용 Amazon EC2 사용 설명서의 인스턴스 메타데이터 검색 섹션을 참조하세요.
이 예제를 통해 이용 가능한 인스턴스 메타데이터 버전을 가져올 수 있습니다. 각 버전은 새 인스턴스 메타데이터 카테고리가 릴리스될 때 인스턴스 메타데이터 빌드를 참조합니다. 인스턴스 메타데이터 빌드 버전은 Amazon EC2 API 버전과 상관관계가 없습니다. 이전 버전의 구조 및 정보를 사용하는 스크립트인 경우 이전 버전을 사용할 수 있습니다.
Amazon EC2가 새 인스턴스 메타데이터 빌드를 릴리스할 때마다 코드를 업데이트하지 않으려면 버전 번호가 아니라, 경로에서 latest
를 사용하는 것이 좋습니다. 예를 들어, 다음과 같이 latest
를 사용합니다.
curl http://169.254.169.254/latest/meta-data/ami-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/
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
...
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
...
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을 이용할 수 있는 형식을 보여줍니다.
- 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 키 형식)을 획득합니다.
- 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를 가져옵니다.
- 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
다음 예의 샘플 인스턴스에는 활성화된 인스턴스 메타데이터에 대한 태그와 인스턴스 태그 Name=MyInstance
및 Environment=Dev
가 있습니다.
이 예에서는 인스턴스에 대한 모든 인스턴스 태그 키를 가져옵니다.
- 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/tags/instance
Name
Environment
- IMDSv1
-
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/tags/instance
Name
Environment
다음 예에서는 이전 예에서 얻은 Name
키 값을 가져옵니다. IMDSv2 요청에서는 이전 예제 명령에서 생성한 저장된 토큰이 만료되지 않았다고 가정하고 해당 토큰을 사용합니다.
- IMDSv2
-
[ec2-user ~]$
curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/tags/instance/Name
MyInstance
- IMDSv1
-
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/tags/instance/Name
MyInstance
쿼리 조절
쿼리는 인스턴스당 인스턴스 메타데이터 서비스로 스로틀링되고, 한 인스턴스에서 인스턴스 메타데이터 서비스로의 동시 연결 수에도 제한이 있습니다.
인스턴스 메타데이터 서비스를 사용하여 AWS 보안 자격 증명을 가져올 경우, 모든 트랜잭션 중에 또는 많은 스레드나 프로세스에서 동시에 자격 증명을 쿼리하지 마세요. 이렇게 하면 조절이 발생할 수 있습니다. 자격 증명 만료일이 다가오기 전까지는 자격 증명을 캐시에 저장하는 것이 좋습니다. IAM 역할 및 해당 역할과 연결된 보안 자격 증명에 대한 자세한 내용은 인스턴스 메타데이터에서 보안 자격 증명 검색 섹션을 참조하세요.
인스턴스 메타데이터 서비스를 액세스하는 동안 조절이 발생하면 지수 백오프 전략으로 쿼리를 다시 시도하세요.
로컬 방화벽 규칙을 사용하여 인스턴스 메타데이터 서비스에 대한 일부 또는 모든 프로세스의 액세스를 비활성화할 수 있습니다.
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는 기본적으로 첫 번째 일치하는 규칙으로 설정됩니다.