

# 인스턴스 메타데이터를 사용하여 EC2 인스턴스를 관리합니다.
<a name="ec2-instance-metadata"></a>

*인스턴스 메타데이터*는 실행 중인 인스턴스를 구성 또는 관리하는 데 사용될 수 있는 인스턴스 관련 데이터입니다. 인스턴스 메타데이터에는 다음이 포함됩니다.

**인스턴스 메타데이터 속성**  
인스턴스 메타데이터 속성은 호스트 이름, 이벤트, 보안 그룹 등의 [범주](#instancedata-data-categories)로 분류됩니다.

**동적 데이터**  
동적 데이터는 인스턴스가 시작될 때 생성되는 메타데이터(예: 인스턴스 ID 문서)입니다. 자세한 내용은 [동적 데이터 카테고리](#dynamic-data-categories) 섹션을 참조하세요.

**사용자 데이터**  
인스턴스 메타데이터를 사용하여 인스턴스를 시작할 때 지정한 **사용자 데이터에도 액세스할 수 있습니다. 예를 들어, 인스턴스를 구성하기 위한 파라미터를 지정하거나 단순 스크립트를 포함시킬 수 있습니다. 일반 AMI를 빌드하고 사용자 데이터를 사용하여 시작 시간에 제공되는 구성 파일을 수정할 수도 있습니다. 예를 들어 다양한 소규모 비즈니스를 위해 웹 서버를 운영하는 경우 모두 동일한 일반 AMI를 사용하고 시작 시 사용자 데이터에 지정한 Amazon S3 버킷에서 콘텐츠를 검색할 수 있습니다. 언제든지 새 고객을 추가하려면 고객에 대한 버킷을 생성하고, 콘텐츠를 추가한 다음, 사용자 데이터에서 코드에 제공된 고유의 버킷 이름으로 AMI를 시작합니다. 동일한 `RunInstances` 호출을 사용하여 여러 인스턴스를 시작하면 해당 예약의 모든 인스턴스에서 사용자 데이터를 사용할 수 있습니다. 동일한 예약에 속하는 각 인스턴스에는 고유한 `ami-launch-index` 번호가 있으므로 인스턴스의 기능을 제어하는 코드를 작성할 수 있습니다. 예를 들어, 첫 번째 호스트는 클러스터의 원래 노드로 자체 선택될 수 있습니다. 자세한 AMI 시작 예는 [단일 요청으로 시작된 각 인스턴스를 식별합니다.](AMI-launch-index-examples.md) 섹션을 참조하세요.

**중요**  
사용자는 인스턴스 자체 내에서 인스턴스 메타데이터 및 사용자 데이터에만 액세스할 수 있지만, 데이터는 인증 또는 암호화 방법으로 보호되지 않습니다. 인스턴스에 직접 액세스할 수 있는 모든 사람과 인스턴스에서 실행 중인 모든 소프트웨어는 메타데이터를 볼 수 있습니다. 따라서 암호 또는 수명이 긴 암호화 키와 같은 민감한 데이터를 사용자 데이터로 저장해서는 안 됩니다.

**Topics**
+ [인스턴스 메타데이터 카테고리](#instancedata-data-categories)
+ [동적 데이터 카테고리](#dynamic-data-categories)
+ [EC2 인스턴스에 대한 인스턴스 메타데이터에 액세스](instancedata-data-retrieval.md)
+ [인스턴스 메타데이터 서비스 옵션 구성](configuring-instance-metadata-options.md)
+ [사용자 데이터 입력을 사용하여 EC2 인스턴스를 시작할 때 명령 실행](user-data.md)
+ [단일 요청으로 시작된 각 인스턴스를 식별합니다.](AMI-launch-index-examples.md)

## 인스턴스 메타데이터 카테고리
<a name="instancedata-data-categories"></a>

인스턴스 메타데이터 속성은 몇 가지 범주로 분류됩니다. 인스턴스 메타데이터 속성을 검색하려면 요청에서 범주를 지정하여 응답에서 메타데이터를 반환합니다.

새 카테고리가 릴리스되면 새 버전 번호로 새 인스턴스 메타데이터 빌드가 생성됩니다. 다음 표에서 **카테고리가 릴리스된 버전(Version when category was released)** 열은 인스턴스 메타데이터 카테고리가 릴리스될 때 빌드 버전을 지정합니다. Amazon EC2가 새 인스턴스 메타데이터 빌드를 릴리스할 때마다 코드를 업데이트하지 않으려면 메타데이터 요청에서 버전 번호 대신 `latest`를 사용하세요. 자세한 내용은 [인스턴스 메타데이터의 사용 가능한 버전 가져오기](configuring-instance-metadata-service.md#instance-metadata-ex-1) 섹션을 참조하세요.

Amazon EC2에서 새 인스턴스 메타데이터 범주를 릴리스하면 새 범주에 대한 인스턴스 메타데이터를 기존 인스턴스에서 사용하지 못할 수 있습니다. [Nitro 기반 인스턴스](instance-types.md#instance-hypervisor-type)를 사용하면 시작 시 사용할 수 있었던 범주에 대해서만 인스턴스 메타데이터를 검색할 수 있습니다. Xen 하이퍼바이저가 있는 인스턴스의 경우 인스턴스를 [중지한 후 시작](Stop_Start.md)하여 인스턴스에 사용 가능한 범주를 업데이트할 수 있습니다.

다음 표는 인스턴스 메타데이터의 카테고리를 목록으로 표시합니다. 범주 이름 중 일부에는 해당 인스턴스에만 있는 데이터 자리 표시자가 포함되어 있습니다. 예를 들어, *mac*은 네트워크 인터페이스의 MAC 주소를 나타냅니다. 인스턴스 메타데이터를 가져올 때 이 자리 표시자를 실제 값으로 바꿔야 합니다.


| 범주 | 설명 | 카테고리 릴리스 버전 | 
| --- | --- | --- | 
| ami-id  | 인스턴스를 시작하기 위해 사용된 AMI ID. | 1.0 | 
| ami-launch-index  | 동일한 RunInstances 호출을 사용하여 여러 인스턴스를 시작하는 경우 이 값은 각 인스턴스의 시작 순서를 나타냅니다. 첫 번째 인스턴스의 값은 0입니다. Auto Scaling 또는 EC2 Fleet을 사용하여 인스턴스를 시작하는 경우 이 값은 항상 0입니다. | 1.0 | 
| ami-manifest-path  | Amazon S3에 위치한 AMI 매니페스트 파일 경로. Amazon EBS 지원 AMI를 사용하여 인스턴스를 시작한 경우 반환되는 결과는 unknown입니다. | 1.0 | 
| ancestor-ami-ids  | 이 AMI를 생성하기 위해 다시 번들링된 모든 인스턴스의 AMI ID. 이 값은 AMI 매니페스트 파일에 ancestor-amis 키가 있는 경우에만 존재합니다. | 2007-10-10 | 
| autoscaling/target-lifecycle-state |  Auto Scaling 인스턴스가 전환 중인 대상 Auto Scaling 수명 주기 상태를 보여주는 값입니다. 2022년 3월 10일 이후에 인스턴스가 대상 수명 주기 상태 중 하나로 전환될 때 표시됩니다. 가능한 값은 `Detached` \$1 `InService` \$1 `Standby` \$1 `Terminated` \$1 `Warmed:Hibernated` \$1 `Warmed:Running` \$1 `Warmed:Stopped` \$1 `Warmed:Terminated`입니다. *Amazon EC2 Auto Scaling 사용 설명서*의 [인스턴스 메타데이터를 통해 대상 수명 주기 상태 검색](https://docs.aws.amazon.com/autoscaling/ec2/userguide/retrieving-target-lifecycle-state-through-imds.html)을 참조하세요.  | 2021-07-15 | 
| block-device-mapping/ami | 루트/부트 파일 시스템을 포함하는 가상 디바이스. | 2007-12-15 | 
| block-device-mapping/ebsN  | Amazon EBS 볼륨과 연결된 가상 디바이스입니다. Amazon EBS 볼륨은 시작 시 존재하는 경우 또는 인스턴스를 마지막으로 시작한 시점에만 메타데이터에서 사용할 수 있습니다. N은 Amazon EBS 볼륨의 색인을 나타냅니다(ebs1 또는 ebs2 등). | 2007-12-15 | 
| block-device-mapping/ephemeralN  | 모든 비 NVMe 인스턴스 저장소 볼륨의 가상 디바이스입니다. N은 각 볼륨의 인덱스를 나타냅니다. 블록 디바이스 매핑에 있는 인스턴스 저장소 볼륨 수는 인스턴스에 대한 실제 인스턴스 저장소 볼륨 수와 일치하지 않을 수도 있습니다. 인스턴스 유형은 인스턴스에 사용 가능한 인스턴스 저장소 볼륨 수를 결정합니다. 블록 디바이스 매핑에 있는 인스턴스 저장소 볼륨 수가 인스턴스에 사용 가능한 수를 초과한 경우 추가 인스턴스 저장소 볼륨이 무시됩니다. | 2007-12-15 | 
| block-device-mapping/root  | 루트 디바이스 또는 루트(/ 또는 C:) 파일 시스템이 특정 인스턴스와 연결된 경우 가상 디바이스의 파티션과 연결된 가상 디바이스 또는 파티션입니다. | 2007-12-15 | 
| block-device-mapping/swap  | swap와 연결된 가상 디바이스. 항상 존재하는 것은 아님. | 2007-12-15 | 
| events/maintenance/history | 인스턴스에 대해 완료되거나 취소한 유지 관리 이벤트가 있다면, 이벤트에 관한 정보가 있는 JSON 문자열이 포함됩니다. | 2018-08-17 | 
| events/maintenance/scheduled | 인스턴스에 대해 활성화된 유지 관리 이벤트가 있다면, 이벤트에 관한 정보가 있는 JSON 문자열이 포함됩니다. 자세한 내용은 [Amazon EC2 인스턴스에 영향을 미치는 예약된 이벤트 보기](viewing_scheduled_events.md) 섹션을 참조하세요. | 2018-08-17 | 
| events/recommendations/rebalance | 인스턴스에 대해 EC2 인스턴스 리밸런싱 권고 알림이 생성되는 대략적인 시간(UTC)입니다. 다음은 이 범주에 대한 메타데이터의 예입니다 \$1"noticeTime": "2020-11-05T08:22:00Z"\$1. 이 범주는 알림이 생성된 후에만 사용할 수 있습니다. 자세한 내용은 [EC2 인스턴스 리밸런싱 권고](rebalance-recommendations.md) 섹션을 참조하세요. | 2020-10-27 | 
| hostname | EC2 인스턴스가 IP 기반 이름 지정(IPBN)을 사용하는 경우 인스턴스의 프라이빗 IPv4 DNS 호스트 이름입니다. EC2 인스턴스가 리소스 기반 이름 지정(RBN)을 사용하는 경우 RBN입니다. 다중 네트워크 인터페이스가 존재하는 경우 eth0 디바이스를 의미함(디바이스 번호가 0인 디바이스). IPBN 및 RBN에 대한 자세한 내용은 [EC2 인스턴스 호스트 이름 및 도메인](ec2-instance-naming.md) 섹션을 참조하세요. | 1.0 | 
|  iam/info  | 인스턴스 시작 시 IAM 역할이 연결되어 있을 경우, 인스턴스의 LastUpdated date, InstanceProfileArn 및 InstanceProfileId 등 마지막으로 인스턴스 프로파일이 업데이트된 시간 관련 정보를 포함합니다. 그렇지 않을 경우 제공되지 않습니다. | 2012-01-12 | 
|  iam/security-credentials/role-name  | 인스턴스 시작 시 IAM 역할이 연결되어 있을 경우 role-name은 역할 이름이고 role-name에는 이 역할과 연결된 임시 보안 자격 증명이 들어 있습니다(자세한 내용은 [인스턴스 메타데이터에서 보안 자격 증명 검색](instance-metadata-security-credentials.md) 참조). 그렇지 않을 경우 제공되지 않습니다. | 2012-01-12 | 
| identity-credentials/ec2/info | identity-credentials/ec2/security-credentials/ec2-instance의 보안 인증에 대한 정보입니다. | 2018-05-23 | 
| identity-credentials/ec2/security-credentials/ec2-instance | 인스턴스 내 소프트웨어가 EC2 Instance Connect 및 AWS Systems Manager 기본 호스트 관리 구성과 같은 기능을 지원하기 위해 AWS에 자신을 식별할 수 있도록 하는 인스턴스 ID 역할에 대한 보안 인증 정보입니다. 이러한 자격 증명에는 정책이 연결되어 있지 않으므로 AWS 기능에 대한 인스턴스를 식별하는 것 외에는 추가 AWS API 권한이 없습니다. 자세한 내용은 [Amazon EC2 인스턴스의 인스턴스 자격 증명 역할](iam-roles-for-amazon-ec2.md#ec2-instance-identity-roles) 섹션을 참조하세요. | 2018-05-23 | 
| instance-action | 번들링을 준비하기 위해 재부팅되어야 함을 인스턴스에 통지합니다. 유효한 값: none \$1 shutdown \$1 bundle-pending. | 2008-09-01 | 
| instance-id | 이 인스턴스의 ID. | 1.0 | 
| instance-life-cycle | 이 인스턴스의 구매 옵션입니다. 자세한 내용은 [Amazon EC2 결제 및 구매 옵션](instance-purchasing-options.md) 섹션을 참조하세요. | 2019년 10월 1일 | 
| instance-type  | 인스턴스 유형. 자세한 내용은 [Amazon EC2 인스턴스 유형](instance-types.md) 섹션을 참조하세요. | 2007-08-29 | 
| ipv6  | 인스턴스의 IPv6 주소. 여러 네트워크 인터페이스가 있는 경우 이는 eth0 디바이스(디바이스 번호가 0인 디바이스) 네트워크 인터페이스와 할당된 첫 번째 IPv6 주소를 나타냅니다. 네트워크 인터페이스[0]에 IPv6 주소가 없으면 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 2021-01-03 | 
|  kernel-id  | 이 인스턴스와 함께 시작한 커널 ID(해당하는 경우). | 2008-02-01 | 
|  local-hostname  | 다중 네트워크 인터페이스가 존재하는 경우 eth0 디바이스를 의미함(디바이스 번호가 0인 디바이스). EC2 인스턴스가 IP 기반 이름 지정(IPBN)을 사용하는 경우 인스턴스의 프라이빗 IPv4 DNS 호스트 이름입니다. EC2 인스턴스가 리소스 기반 이름 지정(RBN)을 사용하는 경우 RBN입니다. IPBN, RBN 및 EC2 인스턴스 이름 지정에 대한 자세한 내용은 [EC2 인스턴스 호스트 이름 및 도메인](ec2-instance-naming.md) 섹션을 참조하세요. | 2007-01-19 | 
|  local-ipv4  | 인스턴스의 프라이빗 IPv4 주소. 다중 네트워크 인터페이스가 존재하는 경우 eth0 디바이스를 의미함(디바이스 번호가 0인 디바이스). IPv6 전용 인스턴스인 경우 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 1.0 | 
|  mac  | 인스턴스의 미디어 액세스 제어(MAC) 주소. 다중 네트워크 인터페이스가 존재하는 경우 eth0 디바이스를 의미함(디바이스 번호가 0인 디바이스). | 2011-01-01 | 
| metrics/vhostmd | 더 이상 사용할 수 없습니다. | 2011-05-01 | 
|  network/interfaces/macs/mac/device-number  | 해당 인터페이스와 연결된 고유한 디바이스 번호. 이 디바이스 번호는 디바이스 이름과 부합됩니다. 예를 들어 device-number 2는 eth2 디바이스의 번호입니다. 이 범주는 AWS CLI용 Amazon EC2 API 및 EC2 명령에서 사용하는 DeviceIndex 및 device-index 필드에 해당합니다. | 2011-01-01 | 
|  network/interfaces/macs/mac/interface-id  | 네트워크 인터페이스의 ID입니다. | 2011-01-01 | 
|  network/interfaces/macs/mac/ipv4-associations/public-ip  | 각 퍼블릭 IP 주소와 연결되고 해당 인터페이스에 할당된 프라이빗 IPv4 주소. | 2011-01-01 | 
| network/interfaces/macs/mac/ipv6s | 인터페이스에 할당된 IPv6 주소 | 2016-06-30 | 
| network/interfaces/macs/mac/ipv6-prefix | 네트워크 인터페이스에 할당된 IPv6 접두사 |  | 
|  network/interfaces/macs/mac/local-hostname  |  인스턴스의 프라이빗 IPv4 DNS 호스트 이름. 다중 네트워크 인터페이스가 존재하는 경우 eth0 디바이스를 의미함(디바이스 번호가 0인 디바이스). IPv6 전용 인스턴스인 경우 리소스 기반 이름입니다. IPBN 및 RBN에 대한 자세한 내용은 [EC2 인스턴스 호스트 이름 및 도메인](ec2-instance-naming.md) 섹션을 참조하세요.  | 2007-01-19 | 
|  network/interfaces/macs/mac/local-ipv4s  | 프라이빗 IPv4 주소는 인터페이스와 연결됩니다. IPv6 전용 네트워크 인터페이스인 경우 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 2011-01-01 | 
|  network/interfaces/macs/mac/mac  | 인스턴스의 MAC 주소. | 2011-01-01 | 
|  network/interfaces/macs/mac/network-card  | 네트워크 카드의 인덱스입니다. 일부 인스턴스 유형은 여러 네트워크 카드를 지원합니다. | 2020-11-01 | 
| network/interfaces/macs/mac/owner-id  | 네트워크 인터페이스 소유자 ID. 다중 인터페이스 환경에서 인터페이스는 Elastic Load Balancing 등 타사 제품이 연결될 수 있습니다. 인터페이스 상의 트래픽은 항상 인터페이스 소유자에게 청구됩니다. | 2011-01-01 | 
|  network/interfaces/macs/mac/public-hostname  | 인터페이스의 퍼블릭 DNS(IPv4). 이 범주는 enableDnsHostnames 속성이 true로 설정된 경우에만 반환됩니다. 자세한 내용은 Amazon VPC 사용 설명서의 [VPC에 대한 DNS 속성](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)을 참조하세요. 인스턴스에 퍼블릭 IPv6 주소만 있고 퍼블릭 IPv4 주소가 없는 경우 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. |  2011-01-01 | 
|  network/interfaces/macs/mac/public-ipv4s  | 인터페이스와 연결된 퍼블릭 IP 주소 또는 탄력적 IP 주소입니다. 인스턴스에는 다중 IPv4 주소가 있을 수 있습니다. | 2011-01-01 | 
| network/interfaces/macs/mac/security-groups  | 네트워크 인터페이스에 속한 보안 그룹. | 2011-01-01 | 
|  network/interfaces/macs/mac/security-group-ids  | 네트워크 인터페이스에 속한 보안 그룹의 ID. | 2011-01-01 | 
|  network/interfaces/macs/mac/subnet-id  | 인터페이스가 위치하는 서브넷 ID. | 2011-01-01 | 
|  network/interfaces/macs/mac/subnet-ipv4-cidr-block  | 인터페이스가 위치하는 서브넷의 IPv4 CIDR 블록. | 2011-01-01 | 
| network/interfaces/macs/mac/subnet-ipv6-cidr-blocks  | 인터페이스가 위치하는 서브넷의 IPv6 CIDR 블록. | 2016-06-30  | 
|  network/interfaces/macs/mac/vpc-id  | 인터페이스가 위치하는 VPC의 ID. | 2011-01-01 | 
| network/interfaces/macs/mac/vpc-ipv4-cidr-block | VPC의 기본 IPv4 CIDR 블록. | 2011-01-01 | 
| network/interfaces/macs/mac/vpc-ipv4-cidr-blocks | VPC에 대한 IPv4 CIDR 블록. | 2016-06-30  | 
| network/interfaces/macs/mac/vpc-ipv6-cidr-blocks | 인터페이스가 위치하는 VPC의 IPv6 CIDR 블록. | 2016-06-30  | 
|  placement/availability-zone | 인스턴스가 시작된 가용 영역. | 2008-02-01 | 
|  placement/availability-zone-id | 인스턴스가 시작된 정적 가용 영역 ID입니다. 가용 영역 ID는 계정 간에 일관성이 있습니다. 그러나 가용 영역과는 다를 수 있으며, 가용 영역은 계정에 따라 다를 수 있습니다. | 2019년 10월 1일 | 
|  placement/group-name  | 인스턴스가 시작된 배치 그룹의 이름입니다. | 2020-08-24 | 
|  placement/host-id  | 인스턴스가 시작된 호스트의 ID입니다. 전용 호스트에만 해당됩니다. | 2020-08-24 | 
|  placement/partition-number  | 인스턴스가 시작된 파티션의 번호입니다. | 2020-08-24 | 
|  placement/region  | 인스턴스가 시작된 AWS 리전입니다. | 2020-08-24 | 
|  product-codes  | AWS Marketplace인스턴스에 연결된 제품 코드(해당되는 경우). | 2007-03-01 | 
|  public-hostname  | 인스턴스의 퍼블릭 DNS(IPv4). 이 범주는 enableDnsHostnames 속성이 true로 설정된 경우에만 반환됩니다. 자세한 내용은 Amazon VPC 사용 설명서의 [VPC에 대한 DNS 속성](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)을 참조하세요. 인스턴스에 퍼블릭 IPv6 주소만 있고 퍼블릭 IPv4 주소가 없는 경우 이 항목이 설정되지 않고 HTTP 404 응답이 발생합니다. | 2007-01-19 | 
|  public-ipv4  | 퍼블릭 IPv4 주소. 인스턴스와 탄력적 IP 주소가 연결된 경우 반환된 값은 탄력적 IP 주소입니다. | 2007-01-19 | 
|  public-keys/0/openssh-key  | 퍼블릭 키. 시작 시에 인스턴스가 제공된 경우에만 사용할 수 있습니다. | 1.0 | 
|  ramdisk-id  | 시작 시에 지정된 RAM의 ID(해당하는 경우). | 2007-10-10 | 
|  reservation-id  | 예약 ID: | 1.0 | 
|  security-groups  |  인스턴스에 적용된 보안 그룹의 이름. 시작 이후 인스턴스의 보안 그룹을 변경할 수 있습니다. 해당 변경은 여기 및 network/interfaces/macs/**mac**/security-groups에 반영됩니다.  | 1.0 | 
|  services/domain  |  리전의 AWS 리소스에 대한 도메인입니다.  | 2014-02-25 | 
|  services/partition  |  리소스가 있는 파티션. 표준 AWS 리전에서 파티션은 `aws`입니다. 리소스가 다른 파티션에 있는 경우 파티션은 `aws-partitionname`입니다. 예를 들어 중국(베이징) 리전에 있는 리소스의 파티션은 `aws-cn`입니다.  | 2015-10-20 | 
|  spot/instance-action  |  항목이 발생할 때 작업(최대 절전 모드, 중지 또는 종료)과 작업이 이루어지는 대략의 시간(UTC)입니다. 이 항목은 스팟 인스턴스가 최대 절전 모드, 중지, 종료로 표시된 경우에만 존재합니다. 자세한 내용은 [instance-action](spot-instance-termination-notices.md#instance-action-metadata) 섹션을 참조하세요.  | 2016-11-15 | 
|  spot/termination-time  |  스팟 인스턴스의 운영 체제가 종료 신호를 수신하는 UTC 기준 예상 시간. 스팟 인스턴스가 Amazon EC2의 종료 대상으로 표시된 경우에만 이 항목이 존재하고 시간 값(예: 2015-01-05T18:02:00Z)이 포함됩니다. 사용자가 스팟 인스턴스를 직접 종료한 경우 종료 시간 항목에 시간이 설정되지 않습니다. 자세한 내용은 [termination-time](spot-instance-termination-notices.md#termination-time-metadata) 섹션을 참조하세요.  | 2014-11-05 | 
| system | 인스턴스의 기본 가상화 유형(하이퍼바이저). | 2022-09-24 | 
| tags/instance | 인스턴스와 연결된 인스턴스 태그입니다. 인스턴스 메타데이터의 태그에 대한 액세스를 명시적으로 허용하는 경우에만 사용할 수 있습니다. 자세한 내용은 [인스턴스 메타데이터에서 태그에 대한 액세스 활성화](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS) 섹션을 참조하세요. | 2021-03-23 | 

## 동적 데이터 카테고리
<a name="dynamic-data-categories"></a>

다음 표는 동적 데이터의 카테고리를 목록으로 표시합니다.


| 범주 | 설명 | 카테고리 릴리스 버전 | 
| --- | --- | --- | 
| fws/instance-monitoring  | 고객이 CloudWatch에서 1분 세부 모니터링을 설정했는지 보여주는 값. 유효한 값: enabled \$1 disabled | 2009-04-04 | 
| instance-identity/document  | 인스턴스 ID, 프라이빗 IP 주소 등 인스턴스 속성을 포함하는 JSON. [Amazon EC2 인스턴스의 인스턴스 자격 증명 문서](instance-identity-documents.md)을(를) 참조하세요. | 2009-04-04 | 
| instance-identity/pkcs7  | 문서의 신뢰성 및 서명 내용을 검증하는 데 사용됩니다. [Amazon EC2 인스턴스의 인스턴스 자격 증명 문서](instance-identity-documents.md)을(를) 참조하세요. | 2009-04-04 | 
| instance-identity/signature  | 출처 및 신뢰성을 검증하기 위해 다른 사용자가 사용할 수 있는 데이터. [Amazon EC2 인스턴스의 인스턴스 자격 증명 문서](instance-identity-documents.md)을(를) 참조하세요. | 2009-04-04 | 

# EC2 인스턴스에 대한 인스턴스 메타데이터에 액세스
<a name="instancedata-data-retrieval"></a>

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

EBS 루트 볼륨이 있는 인스턴스의 사용자 데이터를 수정할 수도 있습니다. 인스턴스가 중지 상태여야 합니다. 콘솔 지침은 [인스턴스 사용자 데이터 업데이트](user-data.md#user-data-modify) 섹션을 참조하세요. AWS CLI를 사용하는 Linux의 예는 [modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html)를 참조하세요. Windows PowerShell용 도구를 사용하는 Windows의 예는 [사용자 데이터 및 Tools for Windows PowerShell](user-data.md#user-data-powershell) 섹션을 참조하세요.

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

## 인스턴스 메타데이터 액세스 고려 사항
<a name="imds-considerations"></a>

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

**IMDSv2 적용(`HttpTokensEnforced=enabled`)으로 인한 인스턴스 시작 실패**  
IMDSv2 적용을 활성화하기 전에 인스턴스의 모든 소프트웨어가 IMDSv2를 지원해야 합니다. 그 후 기본값을 변경하여 IMDSv1을 비활성화(`httpTokens=required`)한 다음 적용을 활성화할 수 있습니다. 자세한 설명은 [인스턴스 메타데이터 서비스 버전 2 사용으로 전환](instance-metadata-transition-to-version-2.md) 섹션을 참조하세요.

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

**IMDSv2가 필요한 경우 IMDSv1이 작동하지 않습니다.**  
IMDSv1을 사용하고 응답이 없는 경우 IMDSv2가 필요할 수 있습니다. IMDSv2가 필수인지 확인하려면 세부 정보를 확인할 인스턴스를 선택합니다. **IMDSv2** 값은 **필수**(IMDSv2를 사용해야 함)이거나 **선택 사항**(IMDSv2 또는 IMDSv1을 사용할 수 있음)임을 나타냅니다.

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

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

**IPv6 지원**  
IPv6 주소를 사용하여 인스턴스 메타데이터를 검색하려면 IPv4 주소 `169.254.169.254` 대신 IMDS `[fd00:ec2::254]`의 IPv6 주소를 활성화하고 사용해야 합니다. 인스턴스는 [IPv6을 지원하는 서브넷](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)에서 시작된 [Nitro 기반 인스턴스](instance-types.md#instance-hypervisor-type)여야 합니다.

**(Windows) Windows Sysprep을 사용하여 사용자 지정 AMI 생성**  
사용자 지정 Windows AMI에서 인스턴스를 시작할 때 IMDS가 작동하도록 하려면 AMI가 Windows Sysprep으로 만든 표준화된 이미지여야 합니다. 그렇지 않으면 IMDS가 작동하지 않습니다. 자세한 내용은 [Windows Sysprep을 사용하여 Amazon EC2 AMI 생성](ami-create-win-sysprep.md) 섹션을 참조하세요.

**컨테이너 환경에서는 재구성을 고려하거나 홉 제한을 2로 늘리는 것이 좋습니다.**  
AWS SDK는 기본적으로 IMDSv2 호출을 사용합니다. IMDSv2 호출에 응답이 없으면 일부 AWS SDK는 호출을 다시 시도하고 여전히 실패하면 IMDSv1을 사용합니다. 이로 인해 특히 컨테이너 환경에서 지연이 발생할 수 있습니다. IMDSv2가 *필요*한 AWS SDK의 경우 컨테이너 환경에서 홉 제한이 1이면 호출에 응답이 전혀 없을 수 있습니다. 컨테이너로의 이동이 추가 네트워크 홉으로 간주되기 때문입니다.  
컨테이너 환경에서 이러한 문제를 완화하려면 설정(예: AWS 리전)을 컨테이너에 직접 전달하도록 구성을 변경하거나 홉 제한을 2로 늘리는 것이 좋습니다. 홉 제한의 영향에 대한 자세한 내용은 [EC2 인스턴스 메타데이터 서비스의 향상된 기능을 통해 개방형 방화벽, 역방향 프록시 및 SSRF 취약성에 대한 심층적인 방어 기능 추가](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)를 참조하세요. 홉 제한 변경에 대한 자세한 내용은 [PUT 응답 홉 제한 변경](configuring-IMDS-existing-instances.md#modify-PUT-response-hop-limit) 섹션을 참조하세요.

**초당 패킷 수(PPS) 제한**  
[링크-로컬](using-instance-addressing.md#link-local-addresses) 주소를 사용하는 서비스에는 초당 1024 패킷(PPS) 제한이 있습니다. 이 제한에는 [Route 53 Resolver DNS 쿼리](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#vpc-dns-limits), 인스턴스 메타데이터 서비스(IMDS) 요청, [Amazon Time Service 네트워크 타임 프로토콜(NTP)](set-time.md) 요청, [Windows 라이선스 서비스(Microsoft Windows 기반 인스턴스용)](https://aws.amazon.com/windows/resources/licensing/) 요청의 집계가 포함됩니다.

**사용자 데이터 액세스에 대한추가 고려 사항**
+ 사용자 데이터는 불투명 데이터로 취급됩니다. 검색 시 지정한 항목만 가져옵니다. 사용자 데이터 해석과 그에 따른 조치 수행은 인스턴스에 따라 다릅니다.
+ 사용자 데이터는 base64로 인코딩해야 합니다. 사용 중인 도구 또는 SDK에 따라 base64 인코딩이 자동으로 수행될 수 있습니다. 예제:
  + Amazon EC2 콘솔은 base64 인코딩을 수행하거나 base64로 인코딩된 입력을 수락할 수 있습니다.
  + [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam)는 기본적으로 바이너리 파라미터의 base64 인코딩을 자동으로 수행합니다. AWS CLI 버전 1은 `--user-data` 파라미터의 base64 인코딩을 자동으로 수행합니다.
  + AWS SDK for Python (Boto3)는 `UserData` 파라미터의 base64 인코딩을 자동으로 수행합니다.
+ 사용자 데이터는 base64로 인코딩되기 전에 원시 16KB 형식으로 제한됩니다. base64 인코딩 이후 *n* 길이의 문자열 크기는 ceil(*n*/3)\$14입니다.
+ 사용자 데이터는 가져올 때 base64로 디코딩해야 합니다. 인스턴스 메타데이터 또는 콘솔을 사용하여 데이터를 가져오는 경우 데이터는 자동으로 디코딩됩니다.
+ 인스턴스를 중지하고 사용자 데이터를 수정한 다음 인스턴스를 시작할 경우 인스턴스를 시작할 때 업데이트된 사용자 데이터가 자동으로 실행되지 않습니다. Windows 인스턴스에서는 인스턴스를 시작할 때 한 번만 또는 인스턴스를 재부팅하거나 시작할 때마다 업데이트된 사용자 데이터 스크립트가 실행되도록 설정을 구성할 수 있습니다.
+ 사용자 데이터는 인스턴스 속성입니다. 인스턴스에서 AMI를 생성하는 경우 인스턴스 사용자 데이터는 AMI에 포함되지 않습니다.

## EC2 인스턴스 내에서 인스턴스 메타데이터에 액세스
<a name="instancedata-inside-access"></a>

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

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

------
#### [ Metadata ]

인스턴스 메타데이터 속성은 몇 가지 범주로 분류됩니다. 각 인스턴스 메타데이터 범주에 대한 설명은 [인스턴스 메타데이터 카테고리](ec2-instance-metadata.md#instancedata-data-categories) 섹션을 참조하세요.

실행 중인 인스턴스 내에서 인스턴스 메타데이터 속성에 액세스하려면 다음 IPv4 또는 IPv6 URI에서 데이터를 가져옵니다. 이러한 IP 주소는 링크-로컬 주소이며 인스턴스에서만 유효합니다. 자세한 내용은 [링크-로컬 주소](using-instance-addressing.md#link-local-addresses) 섹션을 참조하세요.

**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 인스턴스의 인스턴스 자격 증명 문서](instance-identity-documents.md) 섹션을 참조하세요.

------
#### [ User data ]

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

**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>
```

------

## 기존 인스턴스에 대한 인스턴스 메타데이터 옵션 쿼리
<a name="query-IMDS-existing-instances"></a>

기존 인스턴스에 대한 인스턴스 메타데이터 옵션을 쿼리할 수 있습니다.

------
#### [ Console ]

**기존 인스턴스의 인스턴스 메타데이터 옵션을 쿼리하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

1. 인스턴스를 선택하고 다음 필드를 확인합니다.
   + **IMDSv2** – 값은 **필수** 또는 **선택**입니다.
   + **인스턴스 메타데이터의 태그 허용** - 값은 **활성화됨** 또는 **비활성화됨**입니다.

1. 인스턴스를 선택한 상태로 **작업**, **인스턴스 설정**, **인스턴스 메타데이터 옵션 수정**을 차례로 선택합니다.

   대화 상자에는 선택한 인스턴스에 대해 인스턴스 메타데이터 서비스가 활성화 또는 비활성화되었는지 여부가 표시됩니다.

------
#### [ AWS CLI ]

**기존 인스턴스의 인스턴스 메타데이터 옵션을 쿼리하려면**  
아래와 같이 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 명령을 사용합니다.

```
aws ec2 describe-instances \
    --instance-id i-1234567898abcdef0 \
    --query 'Reservations[].Instances[].MetadataOptions'
```

------
#### [ PowerShell ]

**Tools for PowerShell를 사용하여 기존 인스턴스의 인스턴스 메타데이터 옵션을 쿼리하는 방법**  
[Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet을 사용합니다.

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

------

## 응답 및 오류 메시지
<a name="instance-metadata-returns"></a>

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

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

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

IMDSv1 요청에 응답이 없는 경우 IMDSv2가 필요할 수 있습니다.

IMDSv2를 사용하여 수행한 요청의 경우 다음 HTTP 오류 코드가 반환될 수 있습니다.
+ `400 - Missing or Invalid Parameters` – `PUT` 요청이 유효하지 않습니다.
+ `401 - Unauthorized` – `GET` 요청이 유효하지 않은 토큰을 사용합니다. 권장되는 작업은 새 토큰을 생성하는 것입니다.
+ `403 - Forbidden` – 요청이 허용되지 않거나 IMDS가 비활성화되어 있습니다.
+ `404 - Not Found` - 리소스를 사용할 수 없거나 이러한 리소스가 없습니다.
+ `503` - 요청을 완료할 수 없습니다. 요청을 다시 시도하세요.

IMDS가 오류를 반환하면 **curl**은 출력에 오류 메시지를 인쇄하고 성공 상태 코드를 반환합니다. 오류 메시지는 `TOKEN` 변수에 저장되며 이로 인해 토큰을 사용하는 **curl** 명령이 실패합니다. **-f** 옵션을 사용하여 **curl**을 호출하면 HTTP 서버 오류가 발생할 경우 오류 상태 코드가 반환됩니다. 오류 처리를 활성화하면 쉘이 오류를 포착하여 스크립트를 중지할 수 있습니다.

## 쿼리 조절
<a name="instancedata-throttling"></a>

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

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

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

# 인스턴스 메타데이터 서비스를 사용하여 인스턴스 메타데이터에 액세스
<a name="configuring-instance-metadata-service"></a>

다음 방법 중 하나를 사용하여 실행 중인 인스턴스에서 인스턴스 메타데이터에 액세스할 수 있습니다.
+ 인스턴스 메타데이터 서비스 버전 2(IMDSv2) – 세션 지향 방법

  예시는 [IMDSv2 예제](#instance-metadata-retrieval-examples) 섹션을 참조하세요.
+ 인스턴스 메타데이터 서비스 버전 1(IMDSv1) – 요청/응답 방법

  예시는 [IMDSv1 예제](#instance-metadata-retrieval-examples-imdsv1) 섹션을 참조하세요.

기본적으로 IMDSv1 또는 IMDSv2를 사용하거나 둘 다 사용할 수 있습니다.

각 인스턴스에서 인스턴스 메타데이터 서비스(IMDS)를 구성하여 IMDSv2 호출만 수락하도록 설정할 수 있습니다. 이렇게 하면 IMDSv1 호출은 실패하게 됩니다. 인스턴스에서 IMDSv2를 사용하도록 구성하는 방법에 대한 자세한 내용은 [인스턴스 메타데이터 서비스 옵션 구성](configuring-instance-metadata-options.md) 섹션을 참조하세요.

`PUT` 또는 `GET` 헤더는 IMDSv2에만 있습니다. 요청에 이러한 헤더가 있는 경우 요청은 IMDSv2를 위한 것입니다. 헤더가 없는 경우 요청은 IMDSv1을 위한 것으로 간주됩니다.

IMDSv2에 대한 자세한 내용은 [EC2 인스턴스 메타데이터 서비스의 향상된 기능을 통해 개방형 방화벽, 역방향 프록시, SSRF 취약성에 대한 심층적인 방어 기능 추가](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)를 참조하세요.

**Topics**
+ [인스턴스 메타데이터 서비스 버전 2 작동 방식](#instance-metadata-v2-how-it-works)
+ [지원되는 AWS SDK 사용](#use-a-supported-sdk-version-for-imdsv2)
+ [IMDSv2 예제](#instance-metadata-retrieval-examples)
+ [IMDSv1 예제](#instance-metadata-retrieval-examples-imdsv1)

## 인스턴스 메타데이터 서비스 버전 2 작동 방식
<a name="instance-metadata-v2-how-it-works"></a>

IMDSv2는 세션 지향 요청을 사용합니다. 세션 지향 요청을 사용하여 세션 기간을 정의하는 세션 토큰을 생성합니다. 세션 기간은 최소 1초에서 최대 6시간일 수 있습니다. 지정된 기간 중에는 후속 요청에 동일한 세션 토큰을 사용할 수 있습니다. 지정된 기간이 만료된 후에는 향후 요청에 사용할 새로운 세션 토큰을 생성할 수 있습니다.

**참고**  
이 섹션의 예에서는 인스턴스 메타데이터 서비스(IMDS)의 IPv4 주소(`169.254.169.254`)를 사용합니다. IPv6 주소를 통해 EC2 인스턴스의 인스턴스 메타데이터를 검색하는 경우, 대신 IPv6 주소(`[fd00:ec2::254]`)를 활성화하고 사용해야 합니다. IMDS의 IPv6 주소는 IMDSv2 명령과 호환됩니다. IPv6 주소는 [IPv6 지원 서브넷](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)(듀얼 스택 또는 IPv6 전용)에 있는 [Nitro 기반 인스턴스](instance-types.md#instance-hypervisor-type)에서만 액세스할 수 있습니다.

다음 예에서는 쉘 스크립트와 IMDSv2를 사용하여 최상위 인스턴스 메타데이터 항목을 검색합니다. 각 예시:
+ `PUT` 요청을 사용하여 6시간(21,600초) 동안 지속되는 세션 토큰을 생성합니다.
+ 세션 토큰 헤더를 `TOKEN`(Linux 인스턴스) 또는 `token`(Windows 인스턴스)이라는 변수에 저장합니다.
+ 토큰을 사용하여 최상위 메타데이터 항목을 요청합니다.

### Linux 예
<a name="how-imdsv2-works-example-linux"></a>

별도의 두 명령을 실행하거나 둘을 결합할 수 있습니다.

**별도의 명령**

먼저 다음 명령을 사용하여 토큰을 생성합니다.

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
```

그런 다음 해당 토큰을 사용하여 다음 명령으로 최상위 메타데이터 항목을 생성합니다.

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
```

**결합된 명령**

토큰을 저장하고 명령을 결합할 수 있습니다. 다음 예는 위의 두 명령을 결합하고 TOKEN이라는 변수에 세션 토큰 헤더를 저장합니다.

**참고**  
토큰이 유효하지 않고, 토큰을 만드는 데 오류가 발생하면 오류 메시지가 변수에 저장되고 명령이 작동하지 않습니다.

```
[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/meta-data/
```

토큰을 생성한 후에는 만료될 때까지 토큰을 재사용할 수 있습니다. 다음 예제 명령에서는 인스턴스를 시작할 때 사용된 AMI의 ID를 가져오며, 이전 예제에서 `$TOKEN`에 저장한 토큰을 재사용합니다.

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

### Windows 예
<a name="how-imdsv2-works-example-windows"></a>

```
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/meta-data/
```

토큰을 생성한 후에는 만료될 때까지 토큰을 재사용할 수 있습니다. 다음 예제 명령에서는 인스턴스를 시작할 때 사용된 AMI의 ID를 가져오며, 이전 예제에서 `$token`에 저장한 토큰을 재사용합니다.

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} `
	-Method GET -uri http://169.254.169.254/latest/meta-data/ami-id
```

IMDSv2를 사용하여 인스턴스 메타데이터를 요청하는 경우 요청에는 다음이 포함되어야 합니다.

1. `PUT` 요청을 사용하여 인스턴스 메타데이터 서비스의 세션을 초기화합니다. `PUT` 요청은 후속 `GET` 요청에 포함되어야 하는 토큰을 인스턴스 메타데이터 서비스에 반환합니다. 토큰은 IMDSv2를 사용하여 메타데이터에 액세스하는 데 필요합니다.

1. IMDS에 대한 모든 `GET` 요청에 토큰을 포함합니다. 토큰 사용이 `required`로 설정되면 유효한 토큰이 없거나 만료된 토큰이 있는 요청은 `401 - Unauthorized` HTTP 오류 코드를 수신합니다.
   + 토큰은 인스턴스에 특정한 키입니다. 토큰은 다른 EC2 인스턴스에서 유효하지 않으며 해당 토큰이 생성된 인스턴스 외부에서 사용하려고 시도하면 거부됩니다.
   + `PUT` 요청에는 토큰의 TTL(Time to Live)를 최대 6시간(21,600초)까지 초 단위로 지정하는 헤더가 포함되어야 합니다. 토큰은 논리 세션을 나타냅니다. TTL은 토큰이 유효한 시간 길이를 지정하며 따라서 세션 기간을 지정합니다.
   + 토큰이 만료된 후 인스턴스 메타데이터에 계속 액세스하려면 다른 `PUT`를 사용하여 새 세션을 생성해야 합니다.
   + 토큰을 재사용하거나 모든 요청에 새 토큰을 생성하도록 선택할 수 있습니다. 요청 수가 적은 경우 IMDS에 액세스해야 할 때마다 토큰을 생성하고 즉시 사용하는 것이 더 간편할 수 있습니다. 하지만 효율성을 향상하려면 인스턴스 메타데이터를 요청해야 할 때마다 `PUT` 요청을 작성하는 대신 토큰에 더 긴 기간을 지정하고 토큰을 재사용할 수 있습니다. 동시 토큰 수에는 실질적인 제한이 없으며 각각은 자체 세션을 나타냅니다. 그러나 IMDSv2에는 표준 IMDS 연결 및 조절 제한이 여전히 적용됩니다. 자세한 내용은 [쿼리 조절](instancedata-data-retrieval.md#instancedata-throttling) 섹션을 참조하세요.

IMDSv2 인스턴스 메타데이터 요청에서는 HTTP `GET` 및 `HEAD` 메서드가 허용됩니다. `PUT` 요청은 X-Forwarded-For 헤더가 포함될 경우 거부됩니다.

기본적으로 `PUT` 요청에 대한 응답에는 IP 프로토콜 수준에서 `1`의 응답 홉 제한(TTL(Time to Live))이 있습니다. 더 큰 홉 제한이 필요한 경우 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) AWS CLI 명령을 사용하여 조정할 수 있습니다. 예를 들어 인스턴스에서 실행 중인 컨테이너 서비스가 있는 경우 이전 버전과의 호환성을 위해 더 큰 홉 제한이 필요할 수 있습니다. 자세한 내용은 [기존 인스턴스에 대한 인스턴스 메타데이터 옵션 수정](configuring-IMDS-existing-instances.md) 섹션을 참조하세요.

## 지원되는 AWS SDK 사용
<a name="use-a-supported-sdk-version-for-imdsv2"></a>

IMDSv2를 사용하려면 EC2 인스턴스에서 IMDSv2 사용을 지원하는 AWS SDK 버전을 사용해야 합니다. 모든 AWS SDK의 최신 버전에서는 IMDSv2 사용을 지원합니다.

**중요**  
최신 기능, 보안 업데이트 및 기본 종속성을 지원하려면 SDK 릴리스를 최신 상태로 유지하는 것이 좋습니다. 지원되지 않는 SDK 버전을 계속 사용하는 것은 권장되지 않으며 그에 따른 책임은 사용자에게 있습니다. 자세한 내용은 *AWS SDK 및 도구 참조 가이드*에서 [AWS SDK 및 도구 유지 관리 정책](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html)을 참조하세요.

다음은 IMDSv2 사용을 지원하는 최소 버전입니다.
+ [AWS CLI](https://github.com/aws/aws-cli) - 1.16.289
+ [AWS Tools for Windows PowerShell](https://github.com/aws/aws-tools-for-powershell) – 4.0.1.0
+ [AWS SDK for .NET](https://github.com/aws/aws-sdk-net) – 3.3.634.1
+ [AWS SDK for C\$1\$1](https://github.com/aws/aws-sdk-cpp) – 1.7.229
+ [AWS SDK for Go](https://github.com/aws/aws-sdk-go) – 1.25.38
+ [AWS Go v2용 SDK](https://github.com/aws/aws-sdk-go-v2) – 0.19.0
+ [AWS SDK for Java](https://github.com/aws/aws-sdk-java) – 1.11.678
+ [AWS SDK for Java 2.x](https://github.com/aws/aws-sdk-java-v2) – 2.10.21
+ [AWS Node.js의 JavaScript용 SDK](https://github.com/aws/aws-sdk-js) – 2.722.0
+ [AWS SDK for Kotlin](https://github.com/awslabs/aws-sdk-kotlin)-1.1.4
+ [AWS SDK for PHP](https://github.com/aws/aws-sdk-php) – 3.147.7
+ [AWS SDK for Python(Botocore)](https://github.com/boto/botocore) – 1.13.25
+ [AWS SDK for Python (Boto3)](https://github.com/boto/boto3) – 1.12.6
+ [AWS SDK for Ruby](https://github.com/aws/aws-sdk-ruby) – 3.79.0

## IMDSv2 예제
<a name="instance-metadata-retrieval-examples"></a>

Amazon EC2 인스턴스에서 다음 예제를 실행하여 IMDSv2의 인스턴스 메타데이터를 검색합니다.

Windows 인스턴스에서 Windows PowerShell을 사용하거나 cURL 또는 wget을 설치할 수 있습니다. Windows 인스턴스에 서드 파티 도구를 설치하는 경우 직접 호출과 출력이 여기 설명된 것과 다를 수 있으므로 부속 문서를 주의 깊게 정독해야 합니다.

**Topics**
+ [인스턴스 메타데이터의 사용 가능한 버전 가져오기](#instance-metadata-ex-1)
+ [최고 수준 메타데이터 항목 가져오기](#instance-metadata-ex-2)
+ [메타데이터 항목의 값 가져오기](#instance-metadata-ex-2a)
+ [사용 가능한 퍼블릭 키 목록 가져오기](#instance-metadata-ex-3)
+ [퍼블릭 키 0을 이용할 수 있는 형식 표시](#instance-metadata-ex-4)
+ [퍼블릭 키 0(OpenSSH 키 형식) 가져오기](#instance-metadata-ex-5)
+ [인스턴스에 대한 서브넷 ID 가져오기](#instance-metadata-ex-6)
+ [인스턴스에 대한 인스턴스 태그 가져오기](#instance-metadata-ex-7)

### 인스턴스 메타데이터의 사용 가능한 버전 가져오기
<a name="instance-metadata-ex-1"></a>

이 예를 통해 이용 가능한 인스턴스 메타데이터 버전을 가져올 수 있습니다. 각 버전은 새 인스턴스 메타데이터 카테고리가 릴리스될 때 인스턴스 메타데이터 빌드를 참조합니다. 인스턴스 메타데이터 빌드 버전은 Amazon EC2 API 버전과 상관관계가 없습니다. 이전 버전의 구조 및 정보를 사용하는 스크립트인 경우 이전 버전을 사용할 수 있습니다.

------
#### [ cURL ]

```
[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/
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
```

------
#### [ PowerShell ]

```
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/
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
```

------

### 최고 수준 메타데이터 항목 가져오기
<a name="instance-metadata-ex-2"></a>

이 예제는 최고 수준 메타데이터 항목을 가져옵니다. 응답의 항목에 대한 자세한 내용은 [인스턴스 메타데이터 카테고리](ec2-instance-metadata.md#instancedata-data-categories) 섹션을 참조하세요.

액세스를 허용한 경우에만 이 출력에 태그가 포함됩니다. 자세한 내용은 [인스턴스 메타데이터에서 태그에 대한 액세스 활성화](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS) 섹션을 참조하세요.

------
#### [ cURL ]

```
[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/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/
tags/
```

------
#### [ PowerShell ]

```
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/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
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/
tags/
```

------

### 메타데이터 항목의 값 가져오기
<a name="instance-metadata-ex-2a"></a>

이 예에서는 앞의 예에서 얻은 최상위 메타데이터 항목 중 일부의 값을 가져옵니다. 이 요청은 이전 예제의 명령을 사용하여 생성한 저장된 토큰을 사용합니다. 토큰이 만료되지 않아야 합니다.

------
#### [ cURL ]

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

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

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

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

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------

### 사용 가능한 퍼블릭 키 목록 가져오기
<a name="instance-metadata-ex-3"></a>

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

------
#### [ cURL ]

```
[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/meta-data/public-keys/
0=my-public-key
```

------
#### [ PowerShell ]

```
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/meta-data/public-keys/
0=my-public-key
```

------

### 퍼블릭 키 0을 이용할 수 있는 형식 표시
<a name="instance-metadata-ex-4"></a>

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

------
#### [ cURL ]

```
[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/meta-data/public-keys/0/
openssh-key
```

------
#### [ PowerShell ]

```
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/meta-data/public-keys/0/openssh-key
openssh-key
```

------

### 퍼블릭 키 0(OpenSSH 키 형식) 가져오기
<a name="instance-metadata-ex-5"></a>

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

------
#### [ cURL ]

```
[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/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
```

------
#### [ PowerShell ]

```
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/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 가져오기
<a name="instance-metadata-ex-6"></a>

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

------
#### [ cURL ]

```
[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/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------
#### [ PowerShell ]

```
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/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------

### 인스턴스에 대한 인스턴스 태그 가져오기
<a name="instance-metadata-ex-7"></a>

인스턴스 메타데이터의 인스턴스 태그에 대한 액세스가 설정된 경우 인스턴스 메타데이터에서 인스턴스의 태그를 가져올 수 있습니다. 자세한 내용은 [인스턴스 메타데이터에서 태그 검색](work-with-tags-in-IMDS.md#retrieve-tags-from-IMDS) 섹션을 참조하세요.

## IMDSv1 예제
<a name="instance-metadata-retrieval-examples-imdsv1"></a>

Amazon EC2 인스턴스에서 다음 예제를 실행하여 IMDSv1의 인스턴스 메타데이터를 검색합니다.

Windows 인스턴스에서 Windows PowerShell을 사용하거나 cURL 또는 wget을 설치할 수 있습니다. Windows 인스턴스에 서드 파티 도구를 설치하는 경우 직접 호출과 출력이 여기 설명된 것과 다를 수 있으므로 부속 문서를 주의 깊게 정독해야 합니다.

**Topics**
+ [인스턴스 메타데이터의 사용 가능한 버전 가져오기](#instance-metadata-ex-1-imdsv1)
+ [최고 수준 메타데이터 항목 가져오기](#instance-metadata-ex-2-imdsv1)
+ [메타데이터 항목의 값 가져오기](#instance-metadata-ex-2a-imdsv1)
+ [사용 가능한 퍼블릭 키 목록 가져오기](#instance-metadata-ex-3-imdsv1)
+ [퍼블릭 키 0을 이용할 수 있는 형식 표시](#instance-metadata-ex-4-imdsv1)
+ [퍼블릭 키 0(OpenSSH 키 형식) 가져오기](#instance-metadata-ex-5-imdsv1)
+ [인스턴스에 대한 서브넷 ID 가져오기](#instance-metadata-ex-6-imdsv1)
+ [인스턴스에 대한 인스턴스 태그 가져오기](#instance-metadata-ex-7-imdsv1)

### 인스턴스 메타데이터의 사용 가능한 버전 가져오기
<a name="instance-metadata-ex-1-imdsv1"></a>

이 예를 통해 이용 가능한 인스턴스 메타데이터 버전을 가져올 수 있습니다. 각 버전은 새 인스턴스 메타데이터 카테고리가 릴리스될 때 인스턴스 메타데이터 빌드를 참조합니다. 인스턴스 메타데이터 빌드 버전은 Amazon EC2 API 버전과 상관관계가 없습니다. 이전 버전의 구조 및 정보를 사용하는 스크립트인 경우 이전 버전을 사용할 수 있습니다.

------
#### [ cURL ]

```
[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
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri 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
```

------

### 최고 수준 메타데이터 항목 가져오기
<a name="instance-metadata-ex-2-imdsv1"></a>

이 예제는 최고 수준 메타데이터 항목을 가져옵니다. 응답의 항목에 대한 자세한 내용은 [인스턴스 메타데이터 카테고리](ec2-instance-metadata.md#instancedata-data-categories) 섹션을 참조하세요.

액세스를 허용한 경우에만 이 출력에 태그가 포함됩니다. 자세한 내용은 [인스턴스 메타데이터에서 태그에 대한 액세스 활성화](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS) 섹션을 참조하세요.

------
#### [ cURL ]

```
[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/
tags/
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/    
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
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/
tags/
```

------

### 메타데이터 항목의 값 가져오기
<a name="instance-metadata-ex-2a-imdsv1"></a>

이 예제는 이전 예제에서 얻은 최상위 메타데이터 항목 중 일부의 값을 가져옵니다.

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------

### 사용 가능한 퍼블릭 키 목록 가져오기
<a name="instance-metadata-ex-3-imdsv1"></a>

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

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key
```

------

### 퍼블릭 키 0을 이용할 수 있는 형식 표시
<a name="instance-metadata-ex-4-imdsv1"></a>

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

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/
openssh-key
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
openssh-key
```

------

### 퍼블릭 키 0(OpenSSH 키 형식) 가져오기
<a name="instance-metadata-ex-5-imdsv1"></a>

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

------
#### [ cURL ]

```
[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
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri 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 가져오기
<a name="instance-metadata-ex-6-imdsv1"></a>

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

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------

### 인스턴스에 대한 인스턴스 태그 가져오기
<a name="instance-metadata-ex-7-imdsv1"></a>

인스턴스 메타데이터의 인스턴스 태그에 대한 액세스가 설정된 경우 인스턴스 메타데이터에서 인스턴스의 태그를 가져올 수 있습니다. 자세한 내용은 [인스턴스 메타데이터에서 태그 검색](work-with-tags-in-IMDS.md#retrieve-tags-from-IMDS) 섹션을 참조하세요.

# 인스턴스 메타데이터 서비스 버전 2 사용으로 전환
<a name="instance-metadata-transition-to-version-2"></a>

인스턴스가 인스턴스 메타데이터 서비스 버전 2(IMDSv2) 호출만 허용하도록 설정하려면, 다음에 소개하는 도구와 전환 경로를 사용하는 것이 좋습니다.

**Topics**
+ [IMDSv2로 전환하는 데 사용되는 도구](#tools-for-transitioning-to-imdsv2)
+ [IMDSv2를 요구하는 권장 경로](#recommended-path-for-requiring-imdsv2)

## IMDSv2로 전환하는 데 사용되는 도구
<a name="tools-for-transitioning-to-imdsv2"></a>

다음 도구는 소프트웨어를 IMDSv1에서 IMDSv2로 전환할 때, 이를 식별, 모니터링 및 관리하는 데 도움이 됩니다. 이러한 도구를 사용하는 방법에 대한 지침은 [IMDSv2를 요구하는 권장 경로](#recommended-path-for-requiring-imdsv2) 섹션을 참조하세요.

**AWS 소프트웨어**  
최신 버전의 AWS CLI 및 AWS SDK는 IMDSv2를 지원합니다. IMDSv2를 사용하려면 EC2 인스턴스에서 최신 버전으로 업데이트해야 합니다. IMDSv2를 지원하는 최소 AWS SDK 버전은 [지원되는 AWS SDK 사용](configuring-instance-metadata-service.md#use-a-supported-sdk-version-for-imdsv2) 섹션을 참조하세요.  
모든 Amazon Linux 2 및 Amazon Linux 2023 소프트웨어 패키지에서 IMDSv2를 지원합니다. Amazon Linux 2023은 기본적으로 IMDSv1을 비활성화합니다.

**IMDS 패킷 분석기**  
IMDS 패킷 분석기는 인스턴스의 부팅 단계와 실행 중에 발생하는 IMDSv1 호출을 식별하고 기록하는 오픈 소스 도구입니다. 이러한 로그를 분석하면 인스턴스에서 IMDSv1을 호출하는 소프트웨어를 정확히 파악하고, IMDSv2만 지원하도록 업데이트가 필요한 부분을 확인할 수 있습니다. 명령줄에서 IMDS 패킷 분석기를 실행하거나 서비스로 설치할 수 있습니다. 자세한 내용은 *GitHub*의 [AWS ImdsPacketAnalyzer](https://github.com/aws/aws-imds-packet-analyzer)를 참조하세요.

**CloudWatch**  
CloudWatch는 인스턴스 모니터링을 위해 다음 두 가지 지표를 제공합니다.  
`MetadataNoToken` – IMDSv2는 토큰 지원 세션을 사용하지만 IMDSv1은 사용하지 않습니다. `MetadataNoToken` 지표는 IMDSv1을 사용하는 인스턴스 메타데이터 서비스(IMDS)에 대한 호출 수를 추적합니다. 이 지표를 0까지 추적하면 모든 소프트웨어가 IMDSv2를 사용하도록 업그레이드되었는지 여부와 업그레이드된 시간을 확인할 수 있습니다.  
`MetadataNoTokenRejected` – IMDSv1을 비활성화한 후 `MetadataNoTokenRejected` 지표를 사용하여 IMDSv1 직접 호출이 시도되었지만 거부된 횟수를 추적할 수 있습니다. 이 지표를 추적하면 IMDSv2를 사용하기 위해 소프트웨어를 업데이트해야 하는지 여부를 확인할 수 있습니다.  
각 EC2 인스턴스에 대해 이러한 지표는 상호 배타적입니다. IMDSv1이 활성화된 경우(`httpTokens = optional`) `MetadataNoToken`만 내보냅니다. IMDSv1이 비활성화된 경우(`httpTokens = required`) `MetadataNoTokenRejected`만 내보냅니다. 이러한 지표를 언제 사용해야 하는지는 [IMDSv2를 요구하는 권장 경로](#recommended-path-for-requiring-imdsv2) 섹션을 참조하세요.  
자세한 내용은 [인스턴스 지표](viewing_metrics_with_cloudwatch.md#ec2-cloudwatch-metrics) 섹션을 참조하세요.

**시작 API**  
**새 인스턴스:** IMDSv2 사용을 요구하는 새 인스턴스를 시작하려면 [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API를 사용하세요. 자세한 내용은 [새 인스턴스에 대한 인스턴스 메타데이터 옵션 구성](configuring-IMDS-new-instances.md) 섹션을 참조하세요.  
**기존 인스턴스:** 기존 인스턴스에서 IMDSv2를 사용하도록 요구하려면 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API를 사용하세요. 자세한 내용은 [기존 인스턴스에 대한 인스턴스 메타데이터 옵션 수정](configuring-IMDS-existing-instances.md) 섹션을 참조하세요.  
**Auto Scaling 그룹에서 시작하는 새 인스턴스:** Auto Scaling 그룹에서 시작하는 모든 새 인스턴스에 대해 IMDSv2 사용을 요구하려면, Auto Scaling 그룹에서 시작 템플릿 또는 시작 구성을 사용할 수 있습니다. [시작 템플릿을 생성](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-launch-template.html)하거나 [시작 구성을 생성](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/create-launch-configuration.html)할 때 IMDSv2를 반드시 사용하도록 `MetadataOptions` 파라미터를 구성해야 합니다. Auto Scaling 그룹은 새 시작 템플릿 또는 시작 구성을 사용하여 새 인스턴스를 시작하지만 기존 인스턴스는 영향을 받지 않습니다.  
**Auto Scaling 그룹의 기존 인스턴스:** [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API를 사용하여 기존 인스턴스에서 IMDSv2를 사용하도록 요구하거나, 인스턴스를 종료하면 Auto Scaling 그룹이 새 시작 템플릿 또는 시작 구성에 정의된 인스턴스 메타데이터 옵션 설정으로 새 대체 인스턴스를 시작합니다.

**AMI**  
`ImdsSupport` 파라미터를 `v2.0`으로 설정한 AMI는 기본적으로 IMDSv2를 요구하는 인스턴스를 시작합니다. Amazon Linux 2023은 `ImdsSupport = v2.0`으로 구성되어 있습니다.  
**새 AMI:** 새 AMI를 생성할 때 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) CLI 명령을 사용하여 `ImdsSupport` 파라미터를 `v2.0`으로 설정합니다.  
**기존 AMI:** 기존 AMI를 수정할 때 [modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) CLI 명령을 사용하여 `ImdsSupport` 파라미터를 `v2.0`으로 설정합니다.  
자세한 내용은 [AMI 구성](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-ami-configuration) 섹션을 참조하세요.

**계정 수준 제어**  
계정 수준에서 모든 인스턴스 메타데이터 옵션의 기본값을 구성할 수 있습니다. 인스턴스를 시작할 때 기본값이 자동으로 적용됩니다. 자세한 내용은 [IMDSv2를 계정 기본값으로 설정](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults) 섹션을 참조하세요.  
계정 수준에서 IMDSv2 사용 요구 사항을 적용할 수도 있습니다. IMDSv2 적용이 활성화되면 다음과 같은 일이 일어납니다.  
+ **새 인스턴스:** IMDSv1이 활성화된 상태에서 시작하도록 구성된 인스턴스는 시작되지 않습니다.
+ **IMDSv1이 비활성화된 기존 인스턴스:** 기존 인스턴스에서 IMDSv1을 활성화하려는 시도는 차단됩니다.
+ **IMDSv1이 활성화된 기존 인스턴스:** IMDSv1이 이미 활성화된 기존 인스턴스는 영향을 받지 않습니다.
자세한 내용은 [계정 수준에서 IMDSv2 적용](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level) 섹션을 참조하세요.

**IAM 정책 및 SCP**  
IAM 정책 또는 AWS Organizations 서비스 제어 정책(SCP)을 사용하여 다음과 같이 사용자를 제어할 수 있습니다.  
+ 인스턴스가 IMDSv2를 사용하도록 구성되어 있지 않으면 [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API를 사용하여 인스턴스를 시작할 수 없습니다.
+ IMDSv1을 다시 활성화하기 위해 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API를 사용하여 기존 인스턴스를 수정할 수 없습니다.
IAM 정책 또는 SCP에 다음 IAM 조건 키가 포함되어야 합니다.  
+ `ec2:MetadataHttpEndpoint`
+ `ec2:MetadataHttpPutResponseHopLimit`
+ `ec2:MetadataHttpTokens`
API 또는 CLI 호출의 파라미터가 조건 키가 포함된 정책에 지정된 상태와 일치하지 않는 경우 API 또는 CLI 호출은 `UnauthorizedOperation` 응답과 함께 실패합니다.  
추가로, IMDSv1에서 IMDSv2로 변경을 시행하기 위한 추가 보호 계층을 선택할 수 있습니다. EC2 역할 자격 증명을 통해 호출되는 API에 관한 액세스 관리 계층에서는 IAM 정책 또는 AWS Organizations 서비스 제어 정책(SCP)에서 조건 키를 사용할 수 있습니다. 특히, IAM 정책에서 값이 `ec2:RoleDelivery`인 조건 키 `2.0`을 사용하여 IMDSv1에서 얻은 EC2 역할 자격 증명으로 API 호출을 수행하면 `UnauthorizedOperation` 응답이 수신됩니다. SCP에 따라 필요한 조건을 사용하여 동일한 작업을 더 광범위하게 수행할 수 있습니다. 이렇게 하면 지정된 조건에 맞지 않게 API를 호출할 경우 `UnauthorizedOperation` 오류가 수신되기 때문에 실제로 IMDSv1을 통해 제공된 자격 증명을 사용하여 API를 호출할 수 없습니다.  
IAM 정책에 대한 예시는 [인스턴스 메타데이터 작업](ExamplePolicies_EC2.md#iam-example-instance-metadata) 섹션을 참조하세요. SCP에 대한 자세한 내용을 알아보려면 *AWS Organizations 사용 설명서*의 [서비스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)을 참조하세요.

**선언적 정책**  
선언적 정책(AWS Organizations의 기능)을 사용하여 조직 전체에서 IMDSv2 적용을 포함한 IMDS 계정 기본값을 중앙에서 설정할 수 있습니다. 예제 정책은 *AWS Organizations 사용 설명서*의 [지원되는 선언적 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples) 섹션에 있는 **인스턴스 메타데이터** 탭을 참조하세요.

## IMDSv2를 요구하는 권장 경로
<a name="recommended-path-for-requiring-imdsv2"></a>

**Topics**
+ [1단계: IMDSv2=optional 인스턴스 식별 및 IMDSv1 사용 감사](#path-step-1)
+ [2단계: 소프트웨어를 IMDSv2로 업데이트](#path-step-2)
+ [3단계: 인스턴스에서 IMDSv2 요구](#path-step-3)
+ [4단계: IMDSv2=required를 기본값으로 설정](#path-step-4)
+ [5단계: 인스턴스에서 IMDSv2 요구를 강제합니다.](#path-step-5)

### 1단계: IMDSv2=optional 인스턴스 식별 및 IMDSv1 사용 감사
<a name="path-step-1"></a>

IMDSv2 마이그레이션 범위를 평가하려면 IMDSv1 또는 IMDSv2를 모두 허용하도록 구성된 인스턴스를 식별하고 IMDSv1 호출을 감사하세요.

1. **IMDSv1 또는 IMDSv2를 모두 허용하도록 구성된 인스턴스를 식별합니다.**

------
#### [ Amazon EC2 console ]

   1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

   1. IMDSv1 또는 IMDSv2를 허용하도록 구성된 인스턴스만 보려면 **IMDSv2 = optional** 필터를 추가합니다.

   1. 또는 모든 인스턴스의 IMDSv2가 **optional**인지 **required**인지 확인하려면 **기본 설정** 창(톱니바퀴 아이콘)을 열고 **IMDSv2**를 켠 다음 **확인**을 선택합니다. 이렇게 하면 **Instances** 테이블에 **IMDSv2** 열이 추가됩니다.

------
#### [ AWS CLI ]

   다음과 같이 [describe-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) 명령을 사용하고 `metadata-options.http-tokens = optional`로 필터링합니다.

   ```
   aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text
   ```

------

1. **각 인스턴스의 IMDSv1 호출 감사:**

   CloudWatch 지표 `MetadataNoToken`을 사용하세요. 이 지표는 인스턴스에서 IMDS에 대한 IMDSv1 호출 수를 표시합니다. 자세한 내용은 [인스턴스 지표](https://docs.aws.amazon.com/en_us/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html#ec2-cloudwatch-metrics)를 참조하세요.

1. **인스턴스에서 IMDSv1을 호출하는 소프트웨어를 식별합니다.**

   오픈 소스 [IMDS 패킷 분석기](https://github.com/aws/aws-imds-packet-analyzer)를 사용하여 인스턴스의 부팅 단계와 런타임 작업 중 IMDSv1 호출을 식별하고 기록하세요. 이 정보를 사용하여 IMDSv2만 사용하도록 인스턴스를 준비하기 위해 업데이트해야 할 소프트웨어를 확인하세요. 명령줄에서 IMDS 패킷 분석기를 실행하거나 서비스로 설치할 수 있습니다.

### 2단계: 소프트웨어를 IMDSv2로 업데이트
<a name="path-step-2"></a>

인스턴스에서 역할 자격 증명을 사용하는 모든 SDK, CLI 및 소프트웨어를 IMDSv2 호환 버전으로 업데이트하세요. CLI 업데이트에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

### 3단계: 인스턴스에서 IMDSv2 요구
<a name="path-step-3"></a>

`MetadataNoToken` 지표를 통해 IMDSv1 호출이 0임을 확인한 후, 기존 인스턴스를 IMDSv2 요구하도록 구성하세요. 또한 모든 새 인스턴스를 IMDSv2 요구하도록 구성하세요. 즉, 모든 기존 및 새 인스턴스에서 IMDSv1을 비활성화하세요.

1. **기존 인스턴스를 IMDSv2 요구하도록 구성합니다.**

------
#### [ Amazon EC2 console ]

   1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

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

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

   1. **IMDSv2**의 경우 **필수**를 선택합니다.

   1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

   [modify-instance-metadata-options](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) CLI 명령을 사용하여 IMDSv2만 사용하도록 지정합니다.

------
**참고**  
실행 중인 인스턴스에서 이 설정을 수정할 수 있으며, 인스턴스 재시작 없이 즉시 적용됩니다.

   자세한 내용은 [IMDSv2의 사용 요구](configuring-IMDS-existing-instances.md#modify-require-IMDSv2) 섹션을 참조하세요.

1. **IMDSv1 비활성화 후 문제를 모니터링합니다.**

   1. CloudWatch 지표 `MetadataNoTokenRejected`를 사용하여 IMDSv1 호출이 시도되고 거부된 횟수를 추적합니다.

   1. `MetadataNoTokenRejected` 지표가 소프트웨어 문제가 발생하는 인스턴스에서 IMDSv1 호출을 기록하면 해당 소프트웨어를 IMDSv2로 업데이트해야 함을 나타냅니다.

1. **새 인스턴스를 IMDSv2를 요구하도록 구성합니다.​**

------
#### [ Amazon EC2 console ]

   1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

   1. [인스턴스 시작](ec2-launch-instance-wizard.md) 단계를 따릅니다.

   1. **고급 세부 정보**를 확장하고 **메타데이터 버전**에서 **V2 전용(토큰 필요)**을 선택합니다.

   1. **Summary**(요약) 패널에서 인스턴스 구성을 검토한 다음 **Launch instance**(인스턴스 시작)를 선택합니다.

      자세한 내용은 [시작 시 인스턴스 구성](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-instance-settings) 섹션을 참조하세요.

------
#### [ AWS CLI ]

   AWS CLI: [run-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html) 명령을 사용하여 IMDSv2를 필수로 지정합니다.

------

### 4단계: IMDSv2=required를 기본값으로 설정
<a name="path-step-4"></a>

계정 또는 조직 수준에서 IMDSv2=required를 기본 구성으로 설정할 수 있습니다. 이렇게 하면 모든 새로 시작된 인스턴스가 자동으로 IMDSv2를 요구하도록 구성됩니다.

1. **계정 수준 기본값을 설정합니다.**

------
#### [ Amazon EC2 console ]

   1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

   1. 탐색 창에서 **대시보드**를 선택합니다.

   1. **계정 속성** 카드의 **설정**에서 **데이터 보호 및 보안**을 선택합니다.

   1. **IMDS 기본값**에서 **관리**를 선택합니다.

   1. **인스턴스 메타데이터 서비스**에서 **활성화됨**을 선택합니다.

   1. **메타데이터 버전**에서 **V2 전용(토큰 필요)**을 선택합니다.

   1. **업데이트**를 선택합니다.

------
#### [ AWS CLI ]

   [modify-instance-metadata-defaults](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-defaults.html) CLI 명령을 사용하고 `--http-tokens required` 및 `--http-put-response-hop-limit 2`를 지정합니다.

------

   자세한 내용은 [IMDSv2를 계정 기본값으로 설정](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults) 섹션을 참조하세요.

1. **또는 선언적 정책을 사용하여 조직 수준 기본값을 설정합니다.**

   선언적 정책을 사용하여 조직 기본값으로 IMDSv2를 required로 설정하세요. 예제 정책은 *AWS Organizations 사용 설명서*의 [지원되는 선언적 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples) 섹션에 있는 **인스턴스 메타데이터** 탭을 참조하세요.

### 5단계: 인스턴스에서 IMDSv2 요구를 강제합니다.
<a name="path-step-5"></a>

인스턴스에서 IMDSv1에 대한 종속성이 없음이 확인되면 모든 새 인스턴스에 IMDSv2를 적용하는 것이 좋습니다.

IMDSv2를 적용하려면 다음 옵션 중 하나를 사용하세요.

1. **계정 속성으로 IMDSv2 적용**

   각 AWS 리전에 대해 계정 수준에서 IMDSv2 사용을 적용할 수 있습니다. 적용되면 인스턴스가 IMDSv2를 요구하도록 구성된 경우에만 인스턴스를 시작할 수 있습니다. 이는 인스턴스 또는 AMI 구성 방식에 관계없이 적용됩니다. 자세한 내용은 [계정 수준에서 IMDSv2 적용](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level) 섹션을 참조하세요. 조직 수준에서 이 설정을 적용하려면 선언적 정책을 설정합니다. 예제 정책은 *AWS Organizations 사용 설명서*의 [지원되는 선언적 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples) 섹션에 있는 **인스턴스 메타데이터** 탭을 참조하세요.

   적용 취소를 방지하려면 IAM 정책을 사용하여 [ModifyInstanceMetadataDefaults](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataDefaults.html) API에 대한 액세스를 차단해야 합니다. 자세한 내용은 [IAM 정책 사용](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-iam-policy) 섹션을 참조하세요.
**참고**  
이 설정은 기존 인스턴스의 IMDS 버전을 변경하지 않지만 현재 IMDSv1이 비활성화된 기존 인스턴스에서 IMDSv1을 활성화하는 것을 차단합니다.
**주의**  
IMDSv2 적용이 활성화되어 있고 시작 시 인스턴스 구성, 계정 설정 또는 AMI 구성에서 `httpTokens`가 `required`로 설정되지 않은 경우 인스턴스 시작이 실패합니다. 문제 해결 정보는 [IMDSv1이 활성화된 인스턴스 시작 실패](troubleshooting-launch.md#launching-an-imdsv1-enabled-instance-fails)를 참조하세요.

1. **또는 다음 IAM 또는 SCP 조건 키를 사용하여 IMDSv2를 적용합니다.**
   + `ec2:MetadataHttpTokens`
   + `ec2:MetadataHttpPutResponseHopLimit`
   + `ec2:MetadataHttpEndpoint`

   이 조건 키들은 [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) 및 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API와 해당 CLI의 사용을 제어합니다. 정책이 생성되고 API 호출의 파라미터가 조건 키를 사용하는 정책에 지정된 상태와 일치하지 않으면 API 또는 CLI 호출이 `UnauthorizedOperation` 응답과 함께 실패합니다.

   IAM 정책에 대한 예시는 [인스턴스 메타데이터 작업](ExamplePolicies_EC2.md#iam-example-instance-metadata) 섹션을 참조하세요.

# 인스턴스 메타데이터 서비스에 대한 액세스 제한
<a name="instance-metadata-limiting-access"></a>

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

[Nitro 기반 인스턴스](instance-types.md#instance-hypervisor-type)의 경우 가상 라우터와 같은 VPC 내의 네트워크 어플라이언스가 IMDS 주소로 패킷을 전달하고 인스턴스의 기본 [원본/대상 확인](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck)이 비활성화되어 있으면 자체 네트워크에서 IMDS에 연결할 수 있습니다. VPC 외부 소스에서 IMDS에 연결할 수 없도록 하려면 대상 IPv4 주소가 IMDS `169.254.169.254`이고 IPv6 엔드포인트를 활성화한 경우 IPv6 주소가 IMDS `[fd00:ec2::254]`인 패킷을 삭제하도록 네트워크 어플라이언스의 구성을 수정하는 것이 좋습니다.

## Linux 인스턴스에 대한 IMDS 액세스 제한
<a name="instance-metadata-limiting-access-linux"></a>

**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`에서 실행 중인 프로세스를 제외하고 모든 프로세스가 IMDS에 액세스할 수 없도록 설정합니다.

```
$ 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를 사용할 수도 있습니다. 다음 예에서는 IMDS에 대한 액세스를 루트 사용자만으로 제한합니다.

**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는 기본적으로 첫 번째 일치하는 규칙으로 설정됩니다.

## Windows 인스턴스에 대한 IMDS 액세스 제한
<a name="instance-metadata-limiting-access-windows"></a>

**Windows 방화벽을 사용하여 액세스 제한**

다음 PowerShell 예제에서는 기본 제공 Windows 방화벽을 사용하여 Internet Information Server 웹 서버(기본 설치 사용자 ID `NT AUTHORITY\IUSR` 기준)가 169.254.169.254에 액세스할 수 없도록 설정합니다. 이 예제에서는 *거부 규칙*을 사용하여 해당 사용자로 실행하는 모든 프로세스의 모든 인스턴스 메타데이터 요청(IMDSv1이든 IMDSv2든 상관없이)을 거부합니다.

```
PS C:\> $blockPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("NT AUTHORITY\IUSR")
PS C:\> $BlockPrincipalSID = $blockPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $BlockPrincipalSDDL = "D:(A;;CC;;;$BlockPrincipalSID)"
PS C:\> New-NetFirewallRule -DisplayName "Block metadata service from IIS" -Action block -Direction out `
-Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $BlockPrincipalSDDL
```

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

다음 예제에서는 `blockPrincipal`에서 지정한 프로세스(이 예제에서는 `Everyone`라는 그룹)를 제외하고, 변수 `exceptionPrincipal`에서 지정한 OS 그룹으로 실행하는 모든 프로세스(이 예제에서는 Windows 그룹 `trustworthy-users`)가 인스턴스 메타데이터에 액세스할 수 없도록 설정합니다. Linux iptables의 `! --uid-owner trustworthy-user` 규칙과 달리 Windows 방화벽은 다른 모든 보안 주체를 거부하여 특정 보안 주체만 허용하는 바로 가기 메커니즘을 제공하지 않으므로, 보안 주체 거부 및 허용을 모두 지정해야 합니다.

```
PS C:\> $blockPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("Everyone")
PS C:\> $BlockPrincipalSID = $blockPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $exceptionPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("trustworthy-users")
PS C:\> $ExceptionPrincipalSID = $exceptionPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $PrincipalSDDL = "O:LSD:(D;;CC;;;$ExceptionPrincipalSID)(A;;CC;;;$BlockPrincipalSID)"
PS C:\> New-NetFirewallRule -DisplayName "Block metadata service for $($blockPrincipal.Value), exception: $($exceptionPrincipal.Value)" -Action block -Direction out `
-Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $PrincipalSDDL
```

**참고**  
로컬 방화벽 규칙을 사용하려면 이전 예제 명령을 필요에 맞게 조정해야 합니다.

**netsh 규칙을 사용하여 액세스 제한**

`netsh` 규칙을 사용하여 모든 소프트웨어를 차단할 수 있지만, 이러한 규칙은 훨씬 더 유연합니다.

```
C:\> netsh advfirewall firewall add rule name="Block metadata service altogether" dir=out protocol=TCP remoteip=169.254.169.254 action=block
```

**참고**  
로컬 방화벽 규칙을 사용하려면 이전 예제 명령을 필요에 맞게 조정해야 합니다.
`netsh` 규칙은 승격된 명령 프롬프트에서 설정해야 하며, 특정 보안 주체를 거부하거나 허용하도록 설정할 수 없습니다.

# 인스턴스 메타데이터 서비스 옵션 구성
<a name="configuring-instance-metadata-options"></a>

인스턴스 메타데이터 서비스(IMDS)는 모든 EC2 인스턴스에서 로컬로 실행됩니다. *인스턴스 메타데이터 옵션*은 EC2 인스턴스에서 IMDS의 액세스 가능성과 동작을 제어하는 일련의 구성입니다.

각 인스턴스에서 다음 인스턴스 메타데이터 옵션을 구성할 수 있습니다.

**인스턴스 메타데이터 서비스(IMDS)**: `enabled` \$1 `disabled`  
인스턴스에서 IMDS를 활성화 또는 비활성화할 수 있습니다. 비활성화하면 사용자 또는 다른 코드에서 인스턴스의 인스턴스 메타데이터에 액세스할 수 없습니다.  
IMDS에는 인스턴스에 IPv4(`169.254.169.254`) 및 IPv6(`[fd00:ec2::254]`)이라는 두 개의 엔드포인트가 있습니다. IMDS를 활성화하면 IPv4 엔드포인트가 자동으로 활성화됩니다. IPv6 엔드포인트를 활성화하려면 명시적으로 활성화해야 합니다.

**IMDS IPv6 엔드포인트**: `enabled` \$1 `disabled`  
인스턴스에서 IPv6 IMDS 엔드포인트를 명시적으로 활성화할 수 있습니다. IPv6 엔드포인트가 활성화된 경우 IPv4 엔드포인트는 활성화된 상태로 유지됩니다. IPv6 엔드포인트는 [IPv6 지원 서브넷](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)(듀얼 스택 또는 IPv6 전용)의 [Nitro 기반 인스턴스](instance-types.md#instance-hypervisor-type)에서만 지원됩니다.

**메타데이터 버전**: `IMDSv1 or IMDSv2 (token optional)` \$1 `IMDSv2 only (token required)`  
인스턴스 메타데이터를 요청할 때 IMDSv2를 직접 호출하려면 토큰이 필요합니다. IMDSv1 직접 호출에는 토큰이 필요하지 않습니다. IMDSv1 또는 IMDSv2 직접 호출(토큰은 선택 사항)을 허용하거나 IMDSv2 직접 호출만(토큰은 필수) 허용하도록 인스턴스를 구성할 수 있습니다.

**메타데이터 응답 홉 제한**: `1`–`64`  
홉 제한은 PUT 응답에 허용된 네트워크 홉 수입니다. 홉 제한을 최소 `1` 및 최대 `64`로 설정할 수 있습니다. 컨테이너 환경에서는 홉 제한 `1`이 문제를 일으킬 수 있습니다. 이러한 문제를 완화하는 방법에 대한 자세한 내용은 [인스턴스 메타데이터 액세스 고려 사항](instancedata-data-retrieval.md#imds-considerations) 아래의 컨테이너 환경 정보를 참조하세요.

**인스턴스 메타데이터에서 태그에 대한 액세스**: `enabled` \$1 `disabled`  
인스턴스 메타데이터에서 인스턴스의 태그에 대한 액세스를 활성화하거나 비활성화할 수 있습니다. 자세한 내용은 [인스턴스 메타데이터를 사용하여 EC2 인스턴스의 태그 보기](work-with-tags-in-IMDS.md) 섹션을 참조하세요.

인스턴스의 현재 구성을 보려면 [기존 인스턴스에 대한 인스턴스 메타데이터 옵션 쿼리](instancedata-data-retrieval.md#query-IMDS-existing-instances) 섹션을 참조하세요.

## 인스턴스 메타데이터 옵션을 구성하는 위치
<a name="where-to-configure-instance-metadata-options"></a>

인스턴스 메타데이터 옵션은 다음과 같이 다양한 수준에서 구성할 수 있습니다.
+ **계정** - 각 AWS 리전의 계정 수준에서 인스턴스 메타데이터 옵션의 기본값을 설정할 수 있습니다. 인스턴스가 시작되면 인스턴스 메타데이터 옵션이 계정 수준 값으로 자동 설정됩니다. 이러한 값은 시작할 때 변경할 수 있습니다. 계정 수준의 기본값은 기존 인스턴스에 영향을 주지 않습니다.
+ **AMI** - AMI를 등록하거나 수정할 때 `imds-support` 파라미터를 `v2.0`으로 설정할 수 있습니다. 이 AMI로 인스턴스를 시작하면 인스턴스 메타데이터 버전이 자동으로 IMDSv2로 설정되고 홉 제한은 2로 설정됩니다.
+ **인스턴스** - 시작할 때 인스턴스의 모든 인스턴스 메타데이터 옵션을 변경하여 기본 설정을 재정의할 수 있습니다. 실행 중이거나 중지된 인스턴스에서 시작 후 인스턴스 메타데이터 옵션을 변경할 수도 있습니다. 단, IAM 또는 SCP 정책에 따라 변경이 제한될 수 있습니다.

자세한 내용은 [새 인스턴스에 대한 인스턴스 메타데이터 옵션 구성](configuring-IMDS-new-instances.md) 및 [기존 인스턴스에 대한 인스턴스 메타데이터 옵션 수정](configuring-IMDS-existing-instances.md)(을)를 참조하세요.

## 인스턴스 메타데이터 옵션의 우선순위
<a name="instance-metadata-options-order-of-precedence"></a>

각 인스턴스 메타데이터 옵션의 값은 계층적 우선순위에 따라 인스턴스를 시작할 때 결정됩니다. 계층 구조는 다음과 같습니다(맨 위의 우선순위가 가장 높음).
+ **우선순위 1: 시작 시 인스턴스 구성** - 시작 템플릿 또는 인스턴스 구성에서 값을 지정할 수 있습니다. 여기에 지정된 모든 값은 계정 수준 또는 AMI에서 지정된 값을 재정의합니다.
+ **우선순위 2: 계정 설정** - 인스턴스 시작 시 값을 지정하지 않은 경우 계정 수준 설정(각 AWS 리전에 대해 설정됨)에 따라 값이 결정됩니다. 계정 수준 설정은 각 메타데이터 옵션의 값을 포함하거나 기본 설정이 없음을 나타냅니다.
+ **우선순위 3: AMI 구성** - 인스턴스 시작 시 또는 계정 수준에서 값이 지정되지 않은 경우 AMI 구성에 따라 값이 결정됩니다. 이것은 `HttpTokens` 및 `HttpPutResponseHopLimit`에만 적용됩니다.

각 메타데이터 옵션은 개별적으로 평가됩니다. 인스턴스는 직접 인스턴스 구성, 계정 수준 기본값 및 AMI의 구성을 혼합하여 구성할 수 있습니다.

IAM 또는 SCP 정책에 의해 변경이 제한되지 않는 한, 실행 중이거나 중지된 인스턴스에서 시작 후 모든 메타데이터 옵션의 값을 변경할 수 있습니다.

**참고**  
계정 수준의 IMDSv2 적용 설정은 우선순위에 따라 인스턴스의 IMDS 설정이 결정된 후 평가됩니다. IMDSv2 적용이 활성화되면 IMDSv1로 활성화된 인스턴스가 실패합니다. 적용에 대한 자세한 내용은 [계정 수준에서 IMDSv2 적용](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level) 섹션을 참조하세요.

**주의**  
IMDSv2 적용이 활성화되어 있고 시작 시 인스턴스 구성, 계정 설정 또는 AMI 구성에서 `httpTokens`가 `required`로 설정되지 않은 경우 시작이 실패합니다.

**예제 1 - 메타데이터 옵션 값 결정**

이 예에서는 계정 수준에서 `HttpPutResponseHopLimit`가 `1`로 설정된 리전에서 EC2 인스턴스가 시작됩니다. 지정된 AMI에서 `ImdsSupport`가 `v2.0`으로 설정되었습니다. 시작할 때 인스턴스에서 직접 메타데이터 옵션이 지정되지 않습니다. 인스턴스는 다음 메타데이터 옵션으로 시작됩니다.

```
"MetadataOptions": {
    ...
    "HttpTokens": "required",
    "HttpPutResponseHopLimit": 1,
    ...
```

이러한 값은 다음과 같이 결정됩니다.
+ **시작 시 지정된 메타데이터 옵션 없음:** 인스턴스를 시작하는 동안 인스턴스 시작 파라미터나 시작 템플릿에 메타데이터 옵션의 특정 값이 제공되지 않습니다.
+ **계정 설정이 다음 우선순위:** 시작 시 지정된 특정 값이 없는 경우 리전 내 계정 수준의 설정이 우선됩니다. 즉, 계정 수준에서 구성된 기본값이 적용됩니다. 이 경우에는 `HttpPutResponseHopLimit`가 `1`로 설정되었습니다.
+ **AMI 설정이 마지막 우선순위:** 시작 시 또는 `HttpTokens`에 대한 계정 수준(인스턴스 메타데이터 버전)에서 특정 값이 지정되지 않은 경우 AMI 설정이 적용됩니다. 이 경우 AMI 설정 `ImdsSupport: v2.0`은 `HttpTokens`가 `required`로 설정되었음을 확인했습니다. AMI 설정 `ImdsSupport: v2.0`은 `HttpPutResponseHopLimit: 2`를 설정하도록 설계되었지만 우선순위가 더 높은 계정 수준 설정 `HttpPutResponseHopLimit: 1`로 재정의되었습니다.

**예제 2 - 메타데이터 옵션 값 결정**

이 예에서 EC2 인스턴스는 이전 예 1과 동일한 설정으로 시작되지만 시작 시 인스턴스에서 `HttpTokens`가 `optional`로 직접 설정되어 있습니다. 인스턴스는 다음 메타데이터 옵션으로 시작됩니다.

```
"MetadataOptions": {
    ...
    "HttpTokens": "optional",
    "HttpPutResponseHopLimit": 1,
    ...
```

`HttpPutResponseHopLimit`의 값은 예 1과 같은 방식으로 결정됩니다. 하지만 `HttpTokens`의 값은 다음과 같이 결정됩니다. 시작할 때 인스턴스에서 구성된 메타데이터 옵션이 우선 적용됩니다. AMI가 `ImdsSupport: v2.0`(즉, `HttpTokens`가 `required`로 설정됨)으로 구성되어 있더라도 시작 시 인스턴스에 지정된 값(`HttpTokens`가 `optional`로 설정됨)이 우선됩니다.

**예제 3 - HttpTokensEnforced가 활성화된 메타데이터 옵션 값 결정**

이 예제에서 해당 리전의 계정은 `HttpTokens = required` 및 `HttpTokensEnforced = enabled`로 설정되어 있습니다.

다음 EC2 인스턴스 시작 시도를 고려하세요.
+ `HttpTokens`를 `optional`로 설정하고 시작 시도 – 계정 수준 적용이 활성화되어 있고(`HttpTokensEnforced = enabled`) 시작 파라미터가 계정 기본값보다 우선하므로 시작이 실패합니다.
+ `HttpTokens`를 `required`로 설정하고 시작 시도 – 계정 수준 적용을 준수하므로 시작이 성공합니다.
+ `HttpTokens` 값을 지정하지 않고 시작 시도 – 계정 설정에 따라 값이 `required`로 기본 설정되므로 시작이 성공합니다.

### 인스턴스 메타데이터 버전 설정
<a name="metadata-version-order-of-precedence"></a>

인스턴스가 시작될 때 인스턴스 *메타데이터 버전* 값은 **IMDSv1 또는 IMDSv2(토큰 선택 사항)**(`httpTokens=optional`)이거나 **IMDSv2만(토큰 필수)(`httpTokens=required`)**입니다.

인스턴스를 시작할 때 메타데이터 버전의 값을 수동으로 지정하거나 기본값을 사용할 수 있습니다. 값을 수동으로 지정하면 해당 값이 기본값을 재정의합니다. 값을 수동으로 지정하지 않는 경우 기본 설정의 조합에 따라 값이 결정됩니다.

다음 순서도는 서로 다른 구성 수준의 설정에 따라 시작 시 인스턴스의 메타데이터 버전이 어떻게 결정되고 어디에서 적용이 평가되는지를 보여줍니다. 다음 표는 수준별 구체적인 설정을 제공합니다.

![\[인스턴스 메타데이터 버전과 IMDSv2 적용에 대한 평가 요소를 보여주는 흐름도\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/imds-defaults-launch-flow.png)


이 테이블에서는 시작 시 인스턴스의 메타데이터 버전(4번째 열의 **결과 인스턴스 구성**으로 표시됨)이 다양한 구성 수준의 설정에 따라 어떻게 결정되는지를 보여줍니다. 우선순위는 왼쪽에서 오른쪽 순서이며, 다음과 같이 첫 번째 열이 우선순위가 가장 높습니다.
+ 열 1: **시작 파라미터** - 시작 시 수동으로 지정하는 인스턴스의 설정을 나타냅니다.
+ 열 2: **계정 수준 기본값** - 계정 설정을 나타냅니다.
+ 열 3: **AMI 기본값** - AMI의 설정을 나타냅니다.


| 시작 파라미터 | 계정 수준 기본값 | AMI 기본값 | 결과 인스턴스 구성 | 
| --- | --- | --- | --- | 
| V2 전용(토큰 필요) | 기본 설정 없음 | V2 전용 | V2 전용 | 
| V2 전용(토큰 필요) | V2 전용 | V2 전용 | V2 전용 | 
| V2 전용(토큰 필요) | V1 또는 V2 | V2 전용 | V2 전용 | 
| V1 또는 V2(토큰 선택 사항) | 기본 설정 없음 | V2 전용 | V1 또는 V2 | 
| V1 또는 V2(토큰 선택 사항) | V2 전용 | V2 전용 | V1 또는 V2 | 
| V1 또는 V2(토큰 선택 사항) | V1 또는 V2 | V2 전용 | V1 또는 V2 | 
| 설정되지 않음 | 기본 설정 없음 | V2 전용 | V2 전용 | 
| 설정되지 않음 | V2 전용 | V2 전용 | V2 전용 | 
| 설정되지 않음 | V1 또는 V2 | V2 전용 | V1 또는 V2 | 
| V2 전용(토큰 필요) | 기본 설정 없음 | null | V2 전용 | 
| V2 전용(토큰 필요) | V2 전용 | null | V2 전용 | 
| V2 전용(토큰 필요) | V1 또는 V2 | null | V2 전용 | 
| V1 또는 V2(토큰 선택 사항) | 기본 설정 없음 | null | V1 또는 V2 | 
| V1 또는 V2(토큰 선택 사항) | V2 전용 | null | V1 또는 V2 | 
| V1 또는 V2(토큰 선택 사항) | V1 또는 V2 | null | V1 또는 V2 | 
| 설정되지 않음 | 기본 설정 없음 | null | V1 또는 V2 | 
| 설정되지 않음 | V2 전용 | null | V2 전용 | 
| 설정되지 않음 | V1 또는 V2 | null | V1 또는 V2 | 

## IAM 조건 키를 사용하여 인스턴스 메타데이터 옵션 제한
<a name="iam-condition-keys-and-imds"></a>

다음과 같이 IAM 정책 또는 SCP에서 IAM 조건 키를 사용할 수 있습니다.
+ IMDSv2를 사용해야 하도록 구성된 경우에만 인스턴스를 시작하도록 허용
+ 허용된 홉 수 제한
+ 인스턴스 메타데이터에 대한 액세스 비활성화

**Topics**
+ [인스턴스 메타데이터 옵션을 구성하는 위치](#where-to-configure-instance-metadata-options)
+ [인스턴스 메타데이터 옵션의 우선순위](#instance-metadata-options-order-of-precedence)
+ [IAM 조건 키를 사용하여 인스턴스 메타데이터 옵션 제한](#iam-condition-keys-and-imds)
+ [새 인스턴스에 대한 인스턴스 메타데이터 옵션 구성](configuring-IMDS-new-instances.md)
+ [기존 인스턴스에 대한 인스턴스 메타데이터 옵션 수정](configuring-IMDS-existing-instances.md)

**참고**  
작업을 조심스럽게 진행해야 하며 무엇이든 변경하기 전에 세심하게 테스트해야 합니다. 다음에 유의하세요.  
IMDSv2를 사용해야 하도록 설정하면 인스턴스 메타데이터 액세스에 IMDSv1를 사용하는 애플리케이션이나 에이전트는 중단됩니다.
인스턴스 메타데이터에 대한 모든 액세스를 끄면 인스턴스 메타데이터 액세스를 이용하여 작동하는 애플리케이션이나 에이전트는 중단됩니다.
IMDSv2의 경우 토큰을 검색할 때 `/latest/api/token`을 사용해야 합니다.
(Windows만 해당) PowerShell 버전이 4.0 이전 버전인 경우 IMDSv2를 사용하려면 [Windows Management Framework 4.0으로 업데이트](https://devblogs.microsoft.com/powershell/windows-management-framework-wmf-4-0-update-now-available-for-windows-server-2012-windows-server-2008-r2-sp1-and-windows-7-sp1/)해야 합니다.

# 새 인스턴스에 대한 인스턴스 메타데이터 옵션 구성
<a name="configuring-IMDS-new-instances"></a>

새 인스턴스에서 다음과 같은 인스턴스 메타데이터 옵션을 구성할 수 있습니다.

**Topics**
+ [IMDSv2의 사용 요구](#configure-IMDS-new-instances)
+ [IMDS IPv4 및 IPv6 엔드포인트 활성화](#configure-IMDS-new-instances-ipv4-ipv6-endpoints)
+ [인스턴스 메타데이터에 대한 액세스 비활성화](#configure-IMDS-new-instances--turn-off-instance-metadata)
+ [인스턴스 메타데이터의 태그에 대한 액세스 허용](#configure-IMDS-new-instances-tags-in-instance-metadata)

**참고**  
이러한 옵션에 대한 설정은 계정 수준에서 직접 구성되거나 선언적 정책을 사용하여 구성됩니다. 이 설정은 인스턴스 메타데이터 옵션을 구성하려는 각 AWS 리전에서 구성해야 합니다. 선언적 정책을 사용하면 여러 리전과 여러 계정에 동시에 설정을 적용할 수 있습니다. 선언적 정책을 사용 중인 경우 계정 내에서 직접 설정을 수정할 수 없습니다. 이 주제에서는 계정 내에서 직접 설정을 구성하는 방법을 설명합니다. 선언적 정책 사용에 대한 자세한 내용은 *AWS Organizations 사용 설명서*의 [선언적 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)을 참조하세요.

## IMDSv2의 사용 요구
<a name="configure-IMDS-new-instances"></a>

다음 방법을 사용하여 새 인스턴스에서 IMDSv2 사용을 요구할 수 있습니다.

**Topics**
+ [IMDSv2를 계정 기본값으로 설정](#set-imdsv2-account-defaults)
+ [계정 수준에서 IMDSv2 적용](#enforce-imdsv2-at-the-account-level)
+ [시작 시 인스턴스 구성](#configure-IMDS-new-instances-instance-settings)
+ [AMI 구성](#configure-IMDS-new-instances-ami-configuration)
+ [IAM 정책 사용](#configure-IMDS-new-instances-iam-policy)

### IMDSv2를 계정 기본값으로 설정
<a name="set-imdsv2-account-defaults"></a>

각 AWS 리전의 계정 수준에서 인스턴스 메타데이터 서비스(IMDS)의 기본 버전을 설정할 수 있습니다. 즉, *새* 인스턴스가 시작되면 인스턴스 메타데이터 버전이 자동으로 계정 수준 기본값으로 설정됩니다. 하지만 시작 시 또는 시작한 후에 값을 수동으로 재정의할 수 있습니다. 계정 수준 설정 및 수동 재정의가 인스턴스에 미치는 영향에 대한 자세한 내용은 [인스턴스 메타데이터 옵션의 우선순위](configuring-instance-metadata-options.md#instance-metadata-options-order-of-precedence) 섹션을 참조하세요.

**참고**  
계정 수준 기본값을 설정해도 *기존* 인스턴스는 재설정되지 않습니다. 예를 들어, 계정 수준 기본값을 IMDSv2로 설정하는 경우 IMDSv1로 설정된 기존 인스턴스는 영향을 받지 않습니다. 기존 인스턴스의 값을 변경하려면 인스턴스 자체의 값을 수동으로 변경해야 합니다.

계정의 모든 *새* 인스턴스가 필요한 IMDSv2로 시작되도록(IMDSv1은 비활성화됨) 인스턴스 메타데이터 버전의 계정 기본값을 IMDSv2로 설정할 수 있습니다. 이 계정 기본값을 사용하면 인스턴스를 시작할 때 인스턴스의 기본값은 다음과 같습니다.
+ 콘솔: **메타데이터 버전**은 **V2 전용(토큰 필요)**으로 설정되고 **메타데이터 응답 홉 제한**은 **2**로 설정됩니다.
+ AWS CLI: `HttpTokens`는 `required`로 설정되고 `HttpPutResponseHopLimit`는 `2`로 설정됩니다.

**참고**  
계정 기본값을 IMDSv2로 설정하기 전에 인스턴스가 IMDSv1에 종속되지 않았는지 확인합니다. 자세한 내용은 [IMDSv2를 요구하는 권장 경로](instance-metadata-transition-to-version-2.md#recommended-path-for-requiring-imdsv2) 섹션을 참조하세요.

------
#### [ Console ]

**IMDSv2를 지정된 리전의 계정 기본값으로 설정하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. AWS 리전을(를) 변경하려면 페이지의 오른쪽 상단 모서리에 있는 리전 선택기를 사용합니다.

1. 탐색 창에서 **대시보드**를 선택합니다.

1. **계정 속성** 카드의 **설정**에서 **데이터 보호 및 보안**을 선택합니다.

1. **IMDS 기본값** 옆에서 **관리**를 선택합니다.

1. **IMDS 기본값 관리** 페이지에서 다음을 수행합니다.

   1. **인스턴스 메타데이터 서비스**에서 **활성화됨**을 선택합니다.

   1. **메타데이터 버전(Metadata version)**에 **V2만 해당(토큰 필요)(V2 only (token required))**를 선택합니다.

   1. **메타데이터 응답 홉 제한**에서 인스턴스가 컨테이너를 호스팅하는 경우 **2**를 지정합니다. 그렇지 않으면 **기본 설정 없음**을 선택합니다. 기본 설정이 지정되지 않은 경우 AMI에 설정 `ImdsSupport: v2.0`가 있으면 기본값은 **2**이고, 그렇지 않으면 기본값은 **1**입니다.

   1. **업데이트**를 선택합니다.

------
#### [ AWS CLI ]

**IMDSv2를 지정된 리전의 계정 기본값으로 설정하는 방법**  
[modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 명령을 사용하고 IMDS 계정 수준 설정을 수정할 리전을 지정합니다. 인스턴스가 컨테이너를 호스팅할 경우 `--http-tokens`(`required`로 설정됨) 및 `--http-put-response-hop-limit`(`2`로 설정됨)를 포함합니다. 그렇지 않으면 기본 설정 없음을 표시하도록 `-1`을 지정합니다. `-1`(기본 설정 없음)이 지정된 경우 AMI에 설정 `ImdsSupport: v2.0`가 있으면 기본값은 `2`이고, 그렇지 않으면 기본값은 `1`입니다.

```
aws ec2 modify-instance-metadata-defaults \
    --region us-east-1 \
    --http-tokens required \
    --http-put-response-hop-limit 2
```

다음은 예제 출력입니다.

```
{
    "Return": true
}
```

**지정된 리전의 인스턴스 메타데이터 옵션에 대한 기본 계정 설정을 보려면**  
[get-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-metadata-defaults.html) 명령을 사용하고 리전을 지정합니다.

```
aws ec2 get-instance-metadata-defaults --region us-east-1
```

다음은 예제 출력입니다.

```
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpPutResponseHopLimit": 2
    },
    "ManagedBy": "account"
}
```

`ManagedBy` 필드는 설정을 구성한 엔터티를 나타냅니다. 이 예제의 `account`는 해당 설정이 계정에서 직접 구성되었음을 나타냅니다. 값이 `declarative-policy`이면 설정이 선언적 정책에 의해 구성되었음을 의미합니다. 자세한 내용은 *AWS Organizations 사용 설명서*의 [선언적 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)을 참조하세요.

**IMDSv2를 모든 리전의 계정 기본값으로 설정하려면**  
[modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 명령을 사용하여 모든 리전의 IMDS 계정 수준 설정을 수정합니다. 인스턴스가 컨테이너를 호스팅할 경우 `--http-tokens`(`required`로 설정됨) 및 `--http-put-response-hop-limit`(`2`로 설정됨)를 포함합니다. 그렇지 않으면 기본 설정 없음을 표시하도록 `-1`을 지정합니다. `-1`(기본 설정 없음)이 지정된 경우 AMI에 설정 `ImdsSupport: v2.0`가 있으면 기본값은 `2`이고, 그렇지 않으면 기본값은 `1`입니다.

```
echo -e "Region          \t Modified" ; \
echo -e "--------------  \t ---------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 modify-instance-metadata-defaults \
            --region $region \
            --http-tokens required \
            --http-put-response-hop-limit 2 \
            --output text)
        echo -e "$region        \t $output"
    );
done
```

다음은 예제 출력입니다.

```
Region                   Modified
--------------           ---------
ap-south-1               True
eu-north-1               True
eu-west-3                True
...
```

**모든 리전의 인스턴스 메타데이터 옵션에 대한 기본 계정 설정을 보려면**  
[get-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-metadata-defaults.html) 명령을 사용합니다.

```
echo -e "Region   \t Level          Hops    HttpTokens" ; \
echo -e "-------------- \t ------------   ----    ----------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 get-instance-metadata-defaults \
            --region $region \
            --output text)
        echo -e "$region \t $output" 
    );
done
```

다음은 예제 출력입니다.

```
Region           Level          Hops    HttpTokens
--------------   ------------   ----    ----------
ap-south-1       ACCOUNTLEVEL   2       required
eu-north-1       ACCOUNTLEVEL   2       required
eu-west-3        ACCOUNTLEVEL   2       required
...
```

------
#### [ PowerShell ]

**IMDSv2를 지정된 리전의 계정 기본값으로 설정하려면**  
[Edit-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataDefault.html) cmdlet을 사용하고 IMDS 계정 수준 설정을 수정할 리전을 지정합니다. 인스턴스가 컨테이너를 호스팅할 경우 `-HttpToken`(`required`로 설정됨) 및 `-HttpPutResponseHopLimit`(`2`로 설정됨)를 포함합니다. 그렇지 않으면 기본 설정 없음을 표시하도록 `-1`을 지정합니다. `-1`(기본 설정 없음)이 지정된 경우 AMI에 설정 `ImdsSupport: v2.0`가 있으면 기본값은 `2`이고, 그렇지 않으면 기본값은 `1`입니다.

```
Edit-EC2InstanceMetadataDefault `
    -Region us-east-1 `
    -HttpToken required `
    -HttpPutResponseHopLimit 2
```

다음은 예제 출력입니다.

```
True
```

**지정된 리전의 인스턴스 메타데이터 옵션에 대한 기본 계정 설정을 보려면**  
[Get-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceMetadataDefault.html) cmdlet을 사용하고 리전을 지정합니다.

```
Get-EC2InstanceMetadataDefault -Region us-east-1 | Format-List
```

다음은 예제 출력입니다.

```
HttpEndpoint            : 
HttpPutResponseHopLimit : 2
HttpTokens              : required
InstanceMetadataTags    :
```

**IMDSv2를 모든 리전의 계정 기본값으로 설정하려면 다음을 수행하세요.**  
[Edit-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataDefault.html) cmdlet을 사용하여 모든 리전의 IMDS 계정 수준 설정을 수정합니다. 인스턴스가 컨테이너를 호스팅할 경우 `-HttpToken`(`required`로 설정됨) 및 `-HttpPutResponseHopLimit`(`2`로 설정됨)를 포함합니다. 그렇지 않으면 기본 설정 없음을 표시하도록 `-1`을 지정합니다. `-1`(기본 설정 없음)이 지정된 경우 AMI에 설정 `ImdsSupport: v2.0`가 있으면 기본값은 `2`이고, 그렇지 않으면 기본값은 `1`입니다.

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region   = $_
        Modified = (Edit-EC2InstanceMetadataDefault `
                -Region $_ `
                -HttpToken required `
                -HttpPutResponseHopLimit 2)
    } 
} | `
Format-Table Region, Modified -AutoSize
```

예상 결과

```
Region         Modified
------         --------
ap-south-1         True
eu-north-1         True
eu-west-3          True
...
```

**모든 리전의 인스턴스 메타데이터 옵션에 대한 기본 계정 설정을 보려면 다음을 수행하세요.**  
[Get-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceMetadataDefault.html) cmdlet을 사용합니다.

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region = $_
        HttpPutResponseHopLimit = (Get-EC2InstanceMetadataDefault -Region $_).HttpPutResponseHopLimit
        HttpTokens              = (Get-EC2InstanceMetadataDefault -Region $_).HttpTokens
    }
} | `
Format-Table -AutoSize
```

 출력 예시

```
Region         HttpPutResponseHopLimit HttpTokens
------         ----------------------- ----------
ap-south-1                           2 required
eu-north-1                           2 required
eu-west-3                            2 required                    
...
```

------

### 계정 수준에서 IMDSv2 적용
<a name="enforce-imdsv2-at-the-account-level"></a>

각 AWS 리전에 대해 계정 수준에서 IMDSv2 사용을 적용할 수 있습니다. 적용되면 인스턴스가 IMDSv2를 요구하도록 구성된 경우에만 인스턴스를 시작할 수 있습니다. 이는 인스턴스 또는 AMI 구성 방식에 관계없이 적용됩니다.

**참고**  
계정 수준에서 IMDSv2 적용을 활성화하기 전에 애플리케이션과 AMI가 IMDSv2를 지원하는지 확인합니다. 자세한 내용은 [IMDSv2를 요구하는 권장 경로](instance-metadata-transition-to-version-2.md#recommended-path-for-requiring-imdsv2) 섹션을 참조하세요. IMDSv2 적용이 활성화되어 있고 시작 시 인스턴스 구성, 계정 설정 또는 AMI 구성에서 `httpTokens`가 `required`로 설정되지 않은 경우 인스턴스 시작이 실패합니다. 문제 해결 정보는 [IMDSv1이 활성화된 인스턴스 시작 실패](troubleshooting-launch.md#launching-an-imdsv1-enabled-instance-fails)를 참조하세요.

**참고**  
이 설정은 기존 인스턴스의 IMDS 버전을 변경하지 않지만 현재 IMDSv1이 비활성화된 기존 인스턴스에서 IMDSv1을 활성화하는 것을 차단합니다.

------
#### [ Console ]

**지정된 리전의 계정에 대해 IMDSv2를 적용하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. AWS 리전을 변경하려면 페이지의 오른쪽 상단 모서리에 있는 리전 선택기를 사용합니다.

1. 탐색 창에서 **대시보드**를 선택합니다.

1. **계정 속성** 카드의 **설정**에서 **데이터 보호 및 보안**을 선택합니다.

1. **IMDS 기본값** 옆에서 **관리**를 선택합니다.

1. **IMDS 기본값 관리** 페이지에서 다음을 수행합니다.

   1. **메타데이터 버전(Metadata version)**에 **V2만 해당(토큰 필요)(V2 only (token required))**를 선택합니다.

   1. **IMDSv2 적용**에서 **활성화됨**을 선택합니다.

   1. **업데이트**를 선택합니다.

------
#### [ AWS CLI ]

**지정된 리전의 계정에 대해 IMDSv2를 적용하려면 다음을 수행하세요.**  
 [modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 명령을 사용하고 IIMDSv2를 적용할 리전을 지정합니다.

```
aws ec2 modify-instance-metadata-defaults \
    --region us-east-1 \
    --http-tokens required \
    --http-tokens-enforced enabled
```

다음은 예제 출력입니다.

```
{
"Return": true
}
```

**특정 리전의 계정에 대한 IMDSv2 적용 설정을 보려면 다음을 수행하세요.**  
[get-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-metadata-defaults.html) 명령을 사용하고 리전을 지정합니다.

```
aws ec2 get-instance-metadata-defaults --region us-east-1
```

다음은 예제 출력입니다.

```
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpTokensEnforced": "enabled"
    },
    "ManagedBy": "account"
}
```

`ManagedBy` 필드는 설정을 구성한 엔터티를 나타냅니다. 이 예제의 `account`는 해당 설정이 계정에서 직접 구성되었음을 나타냅니다. 값이 `declarative-policy`이면 설정이 선언적 정책에 의해 구성되었음을 의미합니다. 자세한 내용은 *AWS Organizations 사용 설명서*의 [선언적 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)을 참조하세요.

**모든 리전의 계정에 대해 IMDSv2를 적용하려면 다음을 수행하세요.**  
[modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 명령을 사용하여 모든 리전에서 IMDSv2를 적용합니다.

```
echo -e "Region          \t Modified" ; \
echo -e "--------------  \t ---------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 modify-instance-metadata-defaults \
            --region $region \
            --http-tokens-enforced enabled \
            --output text)
        echo -e "$region        \t $output"
    );
done
```

다음은 예제 출력입니다.

```
Region                   Modified
--------------           ---------
ap-south-1               True
eu-north-1               True
eu-west-3                True
...
```

**모든 리전의 계정에 대한 IMDSv2 적용 설정을 보려면 다음을 수행하세요.**  
[get-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-metadata-defaults.html) 명령을 사용합니다.

```
echo -e "Region   \t Level           HttpTokensEnforced" ; \
echo -e "-------------- \t ------------   ----------------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 get-instance-metadata-defaults \
            --region $region \
            --query 'AccountLevel.HttpTokensEnforced' \           
            --output text)
        echo -e "$region \t ACCOUNTLEVEL $output" 
    );
done
```

다음은 예제 출력입니다.

```
Region           Level          HttpTokensEnforced
--------------   ------------   ------------------
ap-south-1       ACCOUNTLEVEL   enabled
eu-north-1       ACCOUNTLEVEL   enabled
eu-west-3        ACCOUNTLEVEL   enabled
...
```

------
#### [ PowerShell ]

**지정된 리전의 계정에 대해 IMDSv2를 적용하려면 다음을 수행하세요.**  
[Edit-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataDefault.html) cmdlet을 사용하고 IMDSv2를 적용할 리전을 지정합니다.

```
Edit-EC2InstanceMetadataDefault `
    -Region us-east-1 `
    -HttpToken required `
    -HttpPutResponseHopLimit 2
```

다음은 예제 출력입니다.

```
@{
    Return = $true
}
```

**특정 리전의 계정에 대한 IMDSv2 적용 설정을 보려면 다음을 수행하세요.**  
Get-EC2InstanceMetadataDefault 명령을 사용하고 리전을 지정합니다.

```
Get-EC2InstanceMetadataDefault -Region us-east-1
```

다음은 예제 출력입니다.

```
@{
    AccountLevel = @{
        HttpTokens = "required"
        HttpTokensEnforced = "enabled"
    }
    ManagedBy = "account"
}
```

`ManagedBy` 필드는 설정을 구성한 엔터티를 나타냅니다. 이 예제의 `account`는 해당 설정이 계정에서 직접 구성되었음을 나타냅니다. 값이 `declarative-policy`이면 설정이 선언적 정책에 의해 구성되었음을 의미합니다. 자세한 내용은 *AWS Organizations 사용 설명서*의 [선언적 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)을 참조하세요.

**모든 리전의 계정에 대해 IMDSv2를 적용하려면 다음을 수행하세요.**  
[modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 명령을 사용하여 모든 리전에서 IMDSv2를 적용합니다.

```
echo -e "Region          \t Modified" ; \
echo -e "--------------  \t ---------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 modify-instance-metadata-defaults \
            --region $region \
            --http-tokens-enforced enabled \
            --output text)
        echo -e "$region        \t $output"
    );
done
```

다음은 예제 출력입니다.

```
Region                   Modified
--------------           ---------
ap-south-1               True
eu-north-1               True
eu-west-3                True
...
```

**IMDSv2를 모든 리전의 계정 기본값으로 설정하려면 다음을 수행하세요.**  
[Edit-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataDefault.html) cmdlet을 사용하여 모든 리전의 IMDS 계정 수준 설정을 수정합니다. 인스턴스가 컨테이너를 호스팅할 경우 `-HttpToken`(`required`로 설정됨) 및 `-HttpPutResponseHopLimit`(`2`로 설정됨)를 포함합니다. 그렇지 않으면 기본 설정 없음을 표시하도록 `-1`을 지정합니다. `-1`(기본 설정 없음)이 지정된 경우 AMI에 설정 `ImdsSupport: v2.0`가 있으면 기본값은 `2`이고, 그렇지 않으면 기본값은 `1`입니다.

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region   = $_
        Modified = (Edit-EC2InstanceMetadataDefault `
                -Region $_ `
                -HttpToken required `
                -HttpPutResponseHopLimit 2)
    } 
} | `
Format-Table Region, Modified -AutoSize
```

예상 결과

```
Region         Modified
------         --------
ap-south-1         True
eu-north-1         True
eu-west-3          True
...
```

**모든 리전의 인스턴스 메타데이터 옵션에 대한 기본 계정 설정을 보려면 다음을 수행하세요.**  
[Get-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceMetadataDefault.html) cmdlet을 사용합니다.

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region = $_
        HttpPutResponseHopLimit = (Get-EC2InstanceMetadataDefault -Region $_).HttpPutResponseHopLimit
        HttpTokens              = (Get-EC2InstanceMetadataDefault -Region $_).HttpTokens
    }
} | `
Format-Table -AutoSize
```

 출력 예시

```
Region         HttpPutResponseHopLimit HttpTokens
------         ----------------------- ----------
ap-south-1                           2 required
eu-north-1                           2 required
eu-west-3                            2 required                    
...
```

------

### 시작 시 인스턴스 구성
<a name="configure-IMDS-new-instances-instance-settings"></a>

[인스턴스를 시작](ec2-launch-instance-wizard.md)할 때 다음 필드를 구성하여 IMDSv2를 사용하도록 인스턴스를 구성할 수 있습니다.
+ Amazon EC2 콘솔: **Metadata version**(메타데이터 버전)을 **V2 only (token required)**(V2 전용(토큰 필요))로 설정합니다.
+ AWS CLI: `HttpTokens`를 `required`로 설정합니다.

IMDSv2를 사용하도록 지정하면 **메타데이터 액세스 가능**을 **활성화됨**(콘솔)로 설정하거나 `HttpEndpoint`를 `enabled`(AWS CLI)로 설정하여 인스턴스 메타데이터 서비스(IMDS) 엔드포인트도 활성화해야 합니다.

컨테이너 환경에서는 IMDSv2가 필요한 경우 홉 제한을 `2`로 설정하는 것이 좋습니다. 자세한 내용은 [인스턴스 메타데이터 액세스 고려 사항](instancedata-data-retrieval.md#imds-considerations) 섹션을 참조하세요.

------
#### [ Console ]

**새 인스턴스에서 IMDSv2를 사용해야 하도록 설정하려면**
+ Amazon EC2 콘솔에서 새 인스턴스를 시작할 때 **고급 세부 정보**를 확장하고 다음을 수행합니다.
  + **액세스 가능한 메타데이터(Metadata accessible)**에 **활성화(Enabled)**를 선택합니다.
  + **메타데이터 버전(Metadata version)**에 **V2만 해당(토큰 필요)(V2 only (token required))**를 선택합니다.
  + (컨테이너 환경) **메타데이터 응답 홉 제한**의 경우 **2**를 선택합니다.

  자세한 내용은 [고급 세부 정보](ec2-instance-launch-parameters.md#liw-advanced-details) 섹션을 참조하세요.

------
#### [ AWS CLI ]

**새 인스턴스에서 IMDSv2를 사용해야 하도록 설정하려면**  
다음 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 예에서는 `c6i.large`를 `--metadata-options`로 설정하여 `HttpTokens=required` 인스턴스를 시작합니다. 또한 `HttpTokens`의 값을 지정할 때 `HttpEndpoint`를 `enabled`로 설정해야 합니다. 메타데이터 검색 요청에 대해 보안 토큰 헤더가 `required`로 설정되어 있으므로 인스턴스 메타데이터를 요청할 때 인스턴스가 IMDSv2를 사용해야 합니다.

컨테이너 환경에서는 IMDSv2가 필요한 경우 `HttpPutResponseHopLimit=2`를 사용하여 홉 제한을 `2`로 설정하는 것이 좋습니다.

```
aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --instance-type c6i.large \
	...
    --metadata-options "HttpEndpoint=enabled,HttpTokens=required,HttpPutResponseHopLimit=2"
```

------
#### [ PowerShell ]

**새 인스턴스에서 IMDSv2를 사용해야 하도록 설정하려면**  
다음 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 예제는 `MetadataOptions_HttpEndpoint`를 `enabled`로 설정하고 `MetadataOptions_HttpTokens` 파라미터를 `required`로 설정하여 `c6i.large` 인스턴스를 시작합니다. 또한 `HttpTokens`의 값을 지정할 때 `HttpEndpoint`를 `enabled`로 설정해야 합니다. 메타데이터 검색 요청에 대해 보안 토큰 헤더가 `required`로 설정되어 있으므로 인스턴스 메타데이터를 요청할 때 인스턴스가 IMDSv2를 사용해야 합니다.

```
New-EC2Instance `
    -ImageId ami-0abcdef1234567890 `
    -InstanceType c6i.large `
    -MetadataOptions_HttpEndpoint enabled `
    -MetadataOptions_HttpTokens required
```

------
#### [ CloudFormation ]

CloudFormation을 사용하여 인스턴스에 대한 메타데이터 옵션을 지정하려면 [AWS CloudFormation 사용 설명서](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html)의 *AWS::EC2::LaunchTemplate MetadataOptions* 속성을 참조하세요.

------

### AMI 구성
<a name="configure-IMDS-new-instances-ami-configuration"></a>

새 AMI를 등록하거나 기존 AMI를 수정할 때 `imds-support` 파라미터를 `v2.0`로 설정할 수 있습니다. 이 AMI에서 시작된 인스턴스에 대해 **메타데이터 버전**은 **V2 전용(토큰 필요)**(콘솔)으로 설정되거나 `HttpTokens`가 `required`(AWS CLI)로 설정됩니다. 이러한 설정을 사용하면 인스턴스에서 인스턴스 메타데이터를 요청할 때 IMDSv2를 사용하도록 지정됩니다.

`imds-support`를 `v2.0`으로 설정하면 이 AMI에서 시작된 인스턴스의 **Metadata response hop limit**(메타데이터 응답 홉 제한)(콘솔) 또는 `http-put-response-hop-limit`(AWS CLI)도 **2**로 설정됩니다.

**중요**  
AMI 소프트웨어가 IMDSv2를 지원하지 않는 한 이 파라미터를 사용하지 마세요. 값을 `v2.0`으로 설정한 후에는 이를 실행 취소할 수 없습니다. AMI를 “재설정”하는 유일한 방법은 기본 스냅샷에 새 AMI를 생성하는 것입니다.

**IMDSv2를 위해 새 AMI를 구성하려면**  
다음 방법 중 하나를 사용하여 IMDSv2에 대한 새 AMI를 구성합니다.

------
#### [ AWS CLI ]

다음 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 예제는 EBS 루트 볼륨의 지정된 스냅샷을 디바이스 `/dev/xvda`로 사용하여 AMI를 등록합니다. 이 AMI에서 시작된 인스턴스가 인스턴스 메타데이터를 요청할 때 IMDSv2를 사용하도록 `imds-support` 파라미터를 `v2.0`으로 지정합니다.

```
aws ec2 register-image \
    --name my-image \
    --root-device-name /dev/xvda \
    --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0123456789example} \
    --architecture x86_64 \
    --imds-support v2.0
```

------
#### [ PowerShell ]

다음 [Register-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) cmdlet 예제는 EBS 루트 볼륨의 지정된 스냅샷을 디바이스 `/dev/xvda`로 사용하여 AMI를 등록합니다. 이 AMI에서 시작된 인스턴스가 인스턴스 메타데이터를 요청할 때 IMDSv2를 사용하도록 `ImdsSupport` 파라미터를 `v2.0`으로 지정합니다.

```
Register-EC2Image `
    -Name 'my-image' `
    -RootDeviceName /dev/xvda `
    -BlockDeviceMapping  ( 
    New-Object `
        -TypeName Amazon.EC2.Model.BlockDeviceMapping `
        -Property @{ 
        DeviceName = '/dev/xvda'; 
        EBS        = (New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice -Property @{ 
                SnapshotId = 'snap-0123456789example'
                VolumeType = 'gp3' 
                } )      
        }  ) `
    -Architecture X86_64 `
    -ImdsSupport v2.0
```

------

**IMDSv2를 위해 기존 AMI를 구성하려면**  
다음 방법 중 하나를 사용하여 IMDSv2용 기존 AMI를 구성합니다.

------
#### [ AWS CLI ]

다음 [modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) 예제는 IMDSv2에 대해서만 기존 AMI를 수정합니다. 이 AMI에서 시작된 인스턴스가 인스턴스 메타데이터를 요청할 때 IMDSv2를 사용하도록 `imds-support` 파라미터를 `v2.0`으로 지정합니다.

```
aws ec2 modify-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --imds-support v2.0
```

------
#### [ PowerShell ]

다음 [Edit-EC2ImageAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html) cmdlet 예제는 IMDSv2에 대해서만 기존 AMI를 수정합니다. 이 AMI에서 시작된 인스턴스가 인스턴스 메타데이터를 요청할 때 IMDSv2를 사용하도록 `imds-support` 파라미터를 `v2.0`으로 지정합니다.

```
Edit-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -ImdsSupport 'v2.0'
```

------

### IAM 정책 사용
<a name="configure-IMDS-new-instances-iam-policy"></a>

다음 중 하나를 수행하는 IAM 정책을 생성할 수 있습니다.
+ 새 인스턴스에 IMDSv2가 필요하지 않은 경우 사용자가 새 인스턴스를 시작하지 못하게 합니다.
+ 사용자가 ModifyInstanceMetadataOptions API를 직접적으로 호출하여 실행 중인 인스턴스의 메타데이터 옵션을 변경하지 못하게 합니다. ModifyInstanceMetadataOptions httpTokens 속성에 대한 액세스를 제한하여 실행 중인 인스턴스의 의도하지 않은 업데이트를 방지합니다.
+ 사용자가 ModifyInstanceMetadataDefaults API를 직접적으로 호출하여 httpTokens와 httpTokensEnforced의 계정 기본 설정을 변경하지 못하게 합니다. 이 두 속성에 대한 액세스를 제한하면 권한 있는 역할만 계정 기본값을 수정할 수 있습니다.

**IAM 정책을 사용하여 모든 새 인스턴스에서 IMDSv2를 사용해야 하도록 설정하려면**  
사용자가 인스턴스 메타데이터를 요청할 때 IMDSv2 사용을 요구하는 인스턴스만 시작할 수 있도록 하려면 다음을 수행하세요.
+ `ModifyInstanceMetadataOptions` 및 `ModifyInstanceMetadataDefaults` API, 특히 `httpTokens` 및 `httpTokensEnforced` 속성에 대한 액세스를 제한합니다.
+ 그런 다음 계정 기본값을 `httpTokens = required`와 `httpTokensEnforced = enabled`로 설정합니다.

  IAM 정책 예제는 [인스턴스 메타데이터 작업](ExamplePolicies_EC2.md#iam-example-instance-metadata) 섹션을 참조하세요.

## IMDS IPv4 및 IPv6 엔드포인트 활성화
<a name="configure-IMDS-new-instances-ipv4-ipv6-endpoints"></a>

IMDS에는 인스턴스에 IPv4(`169.254.169.254`) 및 IPv6(`[fd00:ec2::254]`)이라는 두 개의 엔드포인트가 있습니다. IMDS를 활성화하면 IPv4 엔드포인트가 자동으로 활성화됩니다. IPv6 전용 서브넷으로 인스턴스를 시작하는 경우에도 IPv6 엔드포인트는 비활성화된 상태로 유지됩니다. IPv6 엔드포인트를 활성화하려면 명시적으로 활성화해야 합니다. IPv6 엔드포인트가 활성화되면 IPv4 엔드포인트는 활성화된 상태로 유지됩니다.

인스턴스 시작 시 또는 이후에 IPv6 엔드포인트를 활성화할 수 있습니다.

**IPv6 엔드포인트 활성화 요구**
+ 선택한 인스턴스 유형은 [Nitro 기반 인스턴스](instance-types.md#instance-hypervisor-type)입니다.
+ 선택한 서브넷은 IPv6를 지원합니다. 여기서 서브넷은 [이중 스택 또는 IPv6 전용](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)입니다.

다음 방법 중 하나를 사용하여 IMDS IPv6 엔드포인트가 활성화된 상태로 인스턴스를 시작합니다.

------
#### [ Console ]

**인스턴스 시작 시 IMDS IPv6 엔드포인트를 활성화하려면**
+ **Advanced details**(고급 세부 정보)에서 다음을 지정하여 Amazon EC2 콘솔에서 [인스턴스를 시작](ec2-launch-instance-wizard.md)합니다.
  + **메타데이터 IPv6 엔드포인트**에 대해 **활성화됨**을 선택합니다.

자세한 내용은 [고급 세부 정보](ec2-instance-launch-parameters.md#liw-advanced-details) 섹션을 참조하세요.

------
#### [ AWS CLI ]

**인스턴스 시작 시 IMDS IPv6 엔드포인트를 활성화하는 방법**  
다음 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 예제는 IMDS에 대해 활성화된 IPv6 엔드포인트로 `c6i.large` 인스턴스를 시작합니다. IPv6 엔드포인트를 활성화하려면 `--metadata-options` 파라미터에 대해 `HttpProtocolIpv6=enabled`를 지정합니다. 또한 `HttpProtocolIpv6`의 값을 지정할 때 `HttpEndpoint`를 `enabled`로 설정해야 합니다.

```
aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --instance-type c6i.large \
    ...
    --metadata-options "HttpEndpoint=enabled,HttpProtocolIpv6=enabled"
```

------
#### [ PowerShell ]

**인스턴스 시작 시 IMDS IPv6 엔드포인트를 활성화하는 방법**  
다음 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 예제는 IMDS에 대해 활성화된 IPv6 엔드포인트로 `c6i.large` 인스턴스를 시작합니다. IPv6 엔드포인트를 활성화하려면 `MetadataOptions_HttpProtocolIpv6`를 `enabled`로 지정합니다. 또한 `MetadataOptions_HttpProtocolIpv6`의 값을 지정할 때 `MetadataOptions_HttpEndpoint`를 `enabled`로 설정해야 합니다.

```
New-EC2Instance `
    -ImageId ami-0abcdef1234567890 `
    -InstanceType c6i.large `
    -MetadataOptions_HttpEndpoint enabled `
    -MetadataOptions_HttpProtocolIpv6 enabled
```

------

## 인스턴스 메타데이터에 대한 액세스 비활성화
<a name="configure-IMDS-new-instances--turn-off-instance-metadata"></a>

인스턴스를 시작할 때 IMDS를 비활성화하여 인스턴스 메타데이터에 대한 액세스를 끌 수 있습니다. 나중에 IMDS를 다시 활성화하여 액세스를 켤 수 있습니다. 자세한 내용은 [인스턴스 메타데이터에 대한 액세스 활성화](configuring-IMDS-existing-instances.md#enable-instance-metadata-on-existing-instances) 섹션을 참조하세요.

**중요**  
시작 시 또는 시작한 후에 IMDS를 비활성할 수 있습니다. **시작 시 IMDS를 비활성화하면 다음 사항이 작동하지 않을 수 있습니다.  
인스턴스에 대한 SSH 액세스 권한이 없을 수 있습니다. 인스턴스의 퍼블릭 SSH 키인 `public-keys/0/openssh-key`는 일반적으로 키가 제공되고 EC2 인스턴스 메타데이터에서 액세스되기 때문에 액세스할 수 없습니다.
EC2 사용자 데이터는 사용할 수 없으며 인스턴스 시작 시 실행되지 않습니다. EC2 사용자 데이터는 IMDS에서 호스팅됩니다. IMDS를 비활성화하면 사용자 데이터에 대한 액세스가 사실상 꺼집니다.
이 기능을 사용하려면, 시작 후 IMDS를 다시 활성화할 수 있습니다.

------
#### [ Console ]

**시작 시 인스턴스 메타데이터에 대한 액세스를 끄려면**
+ **Advanced details**(고급 세부 정보)에서 다음을 지정하여 Amazon EC2 콘솔에서 [인스턴스를 시작](ec2-launch-instance-wizard.md)합니다.
  + **액세스 가능한 메타데이터(Metadata accessible)**에 **비활성화(Disabled)**를 선택합니다.

자세한 내용은 [고급 세부 정보](ec2-instance-launch-parameters.md#liw-advanced-details) 섹션을 참조하세요.

------
#### [ AWS CLI ]

**시작 시 인스턴스 메타데이터에 대한 액세스를 끄려면**  
`--metadata-options`를 `HttpEndpoint=disabled`로 설정하여 인스턴스를 시작합니다.

```
aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --instance-type c6i.large \
    ... 
    --metadata-options "HttpEndpoint=disabled"
```

------
#### [ PowerShell ]

**시작 시 인스턴스 메타데이터에 대한 액세스를 끄려면**  
다음 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 예제는 `MetadataOptions_HttpEndpoint`를 `disabled`로 설정하여 인스턴스를 시작합니다.

```
New-EC2Instance `
    -ImageId ami-0abcdef1234567890 `
    -InstanceType c6i.large `
    -MetadataOptions_HttpEndpoint disabled
```

------
#### [ CloudFormation ]

CloudFormation을 사용하여 인스턴스에 대한 메타데이터 옵션을 지정하려면 [CloudFormation 사용 설명서](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html)의 *AWS::EC2::LaunchTemplate MetadataOptions* 속성을 참조하세요.

------

## 인스턴스 메타데이터의 태그에 대한 액세스 허용
<a name="configure-IMDS-new-instances-tags-in-instance-metadata"></a>

기본적으로 인스턴스 태그는 인스턴스 메타데이터에서 액세스할 수 없습니다. 각 인스턴스에 대해 명시적으로 액세스를 허용해야 합니다. 액세스가 허용되면 인스턴스 태그 *키*는 특정 문자 제한을 준수해야 합니다. 그렇지 않으면 인스턴스 시작이 실패합니다. 자세한 내용은 [인스턴스 메타데이터에서 태그에 대한 액세스 활성화](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS) 섹션을 참조하세요.

# 기존 인스턴스에 대한 인스턴스 메타데이터 옵션 수정
<a name="configuring-IMDS-existing-instances"></a>

기존 인스턴스에 대한 인스턴스 메타데이터 옵션을 수정할 수 있습니다.

사용자가 기존 인스턴스의 인스턴스 메타데이터 옵션을 수정하지 못하도록 하는 IAM 정책을 생성할 수도 있습니다. 인스턴스 메타데이터 옵션을 수정할 수 있는 사용자를 제어하려면 지정된 역할을 가진 사용자 이외의 모든 사용자가 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API를 사용하지 못하게 하는 정책을 지정합니다. IAM 정책 예제는 [인스턴스 메타데이터 작업](ExamplePolicies_EC2.md#iam-example-instance-metadata) 섹션을 참조하세요.

**참고**  
선언적 정책을 사용하여 인스턴스 메타데이터 옵션을 구성한 경우 계정 내에서 직접 수정할 수 없습니다. 자세한 내용은 *AWS Organizations 사용 설명서*의 [선언적 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)을 참조하세요.

## IMDSv2의 사용 요구
<a name="modify-require-IMDSv2"></a>

인스턴스 메타데이터를 요청할 때 IMDSv2를 사용하도록 하려면 다음 방법 중 하나를 사용하여 기존 인스턴스의 인스턴스 메타데이터 옵션을 수정합니다. IMDSv2가 필요한 경우 IMDSv1을 사용할 수 없습니다.

**참고**  
IMDSv2를 사용하도록 요구하기 전에 인스턴스가 IMDSv1을 직접 호출하지 않는지 확인합니다. `MetadataNoToken` CloudWatch 지표는 IMDSv1 직접 호출을 추적합니다. `MetadataNoToken`에서 인스턴스의 IMDSv1 사용량을 0으로 기록하면 해당 인스턴스에서 IMDSv2를 요구할 준비가 된 것입니다.

------
#### [ Console ]

**기존 인스턴스에서 IMDSv2를 사용해야 하도록 설정하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

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

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

1. **인스턴스 메타데이터 옵션 수정** 대화 상자에서 다음을 수행합니다.

   1. **인스턴스 메타데이터 서비스**에서 **활성화**를 선택합니다.

   1. **IMDSv2**의 경우 **필수**를 선택합니다.

   1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

**기존 인스턴스에서 IMDSv2를 사용해야 하도록 설정하려면**  
[modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 명령을 사용하고 `http-tokens` 파라미터를 `required`로 설정합니다. 또한 `http-tokens`의 값을 지정할 때 `http-endpoint`를 `enabled`로 설정해야 합니다.

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-tokens required \
    --http-endpoint enabled
```

------
#### [ PowerShell ]

**기존 인스턴스에서 IMDSv2를 사용해야 하도록 설정하려면**  
[Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet을 사용하고 `HttpTokens` 파라미터를 `required`로 설정합니다. 또한 `HttpTokens`의 값을 지정할 때 `HttpEndpoint`를 `enabled`로 설정해야 합니다.

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpTokens required `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## IMDSv1 사용 복원
<a name="modify-restore-IMDSv1"></a>

인스턴스에서 IMDSv2가 요구되는 경우 IMDSv1 요청을 사용하면 실패합니다. IMDSv2가 선택 사항인 경우 IMDSv2와 IMDSv1이 모두 작동합니다. 따라서 IMDSv1을 복원하려면 다음 방법 중 하나를 사용하여 IMDSv2를 optional(`httpTokens = optional`)로 설정합니다.

또한 `httpTokensEnforced` IMDS 속성은 기존 인스턴스에서 IMDSv1을 활성화하려는 시도를 방지합니다. 리전의 계정에 대해 활성화된 경우 `httpTokens`를 `optional`로 설정하려고 하면 `UnsupportedOperation` 예외가 발생합니다. 자세한 내용은 [문제 해결](#troubleshoot-modifying-an-imdsv1-enabled-instance-fails)을 참조하세요.

**중요**  
IMDSv2 적용으로 인해 인스턴스 시작이 실패하는 경우 시작을 성공시키기 위한 두 가지 옵션이 있습니다.  
**IMDSv2 전용으로 인스턴스 시작** - 인스턴스에서 실행되는 소프트웨어가 IMDSv2만 사용하는 경우(IMDSv1에 대한 종속성 없음) IMDSv2 전용으로 인스턴스를 시작할 수 있습니다. 이렇게 하려면 시작 파라미터 또는 리전의 계정에 대한 메타데이터 기본값에서 `httpTokens = required`를 설정하여 IMDSv2만 구성합니다.
**적용 비활성화** - 소프트웨어가 여전히 IMDSv1에 종속되는 경우 리전의 계정에 대해 `httpTokensEnforced`를 `disabled`로 설정합니다. 자세한 내용은 [계정 수준에서 IMDSv2 적용](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level) 섹션을 참조하세요.

------
#### [ Console ]

**인스턴스에서 IMDSv1 사용을 복원하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

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

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

1. **인스턴스 메타데이터 옵션 수정** 대화 상자에서 다음을 수행합니다.

   1. **인스턴스 메타데이터 서비스**의 경우 **활성화**가 선택되어 있는지 확인합니다.

   1. **IMDSv2**의 경우 **선택 사항**을 선택합니다.

   1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

**인스턴스에서 IMDSv1 사용을 복원하려면**  
인스턴스 메타데이터를 요청할 때 `http-tokens`가 `optional`로 설정된 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI를 사용하여 IMDSv1의 사용을 복원할 수 있습니다.

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-tokens optional \
    --http-endpoint enabled
```

------
#### [ PowerShell ]

**인스턴스에서 IMDSv1 사용을 복원하려면**  
[Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet을 사용하되 `HttpTokens`를 `optional`로 설정하여 인스턴스 메타데이터를 요청할 때 IMDSv1 사용을 복원할 수 있습니다.

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpTokens optional `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## PUT 응답 홉 제한 변경
<a name="modify-PUT-response-hop-limit"></a>

기존 인스턴스의 경우 `PUT` 응답 홉 제한에 대한 설정을 변경할 수 있습니다.

현재는 AWS CLI 및 AWS SDK만 PUT 응답 홉 제한 변경을 지원합니다.

------
#### [ AWS CLI ]

**PUT 응답 홉 제한을 변경하려면**  
[modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 명령을 사용하고 `http-put-response-hop-limit` 파라미터를 필요한 홉 수로 설정합니다. 다음 예제에서는 옵 제한이 `3`으로 설정됩니다. 또한 `http-put-response-hop-limit`의 값을 지정할 때 `http-endpoint`를 `enabled`로 설정해야 합니다.

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-put-response-hop-limit 3 \
    --http-endpoint enabled
```

------
#### [ PowerShell ]

**PUT 응답 홉 제한을 변경하려면**  
[Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet을 사용하고 `HttpPutResponseHopLimit` 파라미터를 필요한 홉 수로 설정합니다. 다음 예제에서는 옵 제한이 `3`으로 설정됩니다. 또한 `HttpPutResponseHopLimit`의 값을 지정할 때 `HttpEndpoint`를 `enabled`로 설정해야 합니다.

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpPutResponseHopLimit 3 `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## IMDS IPv4 및 IPv6 엔드포인트 활성화
<a name="enable-ipv6-endpoint-for-existing-instances"></a>

IMDS에는 인스턴스에 IPv4(`169.254.169.254`) 및 IPv6(`[fd00:ec2::254]`)이라는 두 개의 엔드포인트가 있습니다. IMDS를 활성화하면 IPv4 엔드포인트가 자동으로 활성화됩니다. IPv6 전용 서브넷으로 인스턴스를 시작하는 경우에도 IPv6 엔드포인트는 비활성화된 상태로 유지됩니다. IPv6 엔드포인트를 활성화하려면 명시적으로 활성화해야 합니다. IPv6 엔드포인트가 활성화되면 IPv4 엔드포인트는 활성화된 상태로 유지됩니다.

인스턴스 시작 시 또는 이후에 IPv6 엔드포인트를 활성화할 수 있습니다.

**IPv6 엔드포인트 활성화 요구**
+ 선택한 인스턴스 유형은 [Nitro 기반 인스턴스](instance-types.md#instance-hypervisor-type)입니다.
+ 선택한 서브넷은 IPv6를 지원합니다. 여기서 서브넷은 [이중 스택 또는 IPv6 전용](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)입니다.

현재는 AWS CLI 및 AWS SDK만 인스턴스 후 IMDS IPv6 엔드포인트 활성화를 지원합니다.

------
#### [ AWS CLI ]

**인스턴스에 대해 IMDS IPv6 엔드포인트를 활성화하려면**  
[modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 명령을 사용하고 `http-protocol-ipv6` 파라미터를 `enabled`로 설정합니다. 또한 `http-protocol-ipv6`의 값을 지정할 때 `http-endpoint`를 `enabled`로 설정해야 합니다.

```
aws ec2 modify-instance-metadata-options \
	--instance-id i-1234567890abcdef0 \
	--http-protocol-ipv6 enabled \
	--http-endpoint enabled
```

------
#### [ PowerShell ]

**인스턴스에 대해 IMDS IPv6 엔드포인트를 활성화하는 방법**  
[Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet을 사용하고 `HttpProtocolIpv6` 파라미터를 `enabled`로 설정합니다. 또한 `HttpProtocolIpv6`의 값을 지정할 때 `HttpEndpoint`를 `enabled`로 설정해야 합니다.

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpProtocolIpv6 enabled `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## 인스턴스 메타데이터에 대한 액세스 활성화
<a name="enable-instance-metadata-on-existing-instances"></a>

사용 중인 IMDS 버전에 관계없이 인스턴스에서 IMDS의 HTTP 엔드포인트를 활성화하여 인스턴스 메타데이터에 대한 액세스를 사용 설정할 수 있습니다. HTTP 엔드포인트를 비활성화하여 언제든지 이 변경을 되돌릴 수 있습니다.

인스턴스에서 인스턴스 메타데이터에 대한 액세스를 사용 설정하려면 다음 방법 중 하나를 사용합니다.

------
#### [ Console ]

**인스턴스 메타데이터에 대한 액세스를 활성화하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

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

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

1. **인스턴스 메타데이터 옵션 수정** 대화 상자에서 다음을 수행합니다.

   1. **인스턴스 메타데이터 서비스**에서 **활성화**를 선택합니다.

   1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

**인스턴스 메타데이터에 대한 액세스를 활성화하려면**  
[modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 명령을 사용하고 `http-endpoint` 파라미터를 `enabled`로 설정합니다.

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-endpoint enabled
```

------
#### [ PowerShell ]

**인스턴스 메타데이터에 대한 액세스를 활성화하려면**  
[Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet을 사용하고 `HttpEndpoint` 파라미터를 `enabled`로 설정합니다.

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## 인스턴스 메타데이터에 대한 액세스 비활성화
<a name="disable-instance-metadata-on-existing-instances"></a>

사용 중인 IMDS 버전에 관계없이 인스턴스에서 IMDS의 HTTP 엔드포인트를 비활성화하여 인스턴스 메타데이터에 대한 액세스를 비활성화할 수 있습니다. HTTP 엔드포인트를 활성화하여 언제든지 이 변경을 되돌릴 수 있습니다.

인스턴스에서 인스턴스 메타데이터에 대한 액세스를 비활성화하려면 다음 방법 중 하나를 사용합니다.

------
#### [ Console ]

**인스턴스 메타데이터에 대한 액세스를 끄려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

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

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

1. **인스턴스 메타데이터 옵션 수정** 대화 상자에서 다음을 수행합니다.

   1. **인스턴스 메타데이터 서비스**의 경우 **활성화**를 선택 취소합니다.

   1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

**인스턴스 메타데이터에 대한 액세스를 끄려면**  
[modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 명령을 사용하고 `http-endpoint` 파라미터를 `disabled`로 설정합니다.

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-endpoint disabled
```

------
#### [ PowerShell ]

**인스턴스 메타데이터에 대한 액세스를 끄려면**  
[Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet을 사용하고 `HttpEndpoint` 파라미터를 `disabled`로 설정합니다.

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpEndpoint disabled).InstanceMetadataOptions
```

------

## 인스턴스 메타데이터의 태그에 대한 액세스 허용
<a name="modify-access-to-tags-in-instance-metadata-on-existing-instances"></a>

실행 중이거나 중지된 인스턴스에서 인스턴스 메타데이터의 태그에 대한 액세스를 허용할 수 있습니다. 각 인스턴스에 대해 명시적으로 액세스를 허용해야 합니다. 액세스가 허용되면 인스턴스 태그 *키*는 특정 문자 제한을 준수해야 합니다. 그렇지 않으면 오류가 발생합니다. 자세한 내용은 [인스턴스 메타데이터에서 태그에 대한 액세스 활성화](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS) 섹션을 참조하세요.

## 문제 해결
<a name="troubleshoot-modifying-an-imdsv1-enabled-instance-fails"></a>

### IMDSv1이 활성화된 인스턴스 수정 실패
<a name="modifying-an-imdsv1-enabled-instance-fails"></a>

#### 설명
<a name="modifying-an-imdsv1-enabled-instance-fails-description"></a>

다음과 같은 오류 메시지가 나타납니다.

`You can't launch instances with IMDSv1 because httpTokensEnforced is enabled for this account. Either launch the instance with httpTokens=required or contact your account owner to disable httpTokensEnforced using the ModifyInstanceMetadataDefaults API or the account settings in the EC2 console.`

#### 원인
<a name="modifying-an-imdsv1-enabled-instance-fails-cause"></a>

EC2 계정 설정이나 AWS Organization 선언적 정책에서 IMDSv2 사용(`httpTokensEnforced = enabled`)을 적용하는 계정에서 IMDSv1이 활성화(`httpTokens = optional`)된 기존 인스턴스를 수정하려고 할 때 이 오류가 발생합니다.

#### Solution
<a name="modifying-an-imdsv1-enabled-instance-fails-solution"></a>

기존 인스턴스에서 IMDSv1 지원이 필요한 경우 해당 리전에서 계정에 대한 IMDSv2 적용을 비활성화해야 합니다. IMDSv2 적용을 비활성화하려면 `HttpTokensEnforced`를 `disabled`로 설정합니다. 자세한 내용은 Amazon EC2 API 참조의 [ModifyInstanceMetadataDefaults](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataDefaults.html)를 참조하세요. 콘솔을 사용하여 이 설정을 구성하려면 [계정 수준에서 IMDSv2 적용](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level) 섹션을 참조하세요.

IMDSv2만 사용하는 것을 권장합니다(`httpTokens=required`). 자세한 내용은 [인스턴스 메타데이터 서비스 버전 2 사용으로 전환](instance-metadata-transition-to-version-2.md) 섹션을 참조하세요.

 

# 사용자 데이터 입력을 사용하여 EC2 인스턴스를 시작할 때 명령 실행
<a name="user-data"></a>

Amazon EC2 인스턴스를 시작할 때 사용자 데이터를 인스턴스에 전달하여 자동화된 구성 태스크를 수행하는 데 사용할 수 있고, 인스턴스가 시작된 후에 스크립트를 실행하는 데 사용할 수도 있습니다.

더욱 복잡한 자동화 시나리오를 원하는 경우 CloudFormation을 고려할 수 있습니다. 자세한 정보는 *AWS CloudFormation 사용 설명서*의 [CloudFormation을 사용하여 Amazon EC2에 애플리케이션 배포](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/deploying.applications.html)를 참조하세요.

Linux 인스턴스에서는 Amazon EC2에 쉘 스크립트 및 cloud-init 명령이라는 두 가지 유형의 사용자 데이터를 전달할 수 있습니다. 이 데이터를 인스턴스 시작 마법사에 일반 텍스트, 파일(명령줄 도구를 사용하여 인스턴스를 시작하는 데 유용) 또는 base64 인코딩 텍스트(API 호출용)로 전달할 수도 있습니다.

Windows 인스턴스에서는 시작 에이전트가 사용자 데이터 스크립트를 처리합니다.

**고려 사항**
+ 사용자 데이터는 불투명 데이터로 취급됨: 제공한 것만을 살펴볼 수 있습니다. 해석은 인스턴스에 따라 다릅니다.
+ 사용자 데이터는 base64로 인코딩해야 합니다. Amazon EC2 콘솔은 base64 인코딩을 수행하거나 base64 인코딩된 입력을 수락할 수 있습니다. 인스턴스 메타데이터 또는 콘솔을 사용하여 사용자 데이터를 가져오는 경우 데이터는 자동으로 base64 디코딩됩니다.
+ 사용자 데이터는 base64로 인코딩되기 전에 원시 16KB 형식으로 제한됩니다. base64 인코딩 이후 *n* 길이의 문자열 크기는 ceil(*n*/3)\$14입니다.
+ 사용자 데이터는 인스턴스 속성입니다. 인스턴스에서 AMI를 생성하는 경우 인스턴스 사용자 데이터는 AMI에 포함되지 않습니다.

## AWS Management Console의 사용자 데이터
<a name="user-data-console"></a>

인스턴스를 시작할 때 인스턴스 사용자 데이터를 지정할 수 있습니다. 인스턴스의 루트 볼륨이 EBS 볼륨이면 인스턴스를 중지하고 사용자 데이터를 업데이트할 수도 있습니다.

### Launch Wizard를 사용하여 시작 시 인스턴스 사용자 데이터 지정
<a name="user-data-launch-instance-wizard"></a>

EC2 콘솔에서 Launch Wizard를 사용하여 인스턴스를 시작할 때 사용자 데이터를 지정할 수 있습니다. 시작 시 사용자 데이터를 지정하려면 [인스턴스 시작](ec2-launch-instance-wizard.md) 절차를 따르세요. **사용자 데이터(User data)** 필드는 인스턴스 시작 마법사의 [고급 세부 정보](ec2-instance-launch-parameters.md#liw-advanced-details) 섹션에 있습니다. **사용자 데이터** 필드에 PowerShell 스크립트를 입력한 다음 인스턴스 시작 절차를 완료합니다.

다음 **사용자 데이터** 필드 스크린샷의 예제 스크립트는 파일 이름에 현재 날짜 및 시간을 사용하여 Windows 임시 폴더에 파일을 생성합니다. `<persist>true</persist>`를 포함할 경우 인스턴스를 재부팅하거나 시작할 때마다 스크립트가 실행됩니다. **사용자 데이터가 이미 base64로 인코딩됨** 확인란을 비워 두면 Amazon EC2 콘솔이 base64 인코딩을 수행합니다.

![\[사전 세부 정보 사용자 데이터 텍스트 필드입니다.\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/configure_ec2config_userdata.png)


자세한 내용은 [Launch Wizard를 사용하여 시작 시 인스턴스 사용자 데이터 지정](#user-data-launch-instance-wizard) 섹션을 참조하세요. AWS CLI를 사용하는 Linux의 예는 [사용자 데이터 및 AWS CLI](#user-data-api-cli) 섹션을 참조하세요. Windows PowerShell용 도구를 사용하는 Windows의 예는 [사용자 데이터 및 Tools for Windows PowerShell](#user-data-powershell) 섹션을 참조하세요.

### 인스턴스 사용자 데이터 보기 및 업데이트
<a name="user-data-view-change"></a>

모든 인스턴스의 인스턴스 사용자 데이터를 볼 수 있으며, 중지된 인스턴스의 인스턴스 사용자 데이터를 업데이트할 수 있습니다.

**콘솔을 사용하여 인스턴스의 사용자 데이터를 업데이트하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

1. 인스턴스를 선택하고 **작업**, **인스턴스 상태**, **인스턴스 중지**를 차례로 선택합니다.
**주의**  
인스턴스를 중지하면 인스턴스 저장소 볼륨의 데이터가 손실됩니다. 이 데이터를 보존하려면 영구 스토리지에 백업하세요.

1. 확인 메시지가 표시되면 [**중지(Stop)**]를 선택합니다. 인스턴스가 중지하는 데 몇 분 정도 걸릴 수 있습니다.

1. 인스턴스가 선택된 상태에서 **작업(Actions)**, **인스턴스 설정(Instance settings)**, **사용자 데이터 편집(Edit user data)**을 차례로 선택합니다. 인스턴스가 실행 중일 때는 사용자 데이터를 변경할 수 없습니다. 하지만 볼 수는 있습니다.

1. [**사용자 데이터 편집(Edit user data)**] 대화 상자에서 사용자 데이터를 업데이트하고 [**저장(Save)**]을 선택합니다. 매번 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 다음 예제와 같이 `<persist>true</persist>`를 추가합니다.  
![\[사용자 데이터 편집 대화 상자입니다.\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/view-change-user-data.png)

1. 인스턴스를 시작합니다. 이후의 재부팅 또는 시작에 대해 사용자 데이터 실행을 활성화한 경우 인스턴스 시작 프로세스의 일부로서 업데이트된 사용자 데이터 스크립트가 실행됩니다.

## Amazon EC2가 Linux 인스턴스의 사용자 데이터를 처리하는 방법
<a name="userdata-linux"></a>

다음 예제에서는 사용자 데이터를 사용하여 인스턴스가 시작될 때 LAMP 서버를 설정하는 명령을 실행합니다. 각 예제에서눈 다음 태스크를 수행합니다.
+ 배포 소프트웨어 패키지를 업데이트합니다.
+ 웹 서버, `php` 및 `mariadb` 패키지가 설치됩니다.
+ `httpd` 서비스가 시작 및 활성화됩니다.
+ apache 그룹에 사용자 `ec2-user`가 추가됩니다.
+ 웹 디렉터리 및 해당 디렉터리에 들어 있는 파일에 적절한 소유권과 파일 권한을 설정합니다.
+ 간단한 웹 페이지를 생성하여 웹 서버 및 PHP 엔진을 테스트합니다.

**Topics**
+ [사전 조건](#user-data-requirements)
+ [사용자 데이터 및 shell 스크립트](#user-data-shell-scripts)
+ [인스턴스 사용자 데이터 업데이트](#user-data-modify)
+ [사용자 데이터 및 cloud-init 명령](#user-data-cloud-init)
+ [사용자 데이터 및 AWS CLI](#user-data-api-cli)
+ [셸 스크립트와 cloud-init 지시문 결합](#user-data-mime-multi)

### 사전 조건
<a name="user-data-requirements"></a>

이 주제의 예에서는 다음과 같이 가정합니다.
+ 사용자 인스턴스에 인터넷에서 접속 가능한 퍼블릭 DNS 이름이 있습니다.
+ 인스턴스와 연결된 보안 그룹은 SSH(포트 22) 트래픽을 허용하도록 구성되어 있으므로 인스턴스에 연결하여 출력 로그 파일을 볼 수 있습니다.
+ Amazon Linux AMI를 사용하여 인스턴스가 시작됩니다. 다른 Linux 배포판에서는 명령 및 지시문이 작동하지 않을 수 있습니다. cloud-init 지원 여부 등 다른 배포판에 대한 자세한 내용은 해당 배포판의 설명서를 참조하세요.

### 사용자 데이터 및 shell 스크립트
<a name="user-data-shell-scripts"></a>

shell 스크립트에 익숙한 경우 이 방법은 인스턴스 시작 시 명령을 전송하는 가장 쉽고 완벽한 방법입니다. 부팅 시에 이러한 작업을 추가하면 인스턴스 부팅에 걸리는 시간이 그만큼 늘어납니다. 사용자 스크립트가 성공적으로 완료되었는지 테스트하려면 우선 작업이 완료될 수 있도록 몇 분의 여유 시간을 두어야 합니다.

**중요**  
기본적으로 사용자 데이터 스크립트 및 cloud-init 명령은 최초로 인스턴스를 시작할 때만 실행됩니다. 인스턴스를 재시작할 때마다 사용자 데이터 스크립트 및 cloud-init 명령이 실행되도록 구성을 업데이트할 수 있습니다. 자세한 내용은 AWS 지식 센터에서 [사용자 데이터를 활용하여 Amazon EC2 Linux 인스턴스를 다시 시작할 때마다 스크립트를 자동으로 실행하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/execute-user-data-ec2)를 참조하세요.

사용자 데이터 shell 스크립트는 `#!` 문자 및 스크립트를 읽을 인터프리터의 경로(일반적으로 **/bin/bash)**로 시작되어야 합니다. 쉘 스크립팅에 대한 소개는 *GNU 운영 체제* 웹사이트의 [Bash 참조 매뉴얼](https://www.gnu.org/software/bash/manual/bash.html)을 참조하세요.

사용자 데이터로 입력된 스크립트는 루트 사용자 권한으로 실행되므로 스크립트에 **sudo** 명령을 사용하지 마세요. 생성하는 모든 파일의 소유권은 루트 사용자에게 있습니다. 루트 이외의 사용자에게 파일 액세스를 허용하려면 스크립트에서 권한을 적절히 수정해야 합니다. 또한 스크립트는 대화형으로 실행되지 않으므로 사용자의 입력이 필요한 명령(예: **yum update** 플래그 없는 `-y`)은 포함할 수 없습니다.

사용자 데이터 스크립트에서 AWS CLI를 포함한 AWS API를 사용하는 경우 인스턴스를 시작할 때 인스턴스 프로파일을 사용해야 합니다. 인스턴스 프로필은 사용자 데이터 스크립트에서 API 호출을 실행하는 데 필요한 적절한 AWS 자격 증명을 제공합니다. 자세한 내용은 IAM 사용 설명서의 [인스턴스 프로파일 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)을 참조하세요. IAM 역할에 할당하는 권한은 API를 사용하여 호출하는 서비스에 따라 다릅니다. 자세한 내용은 [Amazon EC2의 IAM 역할](iam-roles-for-amazon-ec2.md) 섹션을 참조하세요.

cloud-init 출력 로그 파일이 콘솔 출력을 캡처하므로 시작 후 인스턴스가 의도한 대로 동작하지 않더라도 스크립트를 손쉽게 디버깅할 수 있습니다. 로그 파일을 보려면 [인스턴스에 연결](connect-to-linux-instance.md)하여 `/var/log/cloud-init-output.log`를 엽니다.

사용자 데이터 스크립트는 처리 시 `/var/lib/cloud/instances/instance-id/`에서 복사 및 실행됩니다. 스크립트는 실행 후에는 삭제가 되지 않습니다. `/var/lib/cloud/instances/instance-id/`사용자 데이터를 파싱할 수 있는 스크립트가 AMI 인스턴스에 필요하다고 언급했습니다. 그렇지 않은 경우, 스크립트는 AMI에서 시작된 어떤 인스턴스에서든 이 디렉터리에 존재합니다.

### 인스턴스 사용자 데이터 업데이트
<a name="user-data-modify"></a>

인스턴스 사용자 데이터를 업데이트하려면 먼저 인스턴스를 중단해야 합니다. 인스턴스가 실행 중인 경우 사용자 데이터를 볼 수 있지만 수정할 수는 없습니다.

**주의**  
인스턴스를 중지하면 인스턴스 저장소 볼륨의 데이터가 손실됩니다. 이 데이터를 보존하려면 영구 스토리지에 백업하세요.

**인스턴스 사용자 데이터를 수정하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

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

1. 인스턴스를 선택하고 **인스턴스 상태**, **인스턴스 중지**를 차례로 선택합니다. 이 옵션이 비활성화되어 있으면 해당 인스턴스가 이미 중지되었거나 해당 루트 볼륨이 인스턴스 저장소 볼륨인 것입니다.

1. 확인 메시지가 표시되면 [**중지(Stop)**]를 선택합니다. 인스턴스가 중지하는 데 몇 분 정도 걸릴 수 있습니다.

1. 인스턴스가 선택된 상태에서 **작업(Actions)**, **인스턴스 설정(Instance settings)**, **사용자 데이터 편집(Edit user data)**을 차례로 선택합니다.

1. 필요에 따라 사용자 데이터를 수정한 다음 **저장(Save)**을 선택합니다.

1. 인스턴스를 시작합니다. 새 사용자 데이터는 인스턴스를 시작한 후에 인스턴스에 표시되지만 사용자 데이터 스크립트가 실행되지는 않습니다.

### 사용자 데이터 및 cloud-init 명령
<a name="user-data-cloud-init"></a>

cloud-init 패키지는 새 Amazon Linux 인스턴스가 시작될 때의 특정 측면을 구성합니다. 가장 널리 사용되는 기능은 사용자가 자신의 프라이빗 키로 로그인할 수 있도록 ec2-user의 `.ssh/authorized_keys` 파일을 구성하는 것입니다. cloud-init 패키지가 Amazon Linux 인스턴스에 대해 수행하는 구성 태스크에 대한 자세한 내용은 다음 설명서를 참조하세요.
+ **Amazon Linux 2023** – [사용자 지정 cloud-init](https://docs.aws.amazon.com/linux/al2023/ug/cloud-init.html)
+ **Amazon Linux 2** - [Amazon Linux 2에서 cloud-init 사용](https://docs.aws.amazon.com/linux/al2/ug/amazon-linux-cloud-init.html)

cloud-init 사용자 명령을 인스턴스 시작 시에 전달하는 방법은 스크립트를 전달하는 방법과 동일하지만 구문은 서로 다릅니다. cloud-init에 대한 자세한 내용은 [https://cloudinit.readthedocs.org/en/latest/index.html](https://cloudinit.readthedocs.org/en/latest/index.html)을 참조하세요.

**중요**  
기본적으로 사용자 데이터 스크립트 및 cloud-init 명령은 최초로 인스턴스를 시작할 때만 실행됩니다. 인스턴스를 재시작할 때마다 사용자 데이터 스크립트 및 cloud-init 명령이 실행되도록 구성을 업데이트할 수 있습니다. 자세한 내용은 AWS 지식 센터에서 [사용자 데이터를 활용하여 Amazon EC2 Linux 인스턴스를 다시 시작할 때마다 스크립트를 자동으로 실행하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/execute-user-data-ec2)를 참조하세요.

부팅 시에 이러한 작업을 추가하면 인스턴스 부팅에 걸리는 시간이 그만큼 늘어납니다. 사용자 데이터 명령이 완료되었는지 테스트하려면 우선 작업이 완료될 수 있도록 몇 분의 여유 시간을 두어야 합니다.

**cloud-init 지시문을 Amazon Linux 인스턴스로 전달하려면**

1. [인스턴스 시작](ec2-launch-instance-wizard.md) 절차를 따릅니다. **사용자 데이터(User data)** 필드는 인스턴스 시작 마법사의 [고급 세부 정보](ec2-instance-launch-parameters.md#liw-advanced-details) 섹션에 있습니다. **사용자 데이터(User data)** 필드에 cloud-init 지시문 텍스트를 입력한 다음 인스턴스 시작 절차를 완료합니다.

   아래 예제에서는 지시문을 통해 Amazon Linux에서 웹 서버를 생성하고 구성합니다. 명령을 cloud-init 명령으로 식별하려면 상단에 `#cloud-config` 행을 추가해야 합니다.

------
#### [ AL2023 ]

   ```
   #cloud-config
   package_update: true
   package_upgrade: all
   	
   packages:
   - httpd
   - mariadb105-server
   - php8.1
   - php8.1-mysqlnd
   
   runcmd:
   - systemctl start httpd
   - systemctl enable httpd
   - [ sh, -c, "usermod -a -G apache ec2-user" ]
   - [ sh, -c, "chown -R ec2-user:apache /var/www" ]
   - chmod 2775 /var/www
   - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ]
   - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ]
   - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
   ```

------
#### [ AL2 ]

   ```
   #cloud-config
   package_update: true
   package_upgrade: all
   	
   packages:
   - httpd
   - mariadb-server
   	
   runcmd:
   - [ sh, -c, "amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2" ]
   - systemctl start httpd
   - systemctl enable httpd
   - [ sh, -c, "usermod -a -G apache ec2-user" ]
   - [ sh, -c, "chown -R ec2-user:apache /var/www" ]
   - chmod 2775 /var/www
   - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ]
   - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ]
   - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
   ```

------

1. 인스턴스가 시작되고 사용자 데이터의 명령이 실행되도록 충분한 시간을 허용한 후 명령에서 의도된 태스크를 완료했는지 확인합니다.

   이 예제의 경우 명령에서 생성한 PHP 테스트 파일의 URL을 웹 브라우저에 입력합니다. 이 URL은 인스턴스의 퍼블릭 DNS 주소에 슬래시(/)와 파일 이름이 추가된 형태입니다.

   ```
   http://my.public.dns.amazonaws.com/phpinfo.php
   ```

   PHP 정보 페이지가 표시되어야 합니다. PHP 정보 페이지가 표시되지 않는 경우 사용하고 있는 보안 그룹이 HTTP(포트 80) 트래픽을 허용하는 규칙을 포함하고 있는지 확인하세요. 자세한 내용은 [보안 그룹 규칙 구성](changing-security-group.md#add-remove-security-group-rules) 섹션을 참조하세요.

1. (선택 사항) 명령에서 의도한 작업을 완료하지 못했거나 명령이 오류 없이 완료되었는지 여부를 확인하려는 경우 [인스턴스에 연결](connect-to-linux-instance.md)하여 출력 로그 파일(`/var/log/cloud-init-output.log`)을 조사하고 출력에서 오류 메시지를 찾아 봅니다. 명령에 다음 줄을 추가하면 자세한 디버깅 정보를 확인할 수 있습니다.

   ```
   output : { all : '| tee -a /var/log/cloud-init-output.log' }
   ```

   이 명령은 **runcmd** 출력을 `/var/log/cloud-init-output.log`로 전송합니다.

### 사용자 데이터 및 AWS CLI
<a name="user-data-api-cli"></a>

AWS CLI를 사용하여 인스턴스의 사용자 데이터를 지정, 수정 및 확인할 수 있습니다. 인스턴스 메타데이터를 사용하여 인스턴스의 사용자 데이터를 보는 방법에 대한 자세한 내용은 [EC2 인스턴스에 대한 인스턴스 메타데이터에 액세스](instancedata-data-retrieval.md) 섹션을 참조하세요.

Windows에서 AWS Tools for Windows PowerShell를 사용하는 대신 AWS CLI을 사용할 수 있습니다. 자세한 정보는 [사용자 데이터 및 Tools for Windows PowerShell](#user-data-powershell)을 참조하세요.

**예: 시작 시 사용자 데이터 지정**  
인스턴스를 시작할 때 사용자 데이터를 지정하려면 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 명령을 `--user-data` 파라미터와 함께 사용합니다. **run-instances**를 사용하면 AWS CLI에서는 사용자 데이터의 base64 인코딩을 수행합니다.

다음 예에서는 스크립트를 명령줄에서 문자열로 지정하는 방법을 보여줍니다.

```
aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \
    --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \
    --user-data echo user data
```

다음 예에서는 텍스트 파일을 사용하여 스크립트를 지정하는 방법을 보여줍니다. `file://` 접두사를 사용하여 파일을 지정해야 합니다.

```
aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \
    --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \
    --user-data file://my_script.txt
```

다음은 shell 스크립트가 포함된 텍스트 파일의 예입니다.

```
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

**예: 중지된 인스턴스의 사용자 데이터 수정**  
[modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html) 명령을 사용하여 중지된 인스턴스의 사용자 데이터를 수정할 수 있습니다. **modify-instance-attribute**를 사용하여 AWS CLI는 사용자 데이터의 base64 인코딩을 수행하지 않습니다.
+ **Linux** 컴퓨터에서 base64 명령을 사용하여 사용자 데이터를 인코딩합니다.

  ```
  base64 my_script.txt >my_script_base64.txt
  ```
+ **Windows** 컴퓨터에서 certutil 명령을 사용하여 사용자 데이터를 인코딩합니다. AWS CLI에서 이 파일을 사용하기 전에 첫 번째(인증서 시작) 줄과 마지막(인증서 종료) 줄을 제거해야 합니다.

  ```
  certutil -encode my_script.txt my_script_base64.txt
  notepad my_script_base64.txt
  ```

`--attribute` 및 `--value` 파라미터를 사용하여 인코딩된 텍스트 파일로 사용자 데이터를 지정합니다. `file://` 접두사를 사용하여 파일을 지정해야 합니다.

```
aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --value file://my_script_base64.txt
```

**예: 중지된 인스턴스의 사용자 데이터 삭제**  
기존 사용자 데이터를 삭제하려면 다음과 같이 [modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html) 명령을 사용합니다.

```
aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --user-data Value=
```

**예: 사용자 데이터 보기**  
인스턴스의 사용자 데이터를 가져오려면 [describe-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-attribute.html) 명령을 사용합니다. **describe-instance-attribute**를 사용하여 AWS CLI는 사용자 데이터의 base64 디코딩을 수행하지 않습니다.

```
aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData
```

다음은 사용자 데이터 base64가 인코딩된 출력의 예입니다.

```
{
    "UserData": {
        "Value": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQpzZXJ2aWNlIGh0dHBkIHN0YXJ0CmNoa2NvbmZpZyBodHRwZCBvbg=="
    },
    "InstanceId": "i-1234567890abcdef0"
}
```
+ **Linux** 컴퓨터에서 `--query` 옵션을 사용하여 인코딩된 사용자 데이터를 가져오고, base64 명령을 사용하여 이를 디코딩합니다.

  ```
  aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" | base64 --decode
  ```
+ **Windows** 컴퓨터에서 `--query` 옵션을 사용하여 코딩된 사용자 데이터를 가져오고, certutil 명령을 사용하여 이를 디코딩합니다. 인코딩된 출력과 디코딩된 출력은 각각 다른 파일에 저장됩니다.

  ```
  aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" >my_output.txt
  certutil -decode my_output.txt my_output_decoded.txt
  type my_output_decoded.txt
  ```

다음은 예제 출력입니다.

```
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

### 셸 스크립트와 cloud-init 지시문 결합
<a name="user-data-mime-multi"></a>

기본적으로 사용자 데이터에는 한 번에 하나의 콘텐츠 유형만 포함할 수 있습니다. 그러나 MIME 멀티 파트 파일에서 `text/cloud-config` 및 `text/x-shellscript` 콘텐츠 유형을 사용하여 사용자 데이터에 셸 스크립트와 cloud-init 지시문을 모두 포함할 수 있습니다.

다음은 MIME 멀티 파트 형식을 보여줍니다.

```
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
	
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
	
#cloud-config
cloud-init directives
	
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
	
#!/bin/bash
shell script commands
--//--
```

예를 들어, 다음 사용자 데이터에는 cloud-init 지시문과 bash 셸 스크립트가 포함됩니다. cloud-init 지시문은 파일(`/test-cloudinit/cloud-init.txt`)을 생성하고 해당 파일에 `Created by cloud-init`를 씁니다. bash 셸 스크립트는 파일(`/test-userscript/userscript.txt`)을 생성하고 해당 파일에 `Created by bash shell script`를 씁니다.

```
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
	
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
	
#cloud-config
runcmd:
- [ mkdir, /test-cloudinit ]
write_files:
- path: /test-cloudinit/cloud-init.txt
content: Created by cloud-init
	
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
	
#!/bin/bash
mkdir test-userscript
touch /test-userscript/userscript.txt
echo "Created by bash shell script" >> /test-userscript/userscript.txt
--//--
```

## Amazon EC2가 Windows 인스턴스의 사용자 데이터를 처리하는 방법
<a name="ec2-windows-user-data"></a>

Windows 인스턴스에서는 시작 에이전트가 사용자 데이터 관련 작업을 수행합니다. 자세한 내용은 다음을 참조하세요.
+ [EC2Launch v2](ec2launch-v2.md) 
+ [EC2Launch](ec2launch.md) 
+ [EC2Config 서비스](ec2config-service.md)

`UserData` 템플릿의 CloudFormation 속성 어셈블리 예제는 [Base64 인코딩 UserData 속성](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-general.html#scenario-userdata-base64) 및 [AccessKey 및 SecretKey를 사용하는 Base64 인코딩 UserData 속성](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-general.html#scenario-userdata-base64-with-keys)을 참조하세요.

수명 주기 후크와 함께 작동하는 Auto Scaling 그룹 내의 인스턴스에서 명령을 실행하는 예제는 **Amazon EC2 Auto Scaling 사용 설명서에서 [자습서: 인스턴스 메타데이터를 통해 대상 수명 주기 상태를 검색하도록 사용자 데이터 구성](https://docs.aws.amazon.com/autoscaling/ec2/userguide/tutorial-lifecycle-hook-instance-metadata.html)을 참조하세요.

**Topics**
+ [사용자 데이터 스크립트](#user-data-scripts)
+ [압축된 사용자 데이터](#user-data-compressed)
+ [사용자 데이터 실행](#user-data-execution)
+ [사용자 데이터 및 Tools for Windows PowerShell](#user-data-powershell)

### 사용자 데이터 스크립트
<a name="user-data-scripts"></a>

`EC2Config` 또는 `EC2Launch`에서 스크립트를 실행하려면 사용자 데이터에 추가할 때 해당 스크립트를 특수 태그 안에 포함해야 합니다. 사용하는 태그는 명령 프롬프트 창에서 명령이 실행되는지(배치 명령) 아니면 Windows PowerShell을 사용하는지에 따라 달라집니다.

배치 스크립트와 Windows PowerShell 스크립트를 둘 다 지정할 경우, 인스턴스 사용자 데이터에 나타나는 순서와 관계 없이, 배치 스크립트가 먼저 실행되고 Windows PowerShell 스크립트가 다음에 실행됩니다.

사용자 데이터 스크립트에서 AWS을(를) 포함한 AWS CLI API를 사용하는 경우 인스턴스를 시작할 때 인스턴스 프로파일을 사용해야 합니다. 인스턴스 프로필은 사용자 데이터 스크립트에서 API 호출을 실행하는 데 필요한 적절한 AWS 자격 증명을 제공합니다. 자세한 내용은 [인스턴스 프로파일](iam-roles-for-amazon-ec2.md#ec2-instance-profile) 섹션을 참조하세요. IAM 역할에 할당하는 권한은 API를 사용하여 호출하는 서비스에 따라 다릅니다. 자세한 내용은 [Amazon EC2의 IAM 역할](iam-roles-for-amazon-ec2.md) 섹션을 참조하세요.

**Topics**
+ [배치 스크립트 구문](#user-data-batch-scripts)
+ [Windows PowerShell 스크립트 구문](#user-data-powershell-scripts)
+ [YAML 구성 스크립트 구문](#user-data-yaml-scripts)
+ [Base64 인코딩](#user-data-base64-encoding)

#### 배치 스크립트 구문
<a name="user-data-batch-scripts"></a>

`script` 태그를 사용하여 배치 스크립트를 지정합니다. 다음 예제와 같이 줄 바꿈을 사용하여 명령을 구분합니다.

```
<script>
    echo Current date and time >> %SystemRoot%\Temp\test.log
    echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
</script>
```

기본적으로 사용자 데이터 스크립트는 인스턴스를 시작할 때 한 번만 실행됩니다. 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 `<persist>true</persist>`를 사용자 데이터에 추가합니다.

```
<script>
    echo Current date and time >> %SystemRoot%\Temp\test.log
    echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
</script>
<persist>true</persist>
```

**EC2Launch v2 에이전트**  
`UserData` 단계에서 EC2Launch v2 **executeScript** 태스크와 함께 XML 사용자 데이터 스크립트를 분리된 프로세스로 실행하려면 사용자 데이터에 `<detach>true</detach>`를 추가하세요.

**참고**  
detach 태그는 이전 시작 에이전트에서 지원되지 않습니다.

```
<script>
    echo Current date and time >> %SystemRoot%\Temp\test.log
    echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
</script>
<detach>true</detach>
```

#### Windows PowerShell 스크립트 구문
<a name="user-data-powershell-scripts"></a>

AWS Windows AMI에는 [AWS Tools for Windows PowerShell](https://aws.amazon.com/powershell/)이(가) 포함되어 있으므로 사용자 데이터에서 이러한 cmdlet을 지정할 수 있습니다. IAM 역할을 인스턴스와 연결하는 경우, 인스턴스에서 실행되는 애플리케이션이 역할의 자격 증명을 사용하여 AWS 리소스(예: Amazon S3 버킷 등)에 액세스할 수 있기 때문에 cmdlet에 대한 자격 증명을 지정할 필요가 없습니다.

`<powershell>` 태그를 사용하여 Windows PowerShell 스크립트를 지정합니다. 줄 바꿈을 사용하여 명령을 구분합니다. `<powershell>` 태그는 대/소문자를 구분합니다.

예제:

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
```

기본적으로 사용자 데이터 스크립트는 인스턴스를 시작할 때 한 번만 실행됩니다. 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 `<persist>true</persist>`를 사용자 데이터에 추가합니다.

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

`<powershellArguments>` 태그를 사용하여 하나 이상의 PowerShell 인수를 지정할 수 있습니다. 인수가 전달되지 않는 경우 EC2Launch 및 EC2Launch v2는 기본적으로 `-ExecutionPolicy Unrestricted` 인수를 추가합니다.

**예시:**

```
<powershell>
    $file = $env:SystemRoot + "\Temp" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<powershellArguments>-ExecutionPolicy Unrestricted -NoProfile -NonInteractive</powershellArguments>
```

**EC2Launch v2 에이전트**  
`UserData` 단계에서 EC2Launch v2 **executeScript** 태스크와 함께 XML 사용자 데이터 스크립트를 분리된 프로세스로 실행하려면 사용자 데이터에 `<detach>true</detach>`를 추가하세요.

**참고**  
detach 태그는 이전 시작 에이전트에서 지원되지 않습니다.

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<detach>true</detach>
```

#### YAML 구성 스크립트 구문
<a name="user-data-yaml-scripts"></a>

EC2Launch v2를 사용하여 스크립트를 실행하는 경우 YAML 형식을 사용할 수 있습니다. EC2Launch v2에 대한 구성 작업, 세부 정보 및 예제를 보려면 [EC2Launch v2 태스크 구성](ec2launch-v2-settings.md#ec2launch-v2-task-configuration) 섹션을 참조하세요.

`executeScript` 작업을 통해 YAML 스크립트를 지정합니다.

**PowerShell 스크립트를 실행하는 YAML 구문 예제** 

```
version: 1.0
tasks:
- task: executeScript
  inputs:
  - frequency: always
    type: powershell
    runAs: localSystem
    content: |-
      $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
      New-Item $file -ItemType file
```

**배치 스크립트를 실행하는 YAML 구문 예제**

```
version: 1.1
tasks:
- task: executeScript
  inputs:
  - frequency: always
    type: batch
    runAs: localSystem
    content: |-
      echo Current date and time >> %SystemRoot%\Temp\test.log
      echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
```

#### Base64 인코딩
<a name="user-data-base64-encoding"></a>

Amazon EC2 API 또는 사용자 데이터의 base64 인코딩을 수행하지 않는 도구를 사용하는 경우, 직접 사용자 데이터를 인코딩해야 합니다. 그렇지 않을 경우, 실행할 `script` 또는 `powershell` 태그를 찾을 수 없다는 오류가 기록됩니다. 다음은 Windows PowerShell을 사용하여 인코딩하는 예제입니다.

```
$UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))
```

다음은 PowerShell을 사용하여 디코딩하는 예제입니다.

```
$Script = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData))
```

base64 인코딩에 대한 자세한 내용은 [https://www.ietf.org/rfc/rfc4648.txt](https://www.ietf.org/rfc/rfc4648.txt)을 참조하세요.

### 압축된 사용자 데이터
<a name="user-data-compressed"></a>

EC2Launch v2는 IMDS에서 부과한 16KB 제한보다 큰 사용자 데이터를 제출하는 방법으로 압축된 사용자 데이터를 지원합니다. 이 기능을 사용하려면 사용자 데이터 스크립트를 `.zip` 아카이브로 압축하여 EC2 인스턴스에 전달합니다. EC2Launch v2는 압축된 사용자 데이터를 감지하면 압축된 사용자 데이터 스크립트의 압축을 자동으로 풀고 실행합니다.

표준 사용자 데이터와 마찬가지로 Amazon EC2 API 또는 사용자 데이터의 base64 인코딩을 수행하지 않는 도구를 사용하는 경우, 직접 사용자 데이터를 인코딩해야 합니다. 사용자 데이터 크기 제한 및 base64 인코딩에 대한 자세한 내용은 [EC2 인스턴스에 대한 인스턴스 메타데이터에 액세스](instancedata-data-retrieval.md) 섹션을 참조하세요.

### 사용자 데이터 실행
<a name="user-data-execution"></a>

기본적으로 모든 AWS Windows AMI는 초기 실행에 대해 활성화되는 사용자 데이터 실행 기능을 포함하고 있습니다. 다음 번에 인스턴스가 재부팅하거나 재시작할 때 사용자 데이터 스크립트가 실행되도록 지정할 수 있습니다. 또는 인스턴스가 재부팅하거나 재시작할 때마다 사용자 데이터 스크립트가 실행되도록 지정할 수도 있습니다.

**참고**  
초기 실행 후에는 사용자 데이터가 기본적으로 실행되도록 설정되어 있지 않습니다. 인스턴스를 재부팅하거나 시작할 때 사용자 데이터가 실행되도록 설정하려면 [이후 재부팅 또는 시작 시 스크립트 실행](#user-data-scripts-subsequent) 섹션을 참조하세요.

사용자 데이터 스크립트는 임의 암호가 생성될 때 로컬 관리자 계정에서 실행됩니다. 그렇게 하지 않으면 사용자 데이터 스크립트가 시스템 계정에서 실행됩니다.

#### 인스턴스 시작 스크립트
<a name="user-data-scripts-launch"></a>

인스턴스 사용자 데이터의 스크립트는 인스턴스 초기 시작 중에 실행됩니다. `persist` 태그가 있는 경우 사용자 데이터 실행이 후속 재부팅이나 시작에 대해 활성화됩니다. EC2Launch v2, EC2Launch 및 EC2Config용 로그 파일에는 표준 출력 및 표준 오류 스트림의 출력이 들어 있습니다.

**EC2Launch v2**  
EC2Launch v2의 로그 파일은 `C:\ProgramData\Amazon\EC2Launch\log\agent.log`입니다.

**참고**  
`C:\ProgramData` 폴더를 숨길 수 있습니다. 폴더를 보려면 숨겨진 파일과 폴더를 표시해야 합니다.

다음 정보는 사용자 데이터가 실행될 때 로깅됩니다.
+ `Info: Converting user-data to yaml format` - 사용자 데이터가 XML 형식으로 제공된 경우
+ `Info: Initialize user-data state` - 사용자 데이터 실행의 시작
+ `Info: Frequency is: always` - 부팅할 때마다 사용자 데이터 태스크가 실행되는 경우
+ `Info: Frequency is: once` - 사용자 데이터 태스크가 한 번만 실행되는 경우
+ `Stage: postReadyUserData execution completed` - 사용자 데이터 실행의 끝

**EC2Launch**  
EC2Launch에 대한 로그 파일은 `C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log`입니다.

`C:\ProgramData` 폴더를 숨길 수 있습니다. 폴더를 보려면 숨겨진 파일과 폴더를 표시해야 합니다.

다음 정보는 사용자 데이터가 실행될 때 로깅됩니다.
+ `Userdata execution begins` - 사용자 데이터 실행의 시작
+ `<persist> tag was provided: true` - persist 태그가 있는 경우
+ `Running userdata on every boot` - persist 태그가 있는 경우
+ `<powershell> tag was provided.. running powershell content` - powershell 태그가 있는 경우
+ `<script> tag was provided.. running script content` - script 태그가 있는 경우
+ `Message: The output from user scripts` - 사용자 데이터 스크립트가 실행되는 경우 해당 출력이 로깅됨

**EC2Config**  
EC2Config의 로그 파일은 `C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2Config.log`입니다. 다음 정보는 사용자 데이터가 실행될 때 로깅됩니다.
+ `Ec2HandleUserData: Message: Start running user scripts` - 사용자 데이터 실행의 시작
+ `Ec2HandleUserData: Message: Re-enabled userdata execution` - persist 태그가 있는 경우
+ `Ec2HandleUserData: Message: Could not find <persist> and </persist>` - persist 태그가 없는 경우
+ `Ec2HandleUserData: Message: The output from user scripts` - 사용자 데이터 스크립트가 실행되는 경우 해당 출력이 로깅됨

#### 이후 재부팅 또는 시작 시 스크립트 실행
<a name="user-data-scripts-subsequent"></a>

인스턴스 사용자 데이터를 업데이트하는 경우 다음에 인스턴스를 재부팅하거나 시작할 때 업데이트된 사용자 데이터 콘텐츠가 인스턴스 메타데이터에 자동으로 반영됩니다. 그러나 설치된 시작 에이전트에 따라 후속 재부팅 또는 시작 시 실행하도록 사용자 데이터 스크립트를 구성하려면 추가 구성이 필요할 수 있습니다.

**Sysprep으로 종료** 옵션을 선택하는 경우 후속 재부팅 또는 시작시 사용자 데이터 실행을 활성화하지 않았더라도 다음에 인스턴스가 재부팅되거나 시작될 때 사용자 데이터 스크립트가 실행됩니다.

사용자 데이터 실행을 활성화하는 지침을 보려면 시작 에이전트와 일치하는 탭을 선택합니다.

------
#### [ EC2Launch v2 ]

EC2Launch v1과 달리 EC2Launch v2는 부팅할 때마다 사용자 데이터 작업을 평가합니다. 사용자 데이터 작업을 수동으로 예약하지 않아도 됩니다. 사용자 데이터는 포함된 빈도 또는 지속 옵션에 따라 실행됩니다.

XML 사용자 데이터 스크립트의 경우  
부팅할 때마다 사용자 데이터 스크립트를 실행하려면 사용자 데이터에 `<persist>true</persist>` 플래그를 추가하세요. 지속 플래그가 포함되지 않은 경우 사용자 데이터 스크립트는 초기 부팅 시에만 실행됩니다.

YAML 사용자 데이터의 경우  
+ 초기 부팅 시 사용자 데이터에서 작업을 실행하려면 `frequency` 작업을 `once`로 설정하세요.
+ 부팅할 때마다 사용자 데이터에서 작업을 실행하려면 `frequency` 작업을 `always`로 설정하세요.

------
#### [ EC2Launch ]

1. Windows 인스턴스에 연결합니다.

1. PowerShell 명령 창을 열고 다음 명령 중 하나를 실행하세요.

**한 번 실행**  
다음 부팅 시 사용자 데이터를 한 번 실행하려면 `-Schedule` 플래그를 사용하세요.

   ```
   C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
   ```

**모든 후속 부팅에서 실행**  
모든 후속 부팅 시 사용자 데이터를 실행하려면 `-SchedulePerBoot` 플래그를 사용하세요.

   ```
   C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -SchedulePerBoot
   ```

1. Windows 인스턴스에서 연결을 해제합니다. 다음 번에 인스턴스가 시작될 때 업데이트된 스크립트를 실행하려면 인스턴스를 중지하고 사용자 데이터를 업데이트합니다.

------
#### [ EC2Config ]

1. Windows 인스턴스에 연결합니다.

1. Open `C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe`.

1. **사용자 데이터**에서 **Enable UserData execution for next service start**(다음 서비스 시작 시 사용자 데이터 실행 활성화)를 선택합니다.

1. Windows 인스턴스에서 연결을 해제합니다. 다음 번에 인스턴스가 시작될 때 업데이트된 스크립트를 실행하려면 인스턴스를 중지하고 사용자 데이터를 업데이트합니다.

------

### 사용자 데이터 및 Tools for Windows PowerShell
<a name="user-data-powershell"></a>

Tools for Windows PowerShell을 사용하여 인스턴스의 사용자 데이터를 지정, 수정 및 확인할 수 있습니다. 인스턴스 메타데이터를 사용하여 인스턴스의 사용자 데이터를 보는 방법에 대한 자세한 내용은 [EC2 인스턴스에 대한 인스턴스 메타데이터에 액세스](instancedata-data-retrieval.md) 섹션을 참조하세요. 사용자 데이터 및 AWS CLI에 대한 자세한 내용은 [사용자 데이터 및 AWS CLI](#user-data-api-cli) 섹션을 참조하세요.

**예시: 시작 시 인스턴스 사용자 데이터 지정**  
인스턴스 사용자 데이터를 포함하는 텍스트 파일을 생성합니다. 매번 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 다음 예제와 같이 `<persist>true</persist>`를 추가합니다.

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

인스턴스를 시작할 때 인스턴스 사용자 데이터를 지정하려면 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) 명령을 사용합니다. 이 명령은 사용자 데이터의 base64 인코딩을 수행하지 않습니다. 다음 명령을 사용하여 사용자 데이터를 `script.txt` 이름의 텍스트 파일로 인코딩합니다.

```
PS C:\> $Script = Get-Content -Raw script.txt
PS C:\> $UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))
```

`-UserData` 파라미터를 사용하여 사용자 데이터를 **New-EC2Instance** 명령으로 전달합니다.

```
PS C:\> New-EC2Instance -ImageId ami-abcd1234 -MinCount 1 -MaxCount 1 -InstanceType m3.medium \
    -KeyName my-key-pair -SubnetId subnet-12345678 -SecurityGroupIds sg-1a2b3c4d \
    -UserData $UserData
```

**예시: 중지된 인스턴스에 대한 인스턴스 사용자 데이터 업데이트**  
[Edit-EC2InstanceAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceAttribute.html) 명령을 사용하여 중지된 인스턴스의 사용자 데이터를 수정할 수 있습니다.

새 스크립트를 포함하는 텍스트 파일을 생성합니다. 다음 명령을 사용하여 사용자 데이터를 `new-script.txt` 이름의 텍스트 파일로 인코딩합니다.

```
PS C:\> $NewScript = Get-Content -Raw new-script.txt
PS C:\> $NewUserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($NewScript))
```

`-UserData` 및 `-Value` 파라미터를 사용하여 사용자 데이터를 지정합니다.

```
PS C:\> Edit-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData -Value $NewUserData
```

**예시: 인스턴스 사용자 데이터 보기**  
인스턴스의 사용자 데이터를 가져오려면 [Get-EC2InstanceAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceAttribute.html) 명령을 사용합니다.

```
PS C:\> (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData
```

다음은 예시 출력입니다. 사용자 데이터가 인코딩됩니다.

```
PHBvd2Vyc2hlbGw+DQpSZW5hbWUtQ29tcHV0ZXIgLU5ld05hbWUgdXNlci1kYXRhLXRlc3QNCjwvcG93ZXJzaGVsbD4=
```

다음 명령을 사용하여 인코딩된 사용자 데이터를 변수에 저장한 다음 디코딩합니다.

```
PS C:\> $UserData_encoded = (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData
PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData_encoded))
```

다음은 예시 출력입니다.

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

**예시: 태그 값과 일치하도록 인스턴스의 이름 바꾸기**  
[Get-EC2Tag](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Tag.html) 명령을 사용하여 태그 값을 읽고 처음 부팅할 때 태그 값과 일치하도록 인스턴스 이름을 바꾼 다음 재부팅할 수 있습니다. 이 명령을 성공적으로 실행하려면 API 호출로 태그 정보를 가져오기 때문에 인스턴스에 `ec2:DescribeTags` 권한이 연결된 역할이 있어야 합니다. IAM 역할을 사용하여 권한을 설정하는 방법에 대한 자세한 내용은 [IAM 역할을 인스턴스에 연결](attach-iam-role.md) 섹션을 참조하세요.

------
#### [ IMDSv2 ]

```
<powershell>
    [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing
    $instanceId = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/instance-id' -UseBasicParsing
	$nameValue = (Get-EC2Tag -Filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value
	$pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$"
	#Verify Name Value satisfies best practices for Windows hostnames
	If ($nameValue -match $pattern) 
	    {Try
	        {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} 
	    Catch
	        {$ErrorMessage = $_.Exception.Message
	        Write-Output "Rename failed: $ErrorMessage"}}
	Else
	    {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"}
</powershell>
```

------
#### [ IMDSv1 ]

```
<powershell>
	$instanceId = (Invoke-WebRequest http://169.254.169.254/latest/meta-data/instance-id -UseBasicParsing).content
	$nameValue = (Get-EC2Tag -Filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value
	$pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$"
	#Verify Name Value satisfies best practices for Windows hostnames
	If ($nameValue -match $pattern) 
	    {Try
	        {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} 
	    Catch
	        {$ErrorMessage = $_.Exception.Message
	        Write-Output "Rename failed: $ErrorMessage"}}
	Else
	    {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"}
</powershell>
```

------

인스턴스가 인스턴스 메타데이터의 태그에 액세스하도록 구성된 경우 인스턴스 메타데이터의 태그를 사용하여 인스턴스 이름을 바꿀 수도 있습니다. 자세한 내용은 [인스턴스 메타데이터를 사용하여 EC2 인스턴스의 태그 보기](work-with-tags-in-IMDS.md) 섹션을 참조하세요.

------
#### [ IMDSv2 ]

```
<powershell>
    [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing
	$nameValue = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/tags/instance/Name' -UseBasicParsing
	$pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$"
	#Verify Name Value satisfies best practices for Windows hostnames
	If ($nameValue -match $pattern) 
	    {Try
	        {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} 
	    Catch
	        {$ErrorMessage = $_.Exception.Message
	        Write-Output "Rename failed: $ErrorMessage"}}
	Else
	    {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"}
</powershell>
```

------
#### [ IMDSv1 ]

```
<powershell>
	$nameValue = Get-EC2InstanceMetadata -Path /tags/instance/Name
	$pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$"
	#Verify Name Value satisfies best practices for Windows hostnames
	If ($nameValue -match $pattern) 
	    {Try
	        {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} 
	    Catch
	        {$ErrorMessage = $_.Exception.Message
	        Write-Output "Rename failed: $ErrorMessage"}}
	Else
	    {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"}
</powershell>
```

------

# 단일 요청으로 시작된 각 인스턴스를 식별합니다.
<a name="AMI-launch-index-examples"></a>

이 예제는 사용자 데이터 및 인스턴스 메타데이터를 사용하여 Amazon EC2 인스턴스를 구성하는 방법을 보여줍니다.

**참고**  
이 섹션의 예에서는 IMDS의 IPv4 주소(`169.254.169.254`)를 사용합니다. IPv6 주소를 통해 EC2 인스턴스의 인스턴스 메타데이터를 검색하는 경우, 대신 IPv6 주소(`[fd00:ec2::254]`)를 활성화하고 사용해야 합니다. IMDS의 IPv6 주소는 IMDSv2 명령과 호환됩니다. IPv6 주소는 [IPv6 지원 서브넷](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)(듀얼 스택 또는 IPv6 전용)의 [Nitro 기반 인스턴스](instance-types.md#instance-hypervisor-type)에서만 액세스할 수 있습니다.

Alice는 데이터베이스 AMI 인스턴스 4개를 시작하여 그 중 첫 번째 인스턴스는 원래 인스턴스의 역할을 하고 나머지 3개는 복제본의 역할을 하도록 하려고 합니다. 그러한 인스턴스는 시작되었을 때 각 복제본의 복제 전략에 대한 사용자 데이터가 추가될 수 있어야 합니다. Alice는 네 인스턴스 모두에서 이 데이터가 사용될 수 있다는 것을 알고 있기 때문에 각 인스턴스가 적용 가능한 부분을 인식할 수 있도록 하는 방식으로 사용자 데이터를 구축해야 합니다. Alice는 `ami-launch-index` 인스턴스 메타데이터 값을 이용하여 이를 수행할 수 있고 이 값은 각 인스턴스에서 공유합니다. 1개 이상의 인스턴스를 동시에 시작하는 경우 `ami-launch-index`는 인스턴스가 시작되는 순서를 나타냅니다. 첫 번째 인스턴스의 값은 `0`입니다.

Alice가 구성한 사용자 데이터는 다음과 같습니다.

```
replicate-every=1min | replicate-every=5min | replicate-every=10min
```

`replicate-every=1min` 데이터는 최초 복제 구성을 정의하고 `replicate-every=5min`는 두 번째 복제 구성을 정의하는 식으로 동작합니다. Alice는 서로 다른 인스턴스의 데이터 구분자로 파이프 기호(`|`)를 사용하는 ASCII 문자열로 이 데이터를 제공하려 합니다.

Alice는 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 명령을 사용하여 4개의 인스턴스를 시작하고 사용자 데이터를 지정합니다.

```
aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --count 4 \
    --instance-type t2.micro \
    --user-data "replicate-every=1min | replicate-every=5min | replicate-every=10min"
```

시작된 이후 모든 인스턴스는 다음과 같은 사용자 데이터 및 공통 메타데이터 사본을 갖습니다.
+ AMI ID: ami-0abcdef1234567890
+ 예약 ID: r-1234567890abcabc0
+ 퍼블릭 키: 없음 
+ 보안 그룹 이름: 기본
+ 인스턴스 유형: t2.micro

그러나 다음 표와 같이 각 인스턴스에는 고유한 메타데이터가 있습니다.


| Metadata | 값 | 
| --- | --- | 
| instance-id | i-1234567890abcdef0 | 
| ami-launch-index | 0 | 
| public-hostname | ec2-203-0-113-25.compute-1.amazonaws.com | 
| public-ipv4 | 67.202.51.223 | 
| local-hostname | ip-10-251-50-12.ec2.internal | 
| local-ipv4 | 10.251.50.35 | 


| Metadata | 값 | 
| --- | --- | 
| instance-id | i-0598c7d356eba48d7 | 
| ami-launch-index | 1 | 
| public-hostname | ec2-67-202-51-224.compute-1.amazonaws.com | 
| public-ipv4 | 67.202.51.224 | 
| local-hostname | ip-10-251-50-36.ec2.internal | 
| local-ipv4 | 10.251.50.36 | 


| Metadata | 값 | 
| --- | --- | 
| instance-id | i-0ee992212549ce0e7 | 
| ami-launch-index | 2 | 
| public-hostname | ec2-67-202-51-225.compute-1.amazonaws.com | 
| public-ipv4 | 67.202.51.225 | 
| local-hostname | ip-10-251-50-37.ec2.internal | 
| local-ipv4 | 10.251.50.37 | 


| Metadata | 값 | 
| --- | --- | 
| instance-id | i-1234567890abcdef0 | 
| ami-launch-index | 3 | 
| public-hostname | ec2-67-202-51-226.compute-1.amazonaws.com | 
| public-ipv4 | 67.202.51.226 | 
| local-hostname | ip-10-251-50-38.ec2.internal | 
| local-ipv4 | 10.251.50.38 | 

Alice는 `ami-launch-index` 값을 사용하여 사용자 데이터의 어느 부분이 특정 인스턴스에 적용 가능한지를 결정할 수 있습니다.

1. Alice는 인스턴스 중 하나에 접속한 다음 해당 인스턴스의 `ami-launch-index`를 검색하여 복제본인지 확인합니다.

------
#### [ IMDSv2 ]

   ```
   [ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/meta-data/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/meta-data/ami-launch-index
   2
   ```

   다음 단계의 경우 토큰이 만료되지 않았다고 가정하고 IMDSv2 요청에서 이전 IMDSv2 명령의 저장된 토큰을 사용합니다.

------
#### [ IMDSv1 ]

   ```
   [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-launch-index
   2
   ```

------

1. `ami-launch-index`를 변수로 저장합니다.

------
#### [ IMDSv2 ]

   ```
   [ec2-user ~]$ ami_launch_index=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-launch-index`
   ```

------
#### [ IMDSv1 ]

   ```
   [ec2-user ~]$ ami_launch_index=`curl http://169.254.169.254/latest/meta-data/ami-launch-index`
   ```

------

1. 사용자 데이터를 변수로 저장합니다.

------
#### [ IMDSv2 ]

   ```
   [ec2-user ~]$ user_data=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data`
   ```

------
#### [ IMDSv1 ]

   ```
   [ec2-user ~]$ user_data=`curl http://169.254.169.254/latest/user-data`
   ```

------

1. 마지막으로 Alice는 **cut** 명령을 사용하여 해당 인스턴스에 적용 가능한 사용자 데이터 부분을 추출합니다.

------
#### [ IMDSv2 ]

   ```
   [ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index"
   replicate-every=5min
   ```

------
#### [ IMDSv1 ]

   ```
   [ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index"
   replicate-every=5min
   ```

------