

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用執行個體中繼資料管理您的 EC2 執行個體
<a name="ec2-instance-metadata"></a>

*執行個體中繼資料* 是關於您執行個體的資料，您可以用來設定或管理執行中的執行個體。執行個體中繼資料包括下列項目：

**執行個體中繼資料屬性**  
執行個體中繼資料屬性會分為幾個[類別](#instancedata-data-categories)，例如主機名稱、事件及安全群組。

**動態資料**  
動態資料為執行個體啟動時產生的中繼資料，例如執行個體身分文件。如需詳細資訊，請參閱[動態資料分類](#dynamic-data-categories)。

**使用者資料**  
您也可以使用執行個體中繼資料，存取您在啟動執行個體時指定的*使用者資料*。例如，您可以指定設定您執行個體的參數，或是包含簡單的指令碼。您也可以建立一般 AMI 並使用使用者資料，修改啟動時提供的組態檔案。例如，如果您執行不同小型企業的 Web 伺服器，它們全部都可以使用相同的一般 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 hypervisor 的執行個體，您可以[停止然後啟動](Stop_Start.md)執行個體，以更新執行個體可用的類別。

下表列出執行個體中繼資料的分類。下表中的某些類別名稱包含對您的執行個體而言唯一的資料預留位置。例如，*mac* 代表網路介面的 MAC 地址。擷取執行個體中繼資料時，必須使用實際的值取代預留位置。


| 類別 | 描述 | 類別發佈時的版本 | 
| --- | --- | --- | 
| ami-id  | 用於啟動執行個體的 AMI ID。 | 1.0 | 
| ami-launch-index  | 如果您使用相同的 RunInstances 呼叫啟動多個執行個體，此值會指出每個執行個體的啟動順序。第一個啟動的執行個體值為 0。如果您使用自動擴展或 EC2 機群啟動執行個體，此值一律為 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 日期、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 | 執行個體身分角色的登入資料，允許執行個體上的軟體向 自我識別 AWS ，以支援 EC2 Instance Connect 和 AWS Systems Manager 預設主機管理組態等功能。這些登入資料未連接任何政策，因此除了識別 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-01 | 
| 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 裝置。此類別對應到 Amazon EC2 API 和 AWS CLI的 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-01 | 
|  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)。只有在 Spot 執行個體已標記為休眠、停止或終止時，才會顯示此項目。如需詳細資訊，請參閱[instance-action](spot-instance-termination-notices.md#instance-action-metadata)。  | 2016-11-15 | 
|  spot/termination-time  |  Spot 執行個體的作業系統接收關機訊號的近似時間 (UTC)。此項目只有在 Spot 執行個體已由 Amazon EC2 標記為終止時，才會存在且包含時間值 (例如，2015-01-05T18:02:00Z)。若您自行終止 Spot 執行個體，則 termination-time 項目便不會設為時間。如需詳細資訊，請參閱[termination-time](spot-instance-termination-notices.md#termination-time-metadata)。  | 2014-11-05 | 
| system | 執行個體的基礎虛擬化類型 (Hypervisor)。 | 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 中啟用詳細一分鐘監控的值。有效值：enabled \$1 disabled | 2009-04-04 | 
| instance-identity/document  | 包含執行個體屬性的 JSON，例如 instance-id、私有 IP 地址等。請參閱 [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)。如需使用 的 Linux 範例 AWS CLI，請參閱 [modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html)。如需使用 Tools for 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 擷取字符**  
向任何版本特定的路徑發出 `PUT` 請求 (例如 `/2021-03-23/api/token`)，將導致中繼資料服務傳回 403 Forbidden 錯誤。這是預期行為。

**中繼資料版本**  
為避免每次 Amazon EC2 發佈新的執行個體中繼資料建置時都必須更新您的程式碼，我們建議您在路徑中使用 `latest`，而不是版本編號。

**IPv6 支援**  
若要使用 IPv6 地址擷取執行個體中繼資料，請確定啟用及使用 IMDS 的 IPv6 地址 `[fd00:ec2::254]`，而不是 IPv4 地址 `169.254.169.254`。執行個體必須是在[支援 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 建立自訂 AMIs**  
若要在您從自訂 Windows AMI 啟動執行個體確保 IMDS 正常運作，AMI 必須是使用 Windows Sysprep 建立的標準化映像。否則，IMDS 將無法運作。如需詳細資訊，請參閱[使用 Windows Sysprep 建立 Amazon EC2 AMI](ami-create-win-sysprep.md)。

**在容器環境中，考慮重新設定或將跳轉限制增加到 2**  
根據預設 AWS SDKs 會使用 IMDSv2 呼叫。如果 IMDSv2 呼叫未收到回應，則 AWS SDKs會重試呼叫，如果仍然失敗，請使用 IMDSv1。這可能會導致延遲，特別是在容器環境中。對於*需要* IMDSv2 AWS SDKs，如果跳轉限制在容器環境中為 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 Network Time Protocol (NTP)](set-time.md) 請求和 [Windows Licensing Service (適用於 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 編碼。第 1 AWS CLI 版會為您執行`--user-data`參數的 base64 編碼。
  + 會為您 適用於 Python (Boto3) 的 AWS SDK 執行 `UserData` 參數的 base64 編碼。
+ 使用者資料在 base64 編碼之前限制為 16 KB (原始形式)。長度為 *n* 的字串在 base64 編碼之後的大小為 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 位址是連結本機位址且僅在執行個體中有效。如需詳細資訊，請參閱[Link-local 地址](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` 擷取高層級的執行個體身分類別。

*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 擷取高層級的執行個體身分類別。

*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 地址擷取使用者資料，您必須先啟用並確保該執行個體是 [Nitro 型執行個體](instance-types.md#instance-hypervisor-type)，且位於支援 IPv6 的子網路中。

**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 伺服器出現錯誤時傳回錯誤狀態碼。如果您啟用錯誤處理，Shell 可能會攔截錯誤並停止指令碼。

## 查詢調節
<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)可存取。

下列範例會使用 Shell 指令碼和 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)，時間會以秒數表示且最長可達 6 小時 (21,600 秒)。字符會代表邏輯工作階段。TTL 會指定字符有效的時間長度，也就是工作階段的持續期間。
   + 在字符到期之後，若要繼續存取執行個體中繼資料，您必須使用另一個 `PUT` 建立新的工作階段。
   + 您可以選擇重複使用字符或使用每個請求來建立新字符。對於少量請求，您每次需要存取 IMDS 時，就能更輕鬆地產生和立即使用字符。但為了提升效率，您可以為該字符指定時間更長的持續期間，然後再重複使用該字符，而不需要在每次要請求執行個體中繼資料時寫入 `PUT`。並行字符數量沒有實際限額，每個都代表它自己的工作階段。但 IMDS2 仍會受到正常 IMDS 連線和調節限額的限制。如需詳細資訊，請參閱[查詢調節](instancedata-data-retrieval.md#instancedata-throttling)。

HTTP `GET` 及 `HEAD` 方法可在 IMDSv2 執行個體中繼資料請求中使用。如果 `PUT` 請求包含 X-Forwarded-For 標頭，則會遭到拒絕。

依預設，`PUT` 請求在 IP 通訊協定等級的 `1` 回應跳轉限額 (存留時間)。如果您需要更大的跳轉限制，您可以使用 [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 SDKs 的最新版本都支援使用 IMDSv2。

**重要**  
建議您保持最新的 SDK 版本，以確保使用最新功能、安全性更新和基礎相依性。不建議您繼續使用不受支援的開發套件版本，由您自行決定。如需詳細資訊，請參閱「AWS 開發套件和工具參考指南」**中的 [AWS 開發套件及工具維護政策](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
+ [適用於 .NET 的 AWS SDK](https://github.com/aws/aws-sdk-net) – 3.3.634.1
+ [適用於 C\$1\$1 的 AWS SDK](https://github.com/aws/aws-sdk-cpp) – 1.7.229
+ [適用於 Go 的 AWS SDK](https://github.com/aws/aws-sdk-go) – 1.25.38
+ [AWS SDK for Go v2](https://github.com/aws/aws-sdk-go-v2) – 0.19.0
+ [適用於 Java 的 AWS SDK](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
+ [適用於 Kotlin 的 AWS SDK](https://github.com/awslabs/aws-sdk-kotlin) – 1.1.4
+ [適用於 PHP 的 AWS SDK](https://github.com/aws/aws-sdk-php) – 3.147.7
+ [AWS 適用於 Python 的 SDK (Botocore)](https://github.com/boto/botocore) – 1.13.25
+ [適用於 Python (Boto3) 的 AWS SDK](https://github.com/boto/boto3) – 1.12.6
+ [適用於 Ruby 的 AWS SDK](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 SDKs 支援 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 Packet Analyzer**  
IMDS Packet Analyzer 是一種開放原始碼工具，可在執行個體的開機階段和執行時間操作期間識別和記錄 IMDSv1 呼叫。透過分析這些日誌，您可以精確識別在執行個體上進行 IMDSv1 呼叫的軟體，並判斷哪些項目需要更新，才能僅在執行個體上支援 IMDSv2。您可以從命令列執行 IMDS Packet Analyzer，或將其安裝為服務。如需詳細資訊，請參閱 *GitHub* 上的 [AWS ImdsPacketAnalyzer](https://github.com/aws/aws-imds-packet-analyzer)。

**CloudWatch**  
CloudWatch 提供下列兩個指標來監控您的執行個體：  
`MetadataNoToken` – IMDSv2 使用字符後端工作階段，而 IMDSv1 不使用。`MetadataNoToken` 指標會追蹤呼叫使用 IMDSv1 的執行個體中繼資料服務 (IMDS) 的次數。透過追蹤此指標至零，您可以決定是否要升級所有軟體以使用 IMDSv2 及升級時間。  
`MetadataNoTokenRejected` – 停用 IMDSv1 之後，您可以使用 `MetadataNoTokenRejected` 指標來追蹤 IMDSv1 呼叫嘗試和拒絕的次數。透過追蹤此指標，您可以確定自己的軟體是否需要更新才能使用 IMDSv2。  
對於每個 EC2 執行個體，這些指標是互斥的。啟用 IMDSv1 時 `MetadataNoToken` (`httpTokens = optional`)，只會發出 。當 IMDSv1 停用時 `MetadataNoTokenRejected` (`httpTokens = required`)， 只會發出。如需何時使用這些指標，請參閱 [需要 IMDSv2 的建議路徑](#recommended-path-for-requiring-imdsv2)。  
如需詳細資訊，請參閱[執行個體指標](viewing_metrics_with_cloudwatch.md#ec2-cloudwatch-metrics)。

**啟動 APIs**  
**新執行個體：**使用 [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API 啟動需要使用 IMDSv2 的新執行個體。如需詳細資訊，請參閱[設定新執行個體的執行個體中繼資料選項](configuring-IMDS-new-instances.md)。  
**現有執行個體：**使用 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API 要求在現有執行個體上使用 IMDSv2。如需詳細資訊，請參閱[修改現有執行個體的執行個體中繼資料選項](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)時，必須設定 `MetadataOptions` 參數以要求使用 IMDSv2。Auto Scaling 群組會使用新啟動範本或啟動組態來啟動新執行個體，但現有的執行個體不受影響。  
**Auto Scaling 群組中的現有執行個體：**使用 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API 要求在現有執行個體上使用 IMDSv2，或終止執行個體，Auto Scaling 群組將使用新啟動範本或啟動組態中定義的執行個體中繼資料選項設定來啟動新的替換執行個體。

**AMI**  
設定為 `ImdsSupport` 參數的 AMIs 預設`v2.0`會啟動需要 IMDSv2 的執行個體。Amazon Linux 2023 已使用 設定`ImdsSupport = v2.0`。  
**新 AMIs：**建立新的 AMI `v2.0`時，使用 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) CLI 命令將 `ImdsSupport` 參數設定為 。  
**現有 AMIs：**使用 [modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) CLI 命令，在修改現有 AMI `v2.0`時將 `ImdsSupport` 參數設定為 。  
如需詳細資訊，請參閱[設定 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 啟動執行個體。
+ 無法使用 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API 修改現有執行個體，以重新啟用 IMDSv1。
IAM 政策或 SCP 必須包含下列 IAM 條件索引鍵：  
+ `ec2:MetadataHttpEndpoint`
+ `ec2:MetadataHttpPutResponseHopLimit`
+ `ec2:MetadataHttpTokens`
如果 API 或 CLI 呼叫中的參數不符合包含條件金鑰的政策中指定的狀態，則 API 或 CLI 呼叫會失敗並顯示 `UnauthorizedOperation` 回應。  
此外，您可以選擇另外一個保護層，以強制執行從 IMDSv1 變更為 IMDSv2 的作業。在與透過 EC2 角色登入資料呼叫APIs 相關的存取管理層中，您可以在 IAM 政策 AWS Organizations 或服務控制政策 (SCPs) 中使用條件金鑰。具體而言，在 IAM 政策中使用數值為 `2.0` 的條件索引鍵 `ec2:RoleDelivery`，從 IMDSv1 取得之 EC2 角色憑證產生的 API 呼叫都會收到 `UnauthorizedOperation` 回應。也能利用 SCP 要求的條件進行更廣泛範圍的作業。這可確保透過 IMDSv1 提供的登入資料無法確實用於呼叫 API，因為與指定條件不相符的任何 API 呼叫，將會收到 `UnauthorizedOperation` 錯誤。  
如需 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) 在整個組織中集中設定 IMDS 帳戶預設值，包括 IMDSv2 強制執行。如需範例政策，請參閱*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=選用和稽核 IMDSv1 用量來識別執行個體](#path-step-1)
+ [步驟 2：將軟體更新至 IMDSv2](#path-step-2)
+ [步驟 3：執行個體需要 IMDSv2](#path-step-3)
+ [步驟 4：將 IMDSv2=必要設為預設值](#path-step-4)
+ [步驟 5：強制執行個體要求 IMDSv2](#path-step-5)

### 步驟 1：使用 IMDSv2=選用和稽核 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 = 選用**。

   1. 或者，若要查看所有執行個體的 IMDSv2 是否為**選用**或**必要**，請開啟**偏好設定**視窗 （齒輪圖示），開啟 **IMDSv2**，然後選擇**確認**。這會將 **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 Packet Analyzer](https://github.com/aws/aws-imds-packet-analyzer) 在執行個體的開機階段和執行時間操作期間識別和記錄 IMDSv1 呼叫。使用此資訊來識別要更新的軟體，讓您的執行個體準備好僅使用 IMDSv2。您可以從命令列執行 IMDS Packet Analyzer，或將其安裝為服務。

### 步驟 2：將軟體更新至 IMDSv2
<a name="path-step-2"></a>

將執行個體上使用角色登入資料的所有 SDKs、CLIs 和軟體更新為 IMDSv2-compatible版本。如需更新 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 呼叫後，請將您現有的執行個體設定為需要 IMDSv2。此外，將所有新執行個體設定為需要 IMDSv2。換句話說，在所有現有和新的執行個體上停用 IMDSv1。

1. **將現有執行個體設定為需要 IMDSv2：**

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

   1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 在導覽窗格中，選擇 **Instances** (執行個體)。

   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. 使用 `MetadataNoTokenRejected` CloudWatch 指標追蹤 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=必要設為預設值
<a name="path-step-4"></a>

您可以在帳戶或組織層級將 IMDSv2=必要設定為預設組態。這可確保所有新啟動的執行個體都會自動設定為需要 IMDSv2。

1. **設定帳戶層級預設值：**

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

   1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 在導覽窗格中，選擇 **Dashboard (儀表板)**。

   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 的組織預設值設定為必要。如需範例政策，請參閱*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 **

   您可以在每個帳戶層級強制使用 IMDSv2 AWS 區域。強制執行時，執行個體只能在設定為需要 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 強制執行`httpTokens`，且在啟動時執行個體組態、帳戶設定或 AMI 組態`required`中未設定為 ，則執行個體啟動將會失敗。如需故障診斷資訊，請參閱[啟動IMDSv1-enabled的執行個體失敗](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) APIs和對應 CLIs。如果已建立政策，而且 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，建議您修改網路設備的組態，以捨棄 IMDS 目的地 IPv4 地址為 `169.254.169.254` 的封包；在啟用 IPv6 端點的情況下，則捨棄 IMDS 目的地 IPv6 地址 `[fd00:ec2::254]` 的封包。

## 限制 Linux 執行個體的 IMDS 存取
<a name="instance-metadata-limiting-access-linux"></a>

**使用 iptables 限制存取**

下列範例會使用 Linux iptables 及其 `owner` 模組以防止 Apache Web 伺服器 (依據 `apache` 的預設安裝使用者 ID) 存取 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 Webs 伺服器 (依據 `NT AUTHORITY\IUSR` 的預設安裝使用者 ID) 存取 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` 中指定 OS 群組身分執行的所有程序存取執行個體中繼資料 (在此範例中，Windows 群組 `Everyone`)，但 `exceptionPrincipal` 中指定的程序除外 (在此範例中，是名為 `trustworthy-users` 的群組)。您必須指定拒絕和允許原則，因為 Windows 防火牆 (與 Linux iptables 中的 `! --uid-owner trustworthy-user` 規則不同) 不會提供快速鍵機制，以透過拒絕所有其他規則而僅允許特定原則 (使用者或群組)。

```
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 執行個體本機上執行。*執行個體中繼資料選項*是指一組能控制 IMDS 在 EC2 執行個體上的可存取性和行為的祖態。

您可以在每個執行個體上設定下列執行個體中繼資料選項：

**執行個體中繼資料服務 (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 組態`required`中`httpTokens`設定為 ，則您的啟動將會失敗。

**範例 1 – 判斷中繼資料選項的值**

在此範例中，EC2 執行個體會在將 `HttpPutResponseHopLimit` 以帳戶層級設定為 `1` 的區域中啟動。指定的 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/zh_tw/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，您必須[更新至 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/)，才能使用 IMDSv2。

# 設定新執行個體的執行個體中繼資料選項
<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>

您可以在帳戶層級為每個執行個體中繼資料服務 (IMDS) 設定預設版本 AWS 區域。這表示在啟動*新的*執行個體時，執行個體中繼資料版本會自動設定為帳戶層級的預設值。但是，您可以在啟動時或啟動後手動覆寫該值。如需有關帳戶層級設定和手動覆寫如何影響執行個體的詳細資訊，請參閱 [執行個體中繼資料選項的優先順序](configuring-instance-metadata-options.md#instance-metadata-options-order-of-precedence)。

**注意**  
設定帳戶層級預設值不會重設*現有的*執行個體。例如，如果您將帳戶層級預設值設定為 IMDSv2，則任何設為 IMDSv1 的現有執行個體都不會受到影響。若要變更現有執行個體的值，您必須手動變更執行個體本身的值。

您可以將執行個體中繼資料版本的帳戶預設值設定為 IMDSv2，因此所有在帳戶啟動中的*新*執行個體都需要 IMDSv2，且 IMDSv1 會停用。當您使用此帳戶預設值啟動執行個體時，下列是執行個體的預設值：
+ 主控台：**中繼資料版本**僅設定為 **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. 在導覽窗格中，選擇 **Dashboard (儀表板)**。

1. 在**帳戶屬性**卡片**的設定**下，選擇**資料保護和安全性**。

1. 在 **IMDS 預設值**旁邊，選擇**管理**。

1. 在**管理 IMDS 預設值**頁面上，執行下列操作：

   1. 在**執行個體中繼資料服務**中，選擇**啟用**。

   1. 針對 **Metadata version** (中繼資料版本)，選擇 **V2 only (token required)** (僅限 V2 (需要權杖))。

   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>

您可以在每個帳戶層級強制使用 IMDSv2 AWS 區域。強制執行時，執行個體只能在設定為需要 IMDSv2 時啟動。無論執行個體或 AMI 的設定方式為何，此強制執行都適用。

**注意**  
在帳戶層級啟用 IMDSv2 強制執行之前，請確定您的應用程式和 AMIs 支援 IMDSv2。如需詳細資訊，請參閱[需要 IMDSv2 的建議路徑](instance-metadata-transition-to-version-2.md#recommended-path-for-requiring-imdsv2)。如果已啟用 IMDSv2 強制執行`httpTokens`，且在啟動時執行個體組態、帳戶設定或 AMI 組態`required`中未設定為 ，則執行個體啟動將會失敗。如需故障診斷資訊，請參閱[啟動IMDSv1-enabled的執行個體失敗](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. 在導覽窗格中，選擇 **Dashboard (儀表板)**。

1. 在**帳戶屬性**卡片**的設定**下，選擇**資料保護和安全性**。

1. 在 **IMDS 預設值**旁邊，選擇**管理**。

1. 在**管理 IMDS 預設值**頁面上，執行下列操作：

   1. 針對 **Metadata version** (中繼資料版本)，選擇 **V2 only (token required)** (僅限 V2 (需要權杖))。

   1. 針對**強制執行 IMDSv2**，選擇**已啟用**。

   1. 選擇**更新**。

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

**為指定區域中的帳戶強制執行 IMDSv2**  
 使用 [modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 命令，並指定要在其中強制執行 IMDSv2 的區域。

```
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 主控台中啟動新執行個體時，展開 **Advanced details** (進階詳細資訊)，並執行下列動作：
  + 針對 **Metadata accessible** (可存取中繼資料)，選擇 **Enabled** (已啟用)。
  + 針對 **Metadata version** (中繼資料版本)，選擇 **V2 only (token required)** (僅限 V2 (需要權杖))。
  + (容器環境) 在**中繼資料回應跳轉限制**中，選擇 **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 範例會啟動`c6i.large`執行個體，並將 `MetadataOptions_HttpEndpoint` 設定為 `enabled`，並將 `MetadataOptions_HttpTokens` 參數設定為 `required`。當您為 `HttpTokens` 指定值時，您也必須將 `HttpEndpoint` 設定為 `enabled`。由於中繼資料擷取請求的安全權杖標頭設定為 `required`，因此在要求執行個體中繼資料時需要執行個體使用 IMDSv2。

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

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

若要使用 指定執行個體的中繼資料選項 CloudFormation，請參閱*AWS CloudFormation 《 使用者指南*》中的 [AWS::EC2::LaunchTemplate MetadataOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html) 屬性。

------

### 設定 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。為 `imds-support` 參數指定 `v2.0`，以便從此 AMI 啟動的執行個體在請求執行個體中繼資料時要求使用 IMDSv2。

```
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 根磁碟區的指定快照，將 AMI 註冊為裝置 `/dev/xvda`。為 `ImdsSupport` 參數指定 `v2.0`，以便從此 AMI 啟動的執行個體在請求執行個體中繼資料時要求使用 IMDSv2。

```
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。為 `imds-support` 參數指定 `v2.0`，以便從此 AMI 啟動的執行個體在請求執行個體中繼資料時要求使用 IMDSv2。

```
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。為 `imds-support` 參數指定 `v2.0`，以便從此 AMI 啟動的執行個體在請求執行個體中繼資料時要求使用 IMDSv2。

```
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 端點**
+ 在 Amazon EC2 主控台中[啟動執行個體](ec2-launch-instance-wizard.md)，並在 **Advanced details** (進階詳細資訊) 下指定以下內容：
  + 在**中繼資料 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) 範例會啟動已啟用執行個體中繼資料服務 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 範例會啟動`c6i.large`執行個體，並為 IMDS 啟用 IPv6 端點。若要啟用 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 存取權。`public-keys/0/openssh-key` 是執行個體的公有 SSH 金鑰，它將不可存取，因為通常會從 EC2 執行個體中繼資料中提供並存取該金鑰。
EC2 使用者資料將無法使用，且不會在執行個體啟動時執行。EC2 使用者資料託管於 IMDS。如果停用 IMDS，可以有效地關閉對使用者資料的存取。
若要存取此功能，可以在啟動後重新啟用 IMDS。

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

**啟動時關閉對執行個體中繼資料的存取**
+ 在 Amazon EC2 主控台中[啟動執行個體](ec2-launch-instance-wizard.md)，並在 **Advanced details** (進階詳細資訊) 下指定以下內容：
  + 針對 **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 《 使用者指南*》中的 [AWS::EC2::LaunchTemplate MetadataOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html) 屬性。

------

## 允許存取執行個體中繼資料中的標籤
<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 使用量記錄為零時，則執行個體準備好需要 IMDSv2。

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

**要求在現有執行個體上使用 IMDSv2**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇 **Instances** (執行個體)。

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 設定為選用 (`httpTokens = optional`)。

`httpTokensEnforced` IMDS 屬性也會防止嘗試在現有執行個體上啟用 IMDSv1。為區域中的帳戶啟用 時，嘗試`httpTokens`將 設定為 `optional`會導致`UnsupportedOperation`例外狀況。如需詳細資訊，請參閱 [疑難排解](#troubleshoot-modifying-an-imdsv1-enabled-instance-fails)。

**重要**  
如果您的執行個體啟動因 IMDSv2 強制執行而失敗，您有兩個選項可以讓啟動成功：  
將**執行個體啟動為IMDSv2-only** – 如果在執行個體上執行的軟體僅使用 IMDSv2 （不依賴 IMDSv1)，則您只能將執行個體啟動為僅限 IMDSv2。若要執行此作業，請在啟動參數`httpTokens = required`中設定 IMDSv2，或在區域中帳戶的中繼資料預設值中設定 IMDSv2。
**停用強制執行** – 如果您的軟體仍然依賴 IMDSv1，`disabled`請將 區域中帳戶的 `httpTokensEnforced`設為 。如需詳細資訊，請參閱[在帳戶層級強制執行 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. 在導覽窗格中，選擇 **Instances** (執行個體)。

1. 選取執行個體。

1. 選擇**動作**、**執行個體設定**、**修改執行個體中繼資料選項**。

1. 在**修改執行個體中繼資料選項**對話方塊中，執行下列動作：

   1. 針對**執行個體中繼資料服務**，請確定已選取**啟用**。

   1. 針對 **IMDSv2**，請選擇**選用**。

   1. 選擇**儲存**。

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

**在執行個體上還原使用 IMDSv1**  
您可使用 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 命令並將 `http-tokens` 設定為 `optional`，以在要求執行個體中繼資料時還原使用 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 SDKs 支援變更 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 SDKs 支援在執行個體啟動後啟用 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. 在導覽窗格中，選擇 **Instances** (執行個體)。

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. 在導覽窗格中，選擇 **Instances** (執行個體)。

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-enabled的執行個體失敗
<a name="modifying-an-imdsv1-enabled-instance-fails"></a>

#### Description
<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 組織宣告政策強制使用 IMDSv2 () 的帳戶中將現有執行個體修改為啟用 IMDSv1 () 時，就會擲出此錯誤`httpTokensEnforced = enabled`。`httpTokens = optional` IMDSv2 

#### 解決方案
<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：shell 指令碼和 cloud-init 指示詞。您也可以將這項資料以純文字、檔案 (在使用命令列工具啟動執行個體時很有用) 或 Base64 編碼文字 (適用於 API 呼叫) 傳遞給啟動執行個體精靈。

在 Windows 執行個體，啟動代理程式會處理您的使用者資料指令碼。

**考量事項**
+ 使用者資料或會做為不透明資料處理：您給予的即為您取回的。是否要解譯則取決於執行個體。
+ 使用者資料必須為 base64 編碼形式。Amazon EC2 主控台可為您執行 base64 編碼，或是接受 base64 編碼輸入。如果您使用執行個體中繼資料或主控台擷取使用者資料，將會自動為您進行 base64 解碼。
+ 使用者資料在 base64 編碼之前限制為 16 KB (原始形式)。長度為 *n* 的字串在 base64 編碼之後的大小為 ceil(*n*/3)\$14。
+ 使用者資料是執行個體屬性。如果您從執行個體建立 AMI，執行個體使用者資料不會包含在 AMI 中。

## 中的使用者資料 AWS 管理主控台
<a name="user-data-console"></a>

您可以在啟動執行個體時指定執行個體使用者資料。若執行個體的根磁碟區為 EBS 磁碟區，您也可以停止執行個體並更新其使用者資料。

### 使用啟動精靈在啟動時指定執行個體使用者資料
<a name="user-data-launch-instance-wizard"></a>

您可以在使用 EC2 主控台的啟動精靈啟動執行個體時指定使用者資料。若要在啟動時指定使用者資料，請遵循[啟動執行個體](ec2-launch-instance-wizard.md)的程序。此 **User data** (使用者資料) 欄位位於啟動執行個體精靈的 [進階詳細資訊](ec2-instance-launch-parameters.md#liw-advanced-details) 區段中。在**使用者資料**欄位輸入 PowerShell 指令碼，然後完成執行個體啟動程序。

在以下**使用者資料**欄位的螢幕擷取畫面中，範例指令碼會在 Windows 暫時資料夾中建立一個檔案，並在檔名中使用目前日期和時間。當您包括 `<persist>true</persist>` 時，指令碼會在您每次重新開機或啟動執行個體時執行。如果您將**使用者資料已使用 base64 編碼**核取方塊留白，Amazon EC2 主控台會為您執行 base64 編碼。

![\[Advanced Details (進階詳細資訊) 使用者資料文字欄位。\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/images/configure_ec2config_userdata.png)


如需詳細資訊，請參閱[使用啟動精靈在啟動時指定執行個體使用者資料](#user-data-launch-instance-wizard)。如需使用 的 Linux 範例 AWS CLI，請參閱 [使用者資料和 AWS CLI](#user-data-api-cli)。如需使用 Tools for 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. 在導覽窗格中，選擇 **Instances** (執行個體)。

1. 選取執行個體，並選取 **Actions (動作)**、**Instance state (執行個體狀態)**、**Stop instance (停止執行個體)**。
**警告**  
當您停止執行個體時，執行個體存放磁碟區上的資料會遺失。若要保留此資料，請將其備份至持久性儲存。

1. 出現確認提示時，請選擇 **Stop (停止)**。停止執行個體可能需要幾分鐘。

1. 在仍然選取執行個體的情況下，選取**動作** > **執行個體設定** > **編輯使用者資料**。您無法在執行個體仍在執行中時變更使用者資料，但您可以檢視它。

1. 在 **Edit user data (編輯使用者資料)** 對話方塊中，更新使用者資料，然後選擇 **Save (儲存)**。若要在每次重新開機或啟動執行個體時執行使用者資料指令碼，請新增 `<persist>true</persist>`，如下範例所示：  
![\[Edit User Data (編輯使用者資料) 對話方塊。\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/images/view-change-user-data.png)

1. 啟動實例。若您已為後續的重新開機或啟動啟用使用者資料執行，即會在執行個體啟動程序期間執行更新的使用者資料指令碼。

## Amazon EC2 如何處理 Linux 執行個體的使用者資料
<a name="userdata-linux"></a>

以下範例利用使用者資料來執行命令，可在啟用執行個體時設定 LAMP 伺服器。在每個範例中，都會執行以下任務：
+ 更新分佈軟體套件。
+ 安裝 Web 伺服器、`php` 和 `mariadb` 套件。
+ 啟動並開啟 `httpd` 服務。
+ 使用者 `ec2-user` 即會新增至 apache 群組。
+ 接著便會為 Web 目錄和其中包含的檔案設定適當的所有權和檔案許可。
+ 一的簡單的網頁便會建立，用於測試 Web 伺服器和 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)
+ [結合 shell 指令碼與 cloud-init 指令](#user-data-mime-multi)

### 先決條件
<a name="user-data-requirements"></a>

此主題中的範例假設如下內容：
+ 您的執行個體具有公有 DNS 名稱，且可從網際網路連線。
+ 與執行個體相關聯的安全群組已設定為允許 SSH (連接埠 22) 流量，以便您可以連線到執行個體以檢視輸出日誌檔案。
+ 您的執行個體使用 Amazon Linux 2 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)**) 的解譯器路徑做為開頭。如需 shell 指令碼的介紹，請參閱 GNU 作業系統**網站的 [Bash 參考手冊](https://www.gnu.org/software/bash/manual/bash.html)。

做為使用者資料輸入的指令碼會以根使用者的身分執行，因此請不要在指令碼中使用 **sudo** 命令。請記得，您建立的任何檔案都會由根使用者擁有；若您需要讓非超級使用者擁有檔案存取權，建議您根據需求在指令碼中修改許可。此外，因為指令碼不會以互動方式執行，您無法包含需要使用者意見回饋的命令 (例如不帶有 `-y` 標記的 **yum update**)。

如果您在使用者資料指令碼中使用 AWS API，包括 AWS CLI，則必須在啟動執行個體時使用執行個體描述檔。執行個體描述檔提供使用者資料指令碼發出 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. 在導覽窗格中，選擇 **Instances** (執行個體)。

1. 選取執行個體，並選取 **Instance state (執行個體狀態)**、**Stop instance (停止執行個體)**。如果此選項已停用，則執行個體已停止或其根磁碟區是執行個體儲存體磁碟區。

1. 出現確認提示時，請選擇 **Stop (停止)**。停止執行個體可能需要幾分鐘。

1. 在仍然選取執行個體的情況下，選取**動作** > **執行個體設定** > **編輯使用者資料**。

1. 視需要修改使用者資料，然後選擇**儲存**。

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：//[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 上建立及設定 Web 伺服器。頂端的 `#cloud-config` 為將命令識別為 cloud-init 指示詞的必要項目。

------
#### [ 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. 給予執行個體充分的時間啟動及執行您使用者資料中的指示詞，然後檢查您的指示詞是否已完成您預計執行的任務。

   針對此範例，在 Web 瀏覽器中，輸入指示詞建立之 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)，檢查 cloud-init 輸出日誌檔案 (`/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)。

**範例：在啟動時指定使用者資料**  
若要在啟動您的執行個體時指定使用者資料，請搭配 `--user-data` 參數使用 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令。使用 **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 命令編碼使用者資料。您必須先移除第一行 (BEGIN CERTIFICATE) 和最後一行 (END CERTIFICATE) 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
```

### 結合 shell 指令碼與 cloud-init 指令
<a name="user-data-mime-multi"></a>

根據預設，您一次只能在使用者資料中包含一種內容類型。不過，您可以使用 MIME 多部分檔案中的 `text/cloud-config` 和 `text/x-shellscript` 內容類型，以在使用者資料中包含 shell 指令碼和 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 shell 指令碼。cloud-init 指令會建立檔案 (`/test-cloudinit/cloud-init.txt`)，並將 `Created by cloud-init` 寫入到該檔案。bash shell 指令碼會建立檔案 (`/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)

如需 CloudFormation 範本中`UserData`屬性組合的範例，請參閱 [Base64 編碼 UserData 屬性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-general.html#scenario-userdata-base64)和 [Base64 編碼 UserData 屬性與 AccessKey 和 SecretKey](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-general.html#scenario-userdata-base64-with-keys)。

有關與 lifecycle hook 搭配運作之 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 API AWS CLI，包括 ，則必須在啟動執行個體時使用執行個體描述檔。執行個體描述檔提供使用者資料指令碼進行 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` 階段將 XML 使用者資料指令碼做為分離的程序與 EC2Launch v2 **executeScript** 任務一起執行，請將 `<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 AMIs 包含 [AWS Tools for Windows PowerShell](https://aws.amazon.com/powershell/)，因此您可以在使用者資料中指定這些 cmdlet。如果您將 IAM 角色與執行個體建立關聯，則不需要指定 cmdlet 的登入資料，因為在執行個體上執行的應用程式會使用角色的登入資料來存取 AWS 資源 （例如 Amazon S3 儲存貯體）。

使用 `<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` 階段將 XML 使用者資料指令碼做為分離的程序與 EC2Launch v2 **executeScript** 任務一起執行，請將 `<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：//[https://www.ietf.org/rfc/rfc4648.txt](https://www.ietf.org/rfc/rfc4648.txt)。

### 壓縮版使用者資料
<a name="user-data-compressed"></a>

EC2Launch v2 支援壓縮版使用者資料，做為提交超過 IMDS 所設 16 KB 限制的使用者資料的方法。如需使用此功能，請將您的使用者資料指令碼壓縮成 `.zip` 封存，然後傳遞至 EC2 執行個體。若 EC2Launch v2 偵測到壓縮版使用者資料，可自動對壓縮版使用者資料指令碼解壓縮，然後執行該指令碼。

對於標準使用者資料，如果您使用 Amazon EC2 API 或不會為您執行使用者資料的 base64 編碼的工具，就必須自行編碼壓縮版使用者資料。若要了解使用者資料大小限制及 base64 編碼的相關資訊，請參閱 [存取 EC2 執行個體的執行個體中繼資料](instancedata-data-retrieval.md)。

### 使用者資料執行
<a name="user-data-execution"></a>

根據預設，所有 AWS Windows AMIs都會為初始啟動啟用使用者資料執行。您可以指定在下一次重新開機或重新啟動執行個體時執行使用者資料指令碼。或者，您可以指定每次重新開機或重新啟動執行個體時都執行使用者資料指令碼。

**注意**  
在預設情況下，初始啟動後不會執行使用者資料。若要在重新開機或啟動執行個體後執行使用者資料，請參閱 [在後續重新啟動或啟動期間執行指令碼](#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` - 如果找到指令碼標籤
+ `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. 針對 **User Data (使用者資料)**，選取 **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) 命令讀取標籤值，在第一次開機時重新命名執行個體以符合標籤值，然後重新開機。若要成功執行此命令，您必須有連接至執行個體的角色具備 `ec2:DescribeTags` 許可，因為由 API 呼叫擷取標籤資訊。如需使用 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 的執行個體，其中第一個為原始執行個體，其餘三個則為複本。當她啟動這些執行個體時，她想要為每個複本新增關於複寫策略的使用者資料。她知道資料將會在四個執行個體上可用，因此她需要使用允許每個執行個體識別其適用部分的方式架構使用者資料。她可以使用 `ami-launch-index` 執行個體中繼資料值執行此作業，每一個執行個體的該值都是唯一的。如果您同時啟動一個以上的執行個體，`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) 命令啟動四個執行個體，指定使用者資料。

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

但是，每個執行個體都有唯一的中繼資料，如下表所示。


| 中繼資料 | Value | 
| --- | --- | 
| 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 | 


| 中繼資料 | Value | 
| --- | --- | 
| 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 | 


| 中繼資料 | Value | 
| --- | --- | 
| 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 | 


| 中繼資料 | Value | 
| --- | --- | 
| 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. 她連線到其中一個執行個體，擷取該執行個體的 `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
   ```

------