EC2 Linux 인스턴스의 인스턴스 메타데이터 문제를 해결하려면 어떻게 해야 합니까?
Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에서 인스턴스 메타데이터를 검색할 수 없습니다.
간략한 설명
Amazon EC2는 169.254.169.254 IPv4 엔드포인트 또는 [fd00:ec2::254] IPv6 엔드포인트에 대한 HTTP 요청을 통해 인스턴스 내의 인스턴스 메타데이터에 로컬로 액세스합니다. 인스턴스 메타데이터에 액세스하려면 인스턴스 메타데이터 서비스(IMDS)를 사용해야 합니다. IMDSv1에는 인증 토큰이 필요하지 않지만, IMDSv2에는 보안 강화를 위해 세션 토큰이 필요합니다.
인스턴스 메타데이터를 검색할 때 다음과 같은 문제가 발생할 수 있습니다.
- 시간 초과 및 HTTP 400 또는 404 오류와 같은 HTTP 요청 오류
- IMDSv2 토큰 요청 실패
- 소프트웨어 관련 처리 문제
- 잘못 구성된 네트워크 인터페이스 또는 라우팅 테이블
- 메타데이터 액세스를 차단하는 프록시 또는 NAT 게이트웨이 구성
- (IPv6만 해당) 활성화되지 않은 IMDSv6 엔드포인트
- 누락되거나 오래된 AWS Identity and Access Management(IAM) 인스턴스 프로파일 연결
- 169.254.169.254에 대한 액세스를 차단하는 로컬 방화벽(예: iptables 또는 firewalld)
- 제한된 메타데이터 요청을 유발하는 높은 요청 볼륨
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
HTTP 요청 오류 해결
수신한 HTTP 오류 코드를 기반으로 다음과 같은 문제 해결 작업을 수행하십시오.
(IMDSv1만 해당) ‘404 - Not Found’ 오류
HTTP 404 오류는 유효하지 않은 URL을 입력하거나, 인스턴스의 IAM 역할을 업데이트했지만 역할을 새로 고치지 않은 경우 발생합니다.
이 오류를 해결하려면 올바른 URL을 사용하고 있는지 확인하십시오. 또한 인스턴스의 IAM 역할을 분리했다가 다시 연결합니다.
그런 다음, 인스턴스를 시작하고 중지하여 변경 사항을 적용합니다.
(IMDSv2만 해당) ‘400 - Bad Request’ 오류
HTTP 400 오류는 PUT 요청이 유효하지 않은 토큰을 사용하거나 소프트웨어가 잘못된 헤더를 전송할 때 발생합니다. 예를 들어, 일부 FortiGate 또는 Matillion 에이전트는 IMDSv2 토큰을 캐시하거나 재사용하지 않습니다.
이 오류를 해결하려면 다음 명령을 실행하여 PUT 요청에 대한 새 토큰을 생성하십시오.
$ TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl
또한 시스템이나 애플리케이션 로그에서 토큰을 새로 고쳐야 하는 장기 실행 프로세스가 있는지 확인하십시오.
(IMDSv2만 해당) ‘401 - Unauthorized’ 오류
HTTP 401 오류는 GET 요청이 유효하지 않은 토큰을 사용할 때 발생합니다.
이 오류를 해결하려면 다음 명령을 실행하여 GET 요청에 대한 새 토큰을 생성하십시오.
$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
또한 시스템이나 애플리케이션 로그에서 토큰을 새로 고쳐야 하는 장기 실행 프로세스가 있는지 확인하십시오.
‘403 - Forbidden’ 오류
HTTP 403 오류는 인스턴스 수준에서 IMDS를 비활성화하거나 보안 그룹, 방화벽 또는 라우팅 테이블이 인스턴스 액세스를 차단할 때 발생합니다. IMDSv2를 사용해야 하지만 클라이언트가 IMDSv1을 사용하는 경우에도 이 오류가 발생할 수 있습니다.
이 문제를 해결하려면 다음 describe-instances AWS CLI 명령을 실행하여 IMDS 구성을 확인하십시오.
aws ec2 describe-instances --instance-ids your_instance_id --query 'Reservations[].Instances[].MetadataOptions'
참고: your_instance_id를 인스턴스 ID로 바꾸십시오.
HttpEndpoint가 비활성화됨으로 설정된 경우 다음 modify-instance-metadata-options 명령을 실행하여 IMDS를 활성화하십시오.
aws ec2 modify-instance-metadata-options --instance-id your_instance_id --http-endpoint enabled
참고: your_instance_id를 인스턴스 ID로 바꾸십시오.
구성이 인스턴스에서 169.254.169.254(IPv4의 경우) 또는 [fd00:ec2::254](IPv6의 경우)로의 아웃바운드 HTTP 액세스를 허용하는지 확인하십시오.
인스턴스가 프록시, NAT 구성, 로드 밸런서 또는 여러 내부 네트워크 홉을 사용하는 경우 HttpPutResponseHopLimit을 2 이상으로 구성하는 것이 가장 좋습니다. 토큰 응답이 네트워크 계층을 통과할 수 있을 만큼 충분히 높은 홉 값을 구성합니다. 기본적으로 HttpPutResponseHopLimit은 1개의 홉만 허용합니다. 이 값을 늘리려면 다음 modify-instance-metadata-options 명령을 실행하십시오.
aws ec2 modify-instance-metadata-options --instance-id your_instance_id --http-put-response-hop-limit 2
참고: your_instance_id를 인스턴스 ID로 바꾸십시오.
프록시 구성 문제 확인
인스턴스가 프록시를 사용하여 인터넷에 액세스하는 경우 프록시 트래픽에서 IMDS IP 주소를 제외해야 합니다. 그렇지 않으면 HTTP 403 및 404 오류 또는 연결 시간 초과가 발생할 수 있습니다.
프록시에서 IMDS IP 주소를 제외하려면 다음 명령을 실행하여 no_proxy 환경 변수를 설정하십시오.
export no_proxy='169.254.169.254,[fd00:ec2::254]'
참고: Matillion, Fortigate 또는 사용자 지정 서비스와 같은 일부 애플리케이션은 시스템 수준의 no_proxy 설정을 사용하지 않을 수 있습니다. 이 시나리오에서는 애플리케이션에 no_proxy를 구성하십시오. 이중 스택 구성의 경우 IPv4 및 IPv6 메타데이터 엔드포인트를 모두 제외해야 합니다.
IPv6 지원을 활성화했는지 확인
IPv6 전용 서브넷을 사용하는 경우 다음 modify-instance-metadata-options 명령을 실행하여 IMDS에 대한 IPv6 지원을 명시적으로 활성화하십시오.
aws ec2 modify-instance-metadata-options \ --instance-id your_instance_id \ --http-protocol-ipv6 enabled
참고: your_instance_id를 인스턴스 ID로 바꾸십시오.
엄격한 보안 그룹 규칙이 적용되는 가상 프라이빗 클라우드(VPC) 엔드포인트를 사용하는 경우, 메타데이터 IP 주소에 대한 포트 80(HTTP) 액세스를 허용하는지 확인하십시오.
Fortigate 또는 Matillion 애플리케이션의 경우 소프트웨어가 IMDSv2 세션 토큰을 지원하는지 확인하십시오.
오래된 네트워크 구성, 기한 경과 IAM 역할 연결 또는 내부 소프트웨어 문제 해결
로컬 방화벽 규칙 확인
로컬 방화벽 블록이 iptables를 사용하여 IMDS 엔드포인트에 대한 액세스를 차단하는지 확인하려면 다음 명령을 실행합니다.
sudo iptables -L
차단된 엔드포인트의 출력 예시:
Chain OUTPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- anywhere 169.254.169.254 owner UID match 1000-10000 reject-with icmp-port-unreachable
169.254.169.254로의 트래픽을 차단하는 규칙이 있는지 확인하려면 다음 명령을 실행합니다.
curl http://169.254.169.254/latest/meta-data/
규칙이 트래픽을 차단하는 경우 다음 예시와 유사한 출력이 표시됩니다.
curl: (7) Failed to connect to 169.254.169.254 port 80 after 0 ms: Connection refused
차단 규칙을 제거하려면 다음 명령을 실행합니다.
sudo iptables -D OUTPUT -p tcp -d 169.254.169.254 -m owner --uid-owner 1000-10000 -j REJECT
인스턴스가 이중 스택인 경우 [fd00:ec2::254] IPv4 주소를 차단하는 IPv6 방화벽 규칙이 없는지 확인하십시오. iptables가 비어 있지만 트래픽이 여전히 차단되는 경우 firewalld 또는 ufw와 같은 운영 체제(OS) 방화벽 대몬을 확인하십시오. 또한 숨겨진 규칙을 적용할 수 있는 바이러스 백신 또는 방화벽 소프트웨어와 같은 보안 에이전트를 확인하십시오.
Amazon EC2가 요청을 제한했는지 확인
Amazon EC2는 초당 패킷 수(PPS)를 기준으로 IMDS에 대한 트래픽을 제한합니다. 인스턴스에 연결된 각 탄력적 네트워크 인터페이스는 메타데이터 관련 트래픽에 대한 최대 할당량이 1,024PPS입니다. PPS 속도가 이 할당량을 초과하면 ‘HTTP 5xx’ 오류가 발생하거나, 메타데이터 검색이 실패하거나, 애플리케이션이 시간 초과됩니다.
스로틀링 문제를 완화하려면 다음 작업을 수행하십시오.
- IMDS에 액세스할 때 애플리케이션에 지수 백오프 및 재시도 로직을 구현하십시오.
- 공급업체에 문의하거나 소프트웨어를 최신 버전으로 업데이트하여 IMDSv2를 지원하는지 확인하십시오.
- IMDSv2를 사용하는 경우 토큰을 한 번 생성하여 TTL(Time-to-Live) 동안 여러 메타데이터 쿼리에 재사용하십시오.
- 해당 구성이 토큰 재사용 및 지수 백오프를 올바르게 구현하도록 최신 IMDSv2 버전으로 업그레이드하십시오.
- 인스턴스 메타데이터를 자주 폴링하지 마십시오.
- 가능하면 애플리케이션에서 인스턴스 캐싱을 사용하십시오.
소프트웨어가 지연 없이 긴밀한 루프로 메타데이터 요청을 플러딩하는 경우 스로틀링 또는 메타데이터 오류가 발생할 수 있습니다. tcpdump, strace 또는 앱 디버그 로그를 사용하여 169.254.169.254에 대한 빈번한 반복 호출이 있는지 확인하십시오. 스로틀링 이벤트를 모니터링하려면 다음 명령을 실행하여 네트워크 인터페이스 드라이버에서 linklocal_allowance_exceeded 지표를 확인하십시오.
ethtool -S eth0
참고: eth0을 네트워크 인터페이스 이름으로 바꾸십시오. 출력에서 linklocal_allowance_exceeded가 0이 아닌 값인지 확인하여 스로틀링을 식별하십시오.
출력 예시:
linklocal_allowance_exceeded: 245
위 출력 예시는 PPS 할당량 초과로 인해 Amazon EC2가 IMDS로 전송되는 245개 패킷을 제한했음을 보여줍니다.
관련 정보
관련 콘텐츠
- 질문됨 일 년 전
