擷取執行個體中繼資料 - Amazon Elastic Compute Cloud

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

擷取執行個體中繼資料

因為您的執行個體中繼資料可從您執行中的執行個體取得,您無須使用 Amazon EC2 主控台或 AWS CLI。若您正在撰寫要從您的執行個體執行的指令碼,這將會很有幫助。例如,您可以存取從執行個體中繼資料存取您執行個體的本機 IP 地址,管理與外部應用程式的連線。

執行個體中繼資料分為數種分類。對於每個執行個體中繼資料類別的說明,請參閱 執行個體中繼資料分類

若要從執行中的執行個體檢視所有分類的執行個體中繼資料,請使用下列 IPv4 或 IPv6 URI。

IPv4

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

IPv6

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

IP 地址是 link-local 地址且僅在執行個體中有效。如需詳細資訊,請參閱本指南中的 Link-local 地址,以及 Wikipedia 上的 Link-local address

注意

本節中的範例使用 IMDS 的 IPv4 地址:169.254.169.254。如果您要透過 IPv6 地址擷取 EC2 執行個體的執行個體中繼資料,請確定您啟用並改用 IPv6 地址:[fd00:ec2::254]。IMDS 的 IPv6 地址與 IMDSv2 命令相容。IPv6 位址只能在 AWS Nitro 系統上建置的執行個體上存取。

根據您使用 IMDSv1 或 IMDSv2,命令格式會有所不同。依預設,您可以同時使用兩種 IMDS 版本。欲要求使用 IMDSv2,請參閱 使用 IMDSv2

您可以使用 PowerShell 指令程式來擷取 URI。例如,如果您執行的是 3.0 版或更新版本 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/meta-data/
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/

如果您不想使用 PowerShell,則可以安裝第三方工具,例如 GNU Wget 或 cURL。

重要

若您在 Windows 執行個體上安裝第三方工具,請確認您已仔細閱讀過隨附的文件,因為呼叫 HTTP 的方法和輸出格式可能會與此處記載的不同。

有關從 Linux 執行個體擷取中繼資料的命令,請參閱 Amazon EC2 Windows 執行個體使用者指南中的擷取執行個體中繼資料

成本

您無須為用來擷取執行個體中繼資料和使用者資料的 HTTP 請求支付費用。

考量事項

若要避免執行個體中繼資料擷取的問題,請考慮下列事項:

  • 在容器環境中,建議將躍點限制設定為 2。

    依預設, AWS 開發套件會使用 IMDSv2 呼叫。如果 IMDSv2 呼叫沒有收到回應,開發套件會重試呼叫,如果仍然不成功,則會使用 IMDSv1。這可能會導致延遲,特別是在容器環境中。在容器環境中,如果跳轉限制為 1,則 IMDSv2 回應不會傳回,因為前往容器會被視為額外的網路跳轉。若要避免降回至 IMDSv1 的程序和產生的延遲,在容器環境中,我們建議您將跳轉限制設定為 2。如需詳細資訊,請參閱 設定執行個體中繼資料選項

  • 使用 Sysprep 建立自訂 Windows AMI。

    如果您使用自訂 Windows AMI 啟動 Windows 執行個體,為確保 IMDS 能在執行個體上運作,AMI 必須是使用 Sysprep 建立的標準化映像。否則,IMDS 將無法運作。

  • 對於 IMDSv2,在檢索字符時必須使用 /latest/api/token

    發出 PUT 請求到任何版本特定的路徑 (例如 /2021-03-23/api/token) 會導致中繼資料服務傳回 403 Forbidden 錯誤。這是預期行為。

  • 如果需要 IMDSv2,則 IMDSv1 將無法運作。

    您可以檢查執行個體是否需要 IMDSv2,如下所示:選取執行個體以檢視其詳細資訊,然後檢查 IMDSv2 的值。該值為必要 (只能使用 IMDSv2) 或選用 (可以使用 IMDSv2 和 IMDSv1)。

回應及錯誤訊息

所有執行個體中繼資料都會以文字傳回 (HTTP 內容類型 text/plain)。

特定中繼資料資源的請求會傳回適當的值。若資源無法使用,則會傳回 404 - Not Found HTTP 錯誤碼。

一般中繼資料資源的請求 (URI 的結尾為 /) 會傳回可用資源的清單,或是 404 - Not Found HTTP 錯誤碼 (若沒有該資源的話)。清單項目會位於不同列,以換行字元 (ASCII 10) 終止。

對於使用 執行個體中繼資料服務第 2 版 提出的請求,可傳回下列 HTTP 錯誤碼:

  • 400 - Missing or Invalid ParametersPUT 請求無效。

  • 401 - UnauthorizedGET 請求使用的字符無效。建議動作會產生新字符。

  • 403 - Forbidden – 不允許請求,或 IMDS 已關閉。

擷取執行個體中繼資料的範例

以下範例是可在 Windows 執行個體上使用的命令。有關從 Linux 執行個體擷取中繼資料的命令,請參閱 Amazon EC2 Windows 執行個體使用者指南中的擷取執行個體中繼資料

取得執行個體中繼資料的可用版本

此範例會取得執行個體中繼資料的可用版本。每個版本會參照在發佈新執行個體中繼資料類別時的執行個體中繼資料建置。執行個體中繼資料建置版本與 Amazon EC2 API 版本無關。若您有依存於先前版本中結構和資訊的指令碼,您也可以取得先前版本。

注意

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

curl http://169.254.169.254/latest/meta-data/ami-id

IMDSv2
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/ 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
IMDSv1
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

取得上層中繼資料項目

此範例會取得最上層的中繼資料項目。如需詳細資訊,請參閱 執行個體中繼資料分類

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

下列範例會取得從之前範例取得之一些上層中繼資料項目的值。IMDSv2 請求會使用在之前範例命令中建立的儲存字符,前提是字符並未過期。

IMDSv2
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
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/ami-id ami-0abcdef1234567890

 

IMDSv2
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
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/reservation-id r-0efghijk987654321

 

IMDSv2
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
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/local-hostname ip-10-251-50-12.ec2.internal

 

IMDSv2
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
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-hostname ec2-203-0-113-25.compute-1.amazonaws.com

取得可用公有金鑰清單

此範例會取得可用公有金鑰的清單。

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/meta-data/public-keys/ 0=my-public-key
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key

顯示可使用公有金鑰 0 的格式

此範例會顯示可使用公有金鑰 0 的格式。

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/meta-data/public-keys/0/openssh-key openssh-key
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key openssh-key

取得公有金鑰 0 (格式為 OpenSSH 金鑰格式)

此範例會取得公有金鑰 0 (格式為 OpenSSH 金鑰格式)。

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

此範例會取得執行個體的子網 ID。

IMDSv2
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id subnet-be9b61d7
IMDSv1
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

取得執行個體的執行個體標籤

在以下範例中,範例執行個體具有已啟用執行個體中繼資料上的標籤以及執行個體標籤 Name=MyInstanceEnvironment=Dev

此範例會取得執行個體的所有執行個體標籤索引鍵。

IMDSv2
PS C:\> $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/tags/instance Name Environment
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/tags/instance Name Environment

下列範例會取得在前面的範例中獲得的 Name 索引鍵的值。IMDSv2 請求使用在之前範例命令中建立的儲存字符,前提是字符並未過期。

IMDSv2
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/tags/instance/Name MyInstance
IMDSv1
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/tags/instance/Name MyInstance

查詢調節

我們會根據每個執行個體來調整對 IMDS 的查詢,並且我們會限制從執行個體到 IMDS 的同時連線數。

如果您使用 IMDS 擷取 AWS 安全認證,請避免在每次交易期間查詢認證,或從大量執行緒或處理序同時查詢認證,因為這可能會導致限制。相反的,我們建議您快取登入資料,直到其接近到期時間為止。如需有關 IAM 角色以及與該角色相關聯的安全憑證的詳細資訊,請參閱 從執行個體中繼資料中擷取安全登入資料

若您在存取 IMDS 時遭到限流,請使用指數退避策略重試您的查詢。

限制 IMDS 存取

您可以考慮使用本機防火牆規則,以停用從一些或所有程式對於 IMDS 的存取。

注意

對於 AWS Nitro System 上建置的執行個體,當 VPC 中的網路設備 (例如虛擬路由器) 將封包轉送至 IMDS 位址,並停用執行個體的預設來源/目標檢查時,就可以從您自己的網路連線 IMDS。若要防止來源從您的 VPC 外部到達 IMDS,建議您修改網路應用裝置的組態,以丟棄具有 IMDS 目標 IPv4 位址的封包,以169.254.169.254及 (如果啟用了 IPv6 端點) IMDS 的 IPv6 位址。[fd00:ec2::254]

使用 Windows 防火牆以限制存取

下列 PowerShell 範例會使用內建的 Windows 防火牆來防止網際網路資訊伺服器網路伺服器 (根據其預設安裝使用者識別碼NT AUTHORITY\IUSR) 存取 169.254.169.254。其使用拒絕規則以拒絕所有執行個體中繼資料請求 (無論是 IMDSv1 或 IMDSv2) 以該使用者的身分執行任何程序。

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

或者,您可以使用允許規則,考慮只允許存取特定使用者或群組。就安全觀點而言,允許規則可能更加簡單,因為它們會要求您做出關於那些軟體需要存取執行個體中繼資料的決策。如果您使用允許規則,即使您稍後變更執行個體上的軟體或組態,您也不太可能意外地允許軟體存取中繼資料服務 (亦即您並非有意存取)。您也可以使用允許規則來組合群組使用方式,如此您就能新增並從允許的群組移除使用者,而不需要變更防火牆規則。

下列範例會防止以變數 blockPrincipal 中指定 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,但不可設定為拒絕或允許特定原則。