EC2 메타데이터 서비스 (IMDS)
개요
운영을 하면서 인스턴스 메타데이터가 필요할 때가 있다. 물론 AWS 콘솔상에 인스턴스의 정보는 확인이 가능하지만 모니터링 에이전트나 특정 애플리케이션에서 참조를 하는 경우가 있다. 특정 고객사에서 모니터링 에이전트에서 인스턴스 정보를 전달하지 못하는 현상이 있었다. 다른 데이터는 모두 긁어가지만, 인스턴스 id와 같은 정보를 못 긁어 가는 것 같아 확인해봤다.
IMDS 지원 방식
인스턴스 메타데이터 서비스(IMDS)는 인스턴스의 코드가 인스턴스 메타데이터에 안전하게 액세스 하기 위해 사용하는 온 인스턴스 구성 요소라고 한다. IMDS에는 버전 1, 2로 나뉘는데 IMDSv1의 경우 요청/응답 형식이었다면 IMDSv2는 세션 지향 요청을 사용하여 기존의 v1의 취약성을 개선한 듯 하다.
IMDSv1
기존에 인스턴스 메타데이터 접근 방법은 아래와 같다. 해당 서버에서 아래의 주소에 원하는 정보를 요청할 경우 요청받은 정보를 반환한다.
$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hibernation/
hostname
iam/
identity-credentials/
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/
IMDSv2
IMDSv2 방식은 세션 지향 요청으로 변경되었다고 했다. 토큰 생성을 요청하고 변수에 세션 토큰 헤더를 저장한 뒤에 저장한 토큰을 이용하여 메타데이터를 요청하는 방식인 것이다.
TOKEN 요청
6시간(21600s) 동안 지속되는 세션 토큰을 생성한다. 이 세션 토큰은 6시간 동안 재 사용이 가능하다.
$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 56 100 56 0 0 56000 0 --:--:-- --:--:-- --:--:-- 56000
TOKEN을 이용한 메타데이터 요청
$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
* Trying 169.254.169.254...
* TCP_NODELAY set
* Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)
> GET /latest/meta-data/ HTTP/1.1
> Host: 169.254.169.254
> User-Agent: curl/7.61.1
> Accept: */*
> X-aws-ec2-metadata-token: <<TOKEN>>
>
< HTTP/1.1 200 OK
< X-Aws-Ec2-Metadata-Token-Ttl-Seconds: 21318
< Content-Type: text/plain
< Accept-Ranges: none
< Last-Modified: Sun, 22 Aug 2021 07:52:00 GMT
< Content-Length: 331
< Date: Sun, 22 Aug 2021 08:39:52 GMT
< Server: EC2ws
< Connection: close
<
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hibernation/
hostname
iam/
identity-credentials/
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
* Closing connection 0
ElasticBeanstalk의 IMDS
그렇다면 모니터링 에이전트가 왜 인스턴스 메타데이터 정보를 긁어가지 못할까? 문제가 있는 서버에서 IMDSv1 방식의 메타데이터 요청을 해봤다. 401 Unauthorized 응답 값을 반환한다.
$ curl -I http://169.254.169.254/latest/metadata/
HTTP/1.1 401 Unauthorized
Content-Length: 0
Date: Sun, 22 Aug 2021 08:53:33 GMT
Server: EC2ws
Connection: close
Content-Type: text/plain
문제가 발생하는 인스턴스는 ElasticBeanstalk의 Amazon Linux 2 플랫폼 버전이다. IMDSv1의 방식이 막혀있는 것 같아 문서를 찾아보다 공식문서에 명시되어 있는 것을 확인했다.
문서 내용을 요약하자면, Elastic Beanstalk 플랫폼 Amazon Linux 2 플랫폼 버전에서는 IMDSv1 및 IMDSv2 모두 지원하나 기본적으로 IMDSv1을 비활성화되도록 설정되어 있다.
EB 환경에서 인스턴스 구성 탭에서 아래와 같이 Disabled를 체크(false) 해 주면 IMDSv1도 사용이 가능하다.
위와 같이 구성을 변경한 뒤 문제 있던 부분은 해결이 되었다. 하지만 매번 저렇게 수동으로 체크할 수는 없는 법이고 .Ebextensions에서 option 값을 주어 해결할 수 있으나 한계가 있어 이 부분은 모니터링 Agent의 업그레이드가 필요하다고 생각한다. SaaS 모니터링을 사용하고 있기에 해당 문제점을 문의하러 가봐야겠다.