擷取執行個體中繼資料 - 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 address

注意

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

根據您使用 IMDSv1 或 IMDSv2,命令格式會有所不同。依預設,您可以同時使用兩個執行個體中繼資料服務。欲要求使用 IMDSv2,請參閱 使用 IMDSv2

您可以使用 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" -v http://169.254.169.254/latest/meta-data/
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/

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

成本

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

考量

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

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

  • 對於 IMDSv2,在檢索字符時必須使用 /latest/api/token。發出 PUT 請求到任何版本特定的路徑 (例如 /2021-03-23/api/token) 會導致中繼資料服務傳回 403 Forbidden 錯誤。這是預期行為。

回應及錯誤訊息

所有執行個體中繼資料都會以文字傳回 (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 – 不允許請求,或是已關閉執行個體中繼資料服務。

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

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

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

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

注意

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

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

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v 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
[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

取得上層中繼資料項目

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

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" -v 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/
IMDSv1
[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/

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

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

 

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

 

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

 

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

取得可用公有金鑰清單

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

IMDSv2
[ec2-user ~]$ `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" -v http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key

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

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

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" -v http://169.254.169.254/latest/meta-data/public-keys/0/ openssh-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/ openssh-key

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

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

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" -v 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
[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

取得執行個體的子網 ID

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

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id subnet-be9b61d7
IMDSv1
[ec2-user ~]$ curl 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
[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" -v http://169.254.169.254/latest/meta-data/tags/instance Name Environment
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/tags/instance Name Environment

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

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/tags/instance/Name MyInstance
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/tags/instance/Name MyInstance

查詢調節

我們會根據每個執行個體節流執行個體中繼資料服務的查詢,並且我們會限制從執行個體連線到執行個體中繼資料服務的同時連線數。

若您使用執行個體中繼資料服務擷取 AWS 安全登入資料,請避免在每次交易期間查詢登入資料,或透過較大量的執行緒或程序同時查詢,這可能會導致調節。相反的,我們建議您快取登入資料,直到其接近到期時間為止。

若您在存取執行個體中繼資料服務時遭到節流,請使用指數退避策略重試您的查詢。

限制執行個體中繼資料服務存取

您可以考慮使用本機防火牆規則,以停用從一些或所有程式對於執行個體中繼資料服務的存取。

注意

對於 建置在 Nitro 系統上的執行個體,可從您自己的網路中連線 IMDS,當 VPC 內的網路設備 (例如虛擬路由器) 將封包轉送至 IMDS 時,會停用執行個體上的預設來源/目標檢查。若要防止 VPC 外部的來源連線 IMDS,我們建議您修改網路設備的組態,以捨棄目標 IPv4 地址為 IMDS 169.254.169.254 的封包,並且如果您啟用了 IPv6 端點,則捨棄目標 IPv6 地址為 IMDS fd00:ec2::254 的封包。

使用 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 中執行的程序除外) 存取執行個體中繼資料服務。

$ 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。下列範例會將存取執行個體中繼資料服務的權限限制為僅限根使用者。

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 預設是第一個比對規則。