使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

如何疑難排解 EC2 Linux 執行個體上的執行個體中繼資料問題?

2 分的閱讀內容
0

我無法從 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體檢索執行個體中繼資料。

簡短說明

執行個體中繼資料是 EC2 執行個體的相關資訊,例如執行個體 ID、公有和私有 IP 地址、安全群組、AWS 身份和存取管理 (IAM) 角色等。執行個體中繼資料會透過 HTTP 請求將執行個體公開至 169.254.169.254。

從執行個體中繼資料服務 (IMDS) 檢索執行個體中繼資料時,可能會遇到下列問題:

  • HTTP 請求錯誤
  • 代理組態
  • 本機防火牆規則
  • 請求限流

解決方法

HTTP 請求錯誤

提出 HTTP 請求以檢索執行個體中繼資料時,可能會傳回下列 HTTP 錯誤碼:

HTTP 404 - 未找到

**HTTP 404 ** 錯誤適用於 IMDS v1。當請求的資源無法使用時,就會發生這個錯誤。確認您使用的是正確的 URL。

400 - 錯誤請求

400 - 錯誤請求錯誤適用於 IMDS v2。如果 PUT 請求無效,就會發生這個錯誤。

401 - 未授權

401 - 如果 GET 請求使用無效的令牌,則會發生未授權的錯誤。如果發生這種情況,請產生新的令牌。

403 - 禁止

403 - 如果請求不允許或關閉 IMDS,則會發生禁止錯誤。執行下列命令以檢查 IMDS 狀態。在下列範例指令中,將 your_instance_ID 取代為使用案例的正確值。

$ aws ec2 describe-instances -instance-ids  -query 'Reservations[].Instances[].MetadataOptions'

以下是上述命令中的範例輸出:

[
  {
    "State": "applied",
    "HttpTokens": "optional",
    "HttpPutResponseHopLimit": 1,
    "HttpEndpoint": "disabled",
    "HttpProtocolIpv6": "disabled",
    "InstanceMetadataTags": "disabled"
  }
]

如果命令選項顯示 HttpEndpoint 已關閉,則執行下列命令:

aws ec2 modify-instance-metadata-options \
    --instance-id  \
    --http-endpoint enabled

代理組態

如果您使用代理伺服器存取網際網路,則必須排除 IMDS IP 地址 (169.254.169.254)。如果未排除 IMDS IP 地址,您可能無法檢索執行個體中繼資料。

若要在使用代理伺服器時排除 IMDS IP 地址,請使用下列地址設定 ** NO\ _PROXY ** 環境變數:

export NO_PROXY=169.254.169.254

本機防火牆規則

執行個體中的防火牆可能會阻止部分或全部程序存取 IMDS。

確定執行個體作業系統中的防火牆不會封鎖傳送至執行個體中繼資料 IP 地址的傳出流量。防火牆包括 iptables 和 UFW(簡單的防火牆)等。

使用以下命令檢查 iptables 的防火牆規則

sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

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

如果 iptables 清單的結果顯示中繼資料檢索遭拒,則您可能會收到下列錯誤:

$ 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 -proto tcp -destination 169.254.169.254 -match owner -uid-owner 1000-10000 -jump REJECT

請求限流

IMDS 的流量會根據每秒的封包數目進行限流。而且,連接至執行個體的每個彈性網路介面的上限為 1024 PPS。如果進入 IMDS 服務的 PPS 費率超過 1024 PPS,則請求將被限流。

如果發生限流,請使用指數退避策略重試您的請求。

若要查看 EC2 執行個體達到限流限制的頻率,請在彈性網絡介面驅動程序中查看 linklocal_allowance_exceeded 指標。此指標表示由於本機 Proxy 服務的流量而形成的封包數目超過網路介面上限。

執行下列指令以檢視 linklocal_allowance_exceeded 指標:

$ ethtool -S <Network-Interface>
eg: $ ethtool -S eth0

相關資訊

在 Amazon EC2 執行個體上使用代理伺服器

檢索執行個體中繼資料的範例

限制 IMDS 存取

查詢限流

ENA 驅動程式指標

AWS 官方
AWS 官方已更新 1 年前