Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
如何對 EC2 Linux 執行個體上的執行個體中繼資料問題進行疑難排解?
我無法從 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體中檢索執行個體中繼資料。
簡短描述
Amazon EC2 透過對 169.254.169.254 IPv4 端點或 [fd00:ec2::254] IPv6 端點的 HTTP 請求,在本機存取執行個體內的執行個體中繼資料。若要存取執行個體中繼資料,您必須使用執行個體中繼資料服務 (IMDS)。IMDSv1 不需要驗證權杖,但 IMDSv2 需要工作階段權杖來增強安全性。
檢索執行個體中繼資料時,您可能會遇到以下問題:
- HTTP 請求錯誤,例如逾時和 HTTP 400 或 404 錯誤
- IMDSv2 權杖請求失敗
- 特定軟體的處理問題
- 網路介面或路由表設定錯誤
- 封鎖中繼資料存取的 Proxy 或 NAT 閘道組態
- (僅限 IPv6) 未啟用的 IMDSv6 端點
- AWS Identity and Access Management (IAM) 執行個體設定檔連接缺失或過時
- 本機防火牆 (例如 iptables 或 firewalld) 封鎖對 169.254.169.254 的存取
- 請求量過大導致中繼資料請求受限
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
解決 HTTP 請求錯誤
根據收到的 HTTP 錯誤代碼採取以下疑難排解動作。
(僅限 IMDSv1) 「404 - Not Found」(404 - 找不到) 錯誤
當您輸入無效的 URL 或更新執行個體的 IAM 角色但未重新整理該角色時,就會發生 HTTP 404 錯誤。
若要解決此錯誤,請確認您使用的是正確的 URL。此外,分離並重新附加執行個體的 IAM 角色。
然後,啟動並停止您的執行個體,以套用變更。
(僅限 IMDSv2) 「400 - Bad Request」(400 - 錯誤請求) 錯誤
當您的 PUT 請求使用無效的權杖或軟體傳送了錯誤的標頭時,就會發生 HTTP 400 錯誤。例如,某些 FortiGate 或 Matillion 代理程式不會快取或重複使用 IMDSv2 權杖。
若要解決此錯誤,請執行以下命令為您的 PUT 請求產生新的權杖:
$ TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl
另外,檢查系統或應用程式日誌中,是否有需要重新整理其權杖長時間執行的程序。
(僅限 IMDSv2) 「401 - Unauthorized」(401 - 未授權) 錯誤
當您的 GET 請求使用無效的權杖時,就會發生 HTTP 401 錯誤。
若要解決此錯誤,請執行以下命令為您的 GET 請求產生新的權杖:
$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
另外,檢查系統或應用程式日誌中,是否有需要重新整理其權杖長時間執行的程序。
「403 - Forbidden」(403 - 禁止) 錯誤
當您在執行個體層級停用 IMDS,或當安全群組、防火牆或路由表封鎖了執行個體存取時,就會發生 HTTP 403 錯誤。如果您必須使用 IMDSv2,但用戶端使用 IMDSv1,也會發生此錯誤。
若要解決此問題,請執行以下 describe-instances AWS CLI 命令來檢查 IMDS 組態:
aws ec2 describe-instances --instance-ids your_instance_id --query 'Reservations[].Instances[].MetadataOptions'
**注意:**將 your_instance_id 替換為您的執行個體 ID。
如果 HttpEndpoint 設定為已停用,請執行以下 modify-instance-metadata-options 命令來啟用 IMDS:
aws ec2 modify-instance-metadata-options --instance-id your_instance_id --http-endpoint enabled
**注意:**將 your_instance_id 替換為您的執行個體 ID。
請確定您的組態允許從執行個體對 169.254.169.254 (對於 IPv4) 或 [fd00:ec2::254] (對於 IPv6) 進行傳出 HTTP 存取。
如果您的執行個體使用 Proxy、NAT 組態、負載平衡器或多個內部網路跳轉,則最佳做法是將 HttpPutResponseHopLimit 設定為 2 或更高。請設定夠高的跳轉值,讓權杖回應能通過各個網路層。預設情況下,HttpPutResponseHopLimit 僅允許 1 個跳轉點。若要增加此值,請執行以下 modify-instance-metadata-options 命令:
aws ec2 modify-instance-metadata-options --instance-id your_instance_id --http-put-response-hop-limit 2
**注意:**將 your_instance_id 替換為您的執行個體 ID。
檢查 Proxy 組態問題
如果您的執行個體使用 Proxy 存取網際網路,那麼您必須將 IMDS IP 位址從 Proxy 流量中排除。如果未這樣做,您可能會收到 HTTP 403 和 404 錯誤或連線逾時。
若要從 Proxy 中排除 IMDS IP 位址,請執行下列命令來設定 no_proxy 環境變數:
export no_proxy='169.254.169.254,[fd00:ec2::254]'
**注意:**某些應用程式 (例如 Matillion、Fortigate 或自訂服務) 可能不使用系統層級 no_proxy 設定。在這種情況下,請在應用程式中設定 no_proxy。對於雙堆疊組態,請務必排除 IPv4 和 IPv6 中繼資料端點。
確定您已啟用了 IPv6 支援
如果您使用僅支援 IPv6 的子網路,請執行以下 modify-instance-metadata-options 命令來明確啟用 IMDS 的 IPv6 支援:
aws ec2 modify-instance-metadata-options \ --instance-id your_instance_id \ --http-protocol-ipv6 enabled
**注意:**將 your_instance_id 替換為您的執行個體 ID。
如果您使用具有嚴格安全群組規則的虛擬私有雲端 (VPC) 端點,請確定它們允許連接埠 80 (HTTP) 存取中繼資料 IP 位址。
對於 Fortigate 或 Matillion 應用程式,請確認軟體支援 IMDSv2 工作階段權杖。
對過時的網路組態、過時的 IAM 角色關聯或內部軟體問題進行疑難排解
檢查本機防火牆規則
若要檢查本機防火牆是否使用 iptables 封鎖對 IMDS 端點的存取,請執行下列命令:
sudo iptables -L
已封鎖端點的輸出範例:
Chain OUTPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- anywhere 169.254.169.254 owner UID match 1000-10000 reject-with icmp-port-unreachable
若要檢查是否有規則封鎖通往 169.254.169.254 的流量,請執行下列命令:
curl http://169.254.169.254/latest/meta-data/
如果規則封鎖流量,那麼您會收到類似以下範例的輸出:
curl: (7) Failed to connect to 169.254.169.254 port 80 after 0 ms: Connection refused
若要移除封鎖規則,請執行以下命令:
sudo iptables -D OUTPUT -p tcp -d 169.254.169.254 -m owner --uid-owner 1000-10000 -j REJECT
如果您的執行個體是雙堆疊,請確定沒有 IPv6 防火牆規則封鎖 [fd00:ec2::254] IPv4 位址。如果您的 iptables 為空,但流量仍然遭到封鎖,請檢查作業系統 (OS) 防火牆常駐程式,例如 firewalld 或 ufw。另外,請檢查可能強制執行隱藏規則的安全代理程式,例如防毒軟體或防火牆軟體。
檢查 Amazon EC2 是否限流了您的請求
Amazon EC2 會根據每秒封包數 (PPS) 對流向 IMDS 的流量限流。每個連接到執行個體的彈性網路介面,對於中繼資料相關流量的最大配額為 1024 PPS。如果您的 PPS 速率超過此配額,那麼您會收到「HTTP 5xx」錯誤,導致中繼資料檢索失敗,或應用程式逾時。
為了緩解限流問題,請執行以下動作:
- 存取 IMDS 時,在您的應用程式中實作指數退避和重試邏輯。
- 請與您的供應商核實或將您的軟體更新至最新版本,以確定它支援 IMDSv2。
- 使用 IMDSv2 時,只需產生一次權杖,即可在其存留時間 (TTL) 內重複使用它進行多次中繼資料查詢。
- 升級到最新的 IMDSv2 版本,以確定您的組態正確實作權杖重複使用和指數退避。
- 請勿頻繁輪詢執行個體中繼資料。
- 盡量在應用程式中使用執行個體快取。
如果您的軟體在緊密循環中不延遲地大量傳送中繼資料請求,那麼您可能會遇到限流或中繼資料失敗。使用 tcpdump、strace 或應用程式偵錯日誌,檢查是否有頻繁重複呼叫 169.254.169.254。若要監控限流事件,請執行下列命令檢查網路介面驅動程式的 linklocal_allowance_exceeded 指標:
ethtool -S eth0
**注意:**將 eth0 替換為您的網路介面名稱。在輸出中,檢查 linklocal_allowance_exceeded 是否有非 0 的值,以確定是否發生限流。
輸出範例:
linklocal_allowance_exceeded: 245
上述範例輸出顯示,由於超出 PPS 配額,Amazon EC2 限流了 245 個傳送至 IMDS 的封包。
相關資訊
相關內容
- 已提問 3 年前
- 已提問 2 年前
- 已提問 2 年前
AWS 官方已更新 9 個月前