擷取執行個體中繼資料
因為您的執行個體中繼資料可從您執行中的執行個體取得,您無須使用 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 地址只能在 建置在 Nitro 系統上的執行個體 上存取。
根據您使用 IMDSv1 或 IMDSv2,命令格式會有所不同。依預設,您可以同時使用兩種 IMDS 版本。欲要求使用 IMDSv2,請參閱 使用 IMDSv2。
您可以使用 PowerShell Cmdlet 擷取 URI。例如,若您正在執行版本 3.0 或更新版本的 PowerShell,請使用下列 Cmdlet。
- 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 SDK 預設會使用 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 Parameters
–PUT
請求無效。
-
401 - Unauthorized
– GET
請求使用的字符無效。建議動作會產生新字符。
-
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 的格式。
- 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 金鑰格式)。
- 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。
- 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=MyInstance
和 Environment=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 的存取。
對於 建置在 Nitro 系統上的執行個體,可從您自己的網路中連線 IMDS,當 VPC 內的網路設備 (例如虛擬路由器) 將封包轉送至 IMDS 時,會停用執行個體上的預設來源/目標檢查。若要防止 VPC 外部的來源連線 IMDS,我們建議您修改網路設備的組態,以捨棄目標 IPv4 地址為 IMDS 169.254.169.254 的封包,並且如果您啟用了 IPv6 端點,則捨棄目標 IPv6 地址為 IMDS fd00:ec2::254 的封包。
使用 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