EC2 인스턴스에 대한 인스턴스 메타데이터에 액세스 - Amazon Elastic Compute Cloud

EC2 인스턴스에 대한 인스턴스 메타데이터에 액세스

인스턴스 자체 내에서 또는 EC2 콘솔, API, SDK 또는 AWS CLI에서 EC2 인스턴스 메타데이터에 액세스할 수 있습니다. 콘솔 또는 명령줄에서 인스턴스의 현재 인스턴스 메타데이터 설정을 가져오려면 기존 인스턴스에 대한 인스턴스 메타데이터 옵션 쿼리 섹션을 참조하세요.

EBS 루트 볼륨이 있는 인스턴스의 사용자 데이터를 수정할 수도 있습니다. 인스턴스가 중지 상태여야 합니다. 콘솔 지침은 인스턴스 사용자 데이터 업데이트 섹션을 참조하세요. AWS CLI를 사용하는 Linux의 예는 modify-instance-attribute를 참조하세요. Windows PowerShell용 도구를 사용하는 Windows의 예는 사용자 데이터 및 Tools for Windows PowerShell 섹션을 참조하세요.

참고

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

인스턴스 메타데이터 액세스 고려 사항

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

명령 형식

명령 형식은 인스턴스 메타데이터 서비스 버전 1(IMDSv1)을 사용하는지, 인스턴스 메타데이터 서비스 버전 2(IMDSv2)를 사용하는지에 따라 다릅니다. 기본적으로 인스턴스 메타데이터 서비스의 두 버전을 모두 사용할 수 있습니다. IMDSv2를 사용해야 하도록 설정하려면 인스턴스 메타데이터 서비스를 사용하여 인스턴스 메타데이터에 액세스 섹션을 참조하세요.

(IMDSv2) IMDSv2가 필수인 경우 IMDSv1이 작동하지 않습니다.

IMDSv2가 필수인지 확인하려면 세부 정보를 확인할 인스턴스를 선택합니다. IMDSv2의 값은 필수(IMDSv2를 사용해야 함) 또는 선택 사항(IMDSv2 또는 IMDSv1을 사용할 수 있음)입니다.

(IMDSv2) /latest/api/token을 사용하여 토큰 검색

버전별 경로(예: /2021-03-23/api/token)에 대해 PUT 요청을 실행하면 메타데이터 서비스에서 403 Forbidden 오류가 반환됩니다. 이는 의도된 동작입니다.

IPv6 지원

IPv6 주소를 사용하여 인스턴스 메타데이터를 검색하려면 IPv4 주소 대신 [fd00:ec2::254]를 활성화하고 사용해야 합니다. 인스턴스는 IPv6을 지원하는 서브넷에서 시작된 Nitro 기반 인스턴스여야 합니다.

(Windows) Windows Sysprep을 사용하여 사용자 지정 AMI 생성

사용자 지정 Windows AMI에서 인스턴스를 시작할 때 IMDS가 작동하도록 하려면 AMI가 Windows Sysprep으로 만든 표준화된 이미지여야 합니다. 그렇지 않으면 IMDS가 작동하지 않습니다. 자세한 정보는 Windows Sysprep을 사용하여 Amazon EC2 AMI 생성 섹션을 참조하세요.

컨테이너 환경에서는 홉 제한을 2로 설정하세요.

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

메타데이터 버전

Amazon EC2가 새 인스턴스 메타데이터 빌드를 릴리스할 때마다 코드를 업데이트하지 않으려면 버전 번호가 아니라, 경로에서 latest를 사용하는 것이 좋습니다.

초당 패킷 수(PPS) 제한

링크-로컬 주소를 사용하는 서비스에는 초당 1024 패킷(PPS) 제한이 있습니다. 이 제한에는 Route 53 Resolver DNS 쿼리, 인스턴스 메타데이터 서비스(IMDS) 요청, Amazon Time Service 네트워크 타임 프로토콜(NTP) 요청, Windows 라이선스 서비스(Microsoft Windows 기반 인스턴스용) 요청의 집계가 포함됩니다.

사용자 데이터 액세스에 대한추가 고려 사항
  • 사용자 데이터는 불투명 데이터로 취급됩니다. 검색 시 지정한 항목만 가져옵니다. 사용자 데이터 해석과 그에 따른 조치 수행은 인스턴스에 따라 다릅니다.

  • 사용자 데이터는 base64로 인코딩해야 합니다. 사용 중인 도구 또는 SDK에 따라 base64 인코딩이 자동으로 수행될 수 있습니다. 예:

    • Amazon EC2 콘솔은 base64 인코딩을 수행하거나 base64로 인코딩된 입력을 수락할 수 있습니다.

    • AWS CLI 버전 2는 기본적으로 바이너리 파라미터의 base64 인코딩을 자동으로 수행합니다. AWS CLI 버전 1은 --user-data 파라미터의 base64 인코딩을 자동으로 수행합니다.

    • AWS SDK for Python (Boto3)는 UserData 파라미터의 base64 인코딩을 자동으로 수행합니다.

  • 사용자 데이터는 base64로 인코딩되기 전에 원시 16KB 형식으로 제한됩니다. base64 인코딩 이후 n 길이의 문자열 크기는 ceil(n/3)*4입니다.

  • 사용자 데이터는 가져올 때 base64로 디코딩해야 합니다. 인스턴스 메타데이터 또는 콘솔을 사용하여 데이터를 가져오는 경우 데이터는 자동으로 디코딩됩니다.

  • 인스턴스를 중지하고 사용자 데이터를 수정한 다음 인스턴스를 시작할 경우 인스턴스를 시작할 때 업데이트된 사용자 데이터가 자동으로 실행되지 않습니다. Windows 인스턴스에서는 인스턴스를 시작할 때 한 번만 또는 인스턴스를 재부팅하거나 시작할 때마다 업데이트된 사용자 데이터 스크립트가 실행되도록 설정을 구성할 수 있습니다.

  • 사용자 데이터는 인스턴스 속성입니다. 인스턴스에서 AMI를 생성하는 경우 인스턴스 사용자 데이터는 AMI에 포함되지 않습니다.

EC2 인스턴스 내에서 인스턴스 메타데이터에 액세스

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

다음은 모두 인스턴스 메타데이터로 간주되지만 액세스 방법은 다릅니다. 액세스하려는 인스턴스 메타데이터의 유형을 나타내는 탭을 선택하면 자세한 정보를 볼 수 있습니다.

Metadata

인스턴스 메타데이터 속성은 몇 가지 범주로 분류됩니다. 각 인스턴스 메타데이터 범주에 대한 설명은 인스턴스 메타데이터 카테고리 섹션을 참조하세요.

실행 중인 인스턴스 내에서 인스턴스 메타데이터 속성에 액세스하려면 다음 IPv4 또는 IPv6 URI에서 데이터를 가져옵니다. 이러한 IP 주소는 링크-로컬 주소이며 인스턴스에서만 유효합니다. 자세한 내용은 링크-로컬 주소 단원을 참조하십시오.

IPv4

http://169.254.169.254/latest/meta-data/

IPv6

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

실행 중인 인스턴스 내에서 동적 데이터를 검색하려면 다음 URI 중 하나를 사용합니다.

IPv4

http://169.254.169.254/latest/dynamic/

IPv6

http://[fd00:ec2::254]/latest/dynamic/
예: cURL로 액세스

다음 예제에서는 cURL을 사용하여 개요 수준의 인스턴스 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" http://169.254.169.254/latest/dynamic/instance-identity/ rsa2048 pkcs7 document signature dsa2048

IMDSv1

[ec2-user ~]$ curl http://169.254.169.254/latest/dynamic/instance-identity/ rsa2048 pkcs7 document signature dsa2048
예: PowerShell로 액세스

다음 예제는 PowerShell을 사용하여 개요 수준의 인스턴스 ID 범주를 검색합니다.

IMDSv2

PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/dynamic/instance-identity/ document rsa2048 pkcs7 signature

IMDSv1

PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/dynamic/instance-identity/ document rsa2048 pkcs7 signature

동적 데이터 및 가져오기 방법의 예제에 대한 자세한 내용은 Amazon EC2 인스턴스의 인스턴스 자격 증명 문서 섹션을 참조하세요.

User data

인스턴스에서 사용자 데이터를 검색하려면 다음 URI 중 하나를 사용합니다. IPv6 주소를 사용하여 사용자 데이터를 검색하려면 해당 주소를 사용하도록 설정해야 하며 인스턴스는 IPv6를 지원하는 서브넷에 있는 Nitro 기반 인스턴스여야 합니다.

IPv4

http://169.254.169.254/latest/user-data

IPv6

http://[fd00:ec2::254]/latest/user-data

사용자 데이터를 요청하면 데이터 자체(콘텐츠 유형 application/octet-stream)가 반환됩니다. 인스턴스에 사용자 데이터가 없는 경우 요청에서 404 - Not Found를 반환합니다.

예: cURL로 액세스하여 쉼표로 구분된 텍스트 검색

다음 예제는 cURL을 사용하여 쉼표로 구분된 텍스트로 지정된 사용자 데이터를 검색합니다.

IMDSv2

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" http://169.254.169.254/latest/user-data 1234,john,reboot,true | 4512,richard, | 173,,,

IMDSv1

curl http://169.254.169.254/latest/user-data 1234,john,reboot,true | 4512,richard, | 173,,,
예: PowerShell로 액세스하여 쉼표로 구분된 텍스트 검색

다음 예제는 PowerShell을 사용하여 쉼표로 구분된 텍스트로 지정된 사용자 데이터를 검색합니다.

IMDSv2

[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data 1234,john,reboot,true | 4512,richard, | 173,,,

IMDSv1

Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} ` -Method PUT -Uri http://169.254.169.254/latest/api/token} -Method GET -uri http://169.254.169.254/latest/user-data 1234,john,reboot,true | 4512,richard, | 173,,,
예: cURL로 액세스하여 스크립트 검색

다음 예제는 cURL을 사용하여 스크립트로 지정된 사용자 데이터를 검색합니다.

IMDSv2

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" http://169.254.169.254/latest/user-data #!/bin/bash yum update -y service httpd start chkconfig httpd on

IMDSv1

curl http://169.254.169.254/latest/user-data #!/bin/bash yum update -y service httpd start chkconfig httpd on
예: PowerShell로 액세스하여 스크립트 검색

다음 예제는 PowerShell을 사용하여 스크립트로 지정된 사용자 데이터를 검색합니다.

IMDSv2

[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data <powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

IMDSv1

Invoke-RestMethod -uri http://169.254.169.254/latest/user-data <powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

기존 인스턴스에 대한 인스턴스 메타데이터 옵션 쿼리

다음 방법 중 하나를 사용하여 기존 인스턴스의 인스턴스 메타데이터 옵션을 쿼리할 수 있습니다.

Console
콘솔을 사용하여 기존 인스턴스의 인스턴스 메타데이터 옵션 쿼리
  1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 인스턴스를 선택합니다.

  3. 인스턴스를 선택합니다.

  4. 작업, 인스턴스 설정, 인스턴스 메타데이터 옵션 수정을 차례로 선택합니다.

  5. 인스턴스 메타데이터 옵션 수정 대화 상자에서 현재 인스턴스 메타데이터 옵션을 검토하십시오.

AWS CLI
AWS CLI을(를) 사용하여 기존 인스턴스의 인스턴스 메타데이터 옵션을 쿼리하는 방법

아래와 같이 describe-instances CLI 명령을 사용합니다.

aws ec2 describe-instances \ --instance-id i-1234567898abcdef0 \ --query 'Reservations[].Instances[].MetadataOptions'
PowerShell
Tools for PowerShell를 사용하여 기존 인스턴스의 인스턴스 메타데이터 옵션을 쿼리하는 방법

Get-EC2Instance Cmdlet을 사용하세요.

(Get-EC2Instance ` -InstanceId i-1234567898abcdef0).Instances.MetadataOptions

응답 및 오류 메시지

모든 인스턴스 메타데이터는 텍스트(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 – 요청이 허용되지 않거나 IMDS가 비활성화되어 있습니다.

  • 503 - 요청을 완료할 수 없습니다. 요청을 다시 시도하세요.

쿼리 조절

쿼리는 인스턴스당 IMDS로 제한되고, 한 인스턴스에서 IMDS로의 동시 연결 수에도 제한이 있습니다.

IMDS를 사용하여 AWS 보안 인증 정보를 가져올 경우 모든 트랜잭션 중에 또는 많은 스레드나 프로세스에서 동시에 자격 증명을 쿼리하지 마세요. 이렇게 하면 제한이 발생할 수 있습니다. 자격 증명 만료일이 다가오기 전까지는 자격 증명을 캐시에 저장하는 것이 좋습니다. IAM 역할 및 해당 역할과 연결된 보안 자격 증명에 대한 자세한 내용은 인스턴스 메타데이터에서 보안 자격 증명 검색 섹션을 참조하세요.

IMDS에 액세스하는 동안 제한이 발생하면 지수 백오프 전략으로 쿼리를 다시 시도하세요.