命令格式不同,取決於您使用的是執行個體中繼資料服務第 1 版 (IMDSv1) 還是執行個體中繼資料服務第 2 版 (IMDSv2)。根據預設,您可以同時使用兩個版本的執行個體中繼資料服務。欲要求使用 IMDSv2,請參閱
使用執行個體中繼資料服務存取執行個體中繼資料
。
如果需要 IMDSv2,則 IMDSv1 將無法運作
如果您使用 IMDSv1 且未收到回應,則可能需要 IMDSv2。若要檢查是否需要 IMDSv2,請選取執行個體以檢視其詳細資訊。
IMDSv2
值表示
必要
(您必須使用 IMDSv2) 或
選用
(您可以使用 IMDSv2 或 IMDSv1)。
(IMDSv2) 使用 /latest/api/token 擷取字符
向任何版本特定的路徑發出
PUT
請求 (例如
/2021-03-23/api/token
),將導致中繼資料服務傳回 403 Forbidden 錯誤。這是預期行為。
中繼資料版本
為避免每次 Amazon EC2 發佈新的執行個體中繼資料建置時都必須更新您的程式碼,我們建議您在路徑中使用
latest
,而不是版本編號。
IPv6 支援
若要使用 IPv6 地址擷取執行個體中繼資料,請確定啟用及使用 IMDS 的 IPv6 地址
[fd00:ec2::254]
,而不是 IPv4 地址
169.254.169.254
。執行個體必須是在
支援 IPv6 的子網路
中啟動的
Nitro 型執行個體
。
(Windows) 使用 Windows Sysprep 建立自訂 AMIs
若要在您從自訂 Windows AMI 啟動執行個體確保 IMDS 正常運作,AMI 必須是使用 Windows Sysprep 建立的標準化映像。否則,IMDS 將無法運作。如需詳細資訊,請參閱
使用 Windows Sysprep 建立 Amazon EC2 AMI
。
在容器環境中,請考慮重新設定或將跳轉限制增加到 2
根據預設 AWS SDKs 會使用 IMDSv2 呼叫。如果 IMDSv2 呼叫未收到回應,有些 AWS SDKs會重試呼叫,如果仍然失敗,請使用 IMDSv1。這可能會導致延遲,特別是在容器環境中。對於
需要
IMDSv2 AWS SDKs,如果跳轉限制在容器環境中為 1,則呼叫可能完全不會收到回應,因為前往容器會被視為額外的網路跳轉。
若要緩解容器環境中的這些問題,請考慮將組態變更為將設定 (例如 AWS 區域) 直接傳遞至容器,或考慮將跳轉限制增加至 2。如需跳轉限制影響的相關資訊,請參閱針對
開放防火牆、反向代理和 SSRF 漏洞新增深度防禦,並增強 EC2 執行個體中繼資料服務
。如需變更跳轉限制的資訊,請參閱
變更 PUT 回應跳轉限制
。
每秒封包數 (PPS) 的限制
使用
連結本機
位址的服務有每秒 1024 個封包 (PPS) 限制。此限制包括
Route 53 Resolver DNS 查詢
、執行個體中繼資料服務 (IMDS) 請求、
Amazon Time Service Network Time Protocol (NTP)
請求和
Windows Licensing Service (適用於 Microsoft Windows 型執行個體)
請求的彙總。
使用者資料存取的其他考量
-
Amazon EC2 主控台可為您執行 base64 編碼,或是接受 base64 編碼輸入。
-
AWS CLI 第 2
版預設會為您執行二進位參數的 base64 編碼。第 1 AWS CLI 版會為您執行
--user-data
參數的 base64 編碼。
-
會為您 AWS SDK for Python (Boto3) 執行
UserData
參數的 base64 編碼。
使用者資料在 base64 編碼之前限制為 16 KB (原始形式)。長度為
n
的字串在 base64 編碼之後的大小為 ceil(
n
/3)*4。
使用者資料在擷取時必須以 base64 解碼。如果您使用執行個體中繼資料或主控台擷取資料,將會自動為您解碼資料。
若您停止執行個體,請修改其使用者資料,然後啟動執行個體,則更新後的使用者資料便不會在您啟動執行個體時自動執行。您可以透過 Windows 執行個體設定組態,使更新後的使用者資料指令碼在您啟動執行個體,或是每一次重新開機或啟動執行個體時執行一次。
使用者資料是執行個體屬性。如果您從執行個體建立 AMI,執行個體使用者資料不會包含在 AMI 中。
從 EC2 執行個體存取執行個體中繼資料
因為您的執行個體中繼資料可從您執行中的執行個體取得,您無須使用 Amazon EC2 主控台或 AWS CLI。若您正在撰寫要從您的執行個體執行的指令碼,這將會很有幫助。例如,您可以存取從執行個體中繼資料存取您執行個體的本機 IP 地址,管理與外部應用程式的連線。
以下所有項目都被視為執行個體中繼資料,但存取方法各有不同。選擇代表要存取之執行個體中繼資料類型的標籤,以查看更多資訊。
Metadata
執行個體中繼資料屬性分為數種類別。對於每個執行個體中繼資料類別的說明,請參閱
執行個體中繼資料分類
。
若要從執行中的執行個體存取中繼資料屬性,請從下列 IPv4 或 IPv6 URI 取得資料。這些 IP 位址是連結本機位址且僅在執行個體中有效。如需詳細資訊,請參閱
Link-local 地址
。
http://169.254.169.254/latest/meta-data/
http://[fd00:ec2::254]/latest/meta-data/
Dynamic data
若要從執行中的執行個體擷取動態資料,請使用下列其中一個 URI。
http://169.254.169.254/latest/dynamic/
http://[fd00:ec2::254]/latest/dynamic/
範例:使用 cURL 存取
下列範例使用
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" http://169.254.169.254/latest/dynamic/instance-identity/
rsa2048
pkcs7
document
signature
dsa2048
IMDSv1
[ec2-user ~]$
curl http://169.254.169.254/latest/dynamic/instance-identity/
rsa2048
pkcs7
document
signature
dsa2048
範例:使用 PowerShell 存取
下列範例使用 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/dynamic/instance-identity/
document
rsa2048
pkcs7
signature
IMDSv1
PS C:\>
Invoke-RestMethod -uri http://169.254.169.254/latest/dynamic/instance-identity/
document
rsa2048
pkcs7
signature
如需動態資料的詳細資訊及如何擷取它的範例,請參閱
Amazon EC2 執行個體的執行個體身分文件
。
User data
若要從執行個體擷取使用者資料,請使用下列其中一個 URI。若要使用 IPv6 地址擷取使用者資料,您必須先啟用並確保該執行個體是
Nitro 型執行個體
,且位於支援 IPv6 的子網路中。
http://169.254.169.254/latest/user-data
http://[fd00:ec2::254]/latest/user-data
使用者資料的請求會直接傳回資料 (內容類型
application/octet-stream
)。如果執行個體沒有任何使用者資料,則請求會傳回
404 - Not Found
。
範例:使用 cURL 存取以擷取逗號分隔文字
下列範例使用
cURL
擷取指定為逗號分隔文字的使用者資料。
IMDSV2
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" http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
IMDSv1
curl http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
範例:使用 PowerShell 存取以擷取逗號分隔文字
下列範例使用 PowerShell 擷取指定為逗號分隔文字的使用者資料。
IMDSV2
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
IMDSv1
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} `
-Method PUT -Uri http://169.254.169.254/latest/api/token} -Method GET -uri http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
範例:使用 cURL 存取以擷取指令碼
下列範例使用
cURL
擷取指定為指令碼的使用者資料。
IMDSV2
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" http://169.254.169.254/latest/user-data
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
IMDSv1
curl http://169.254.169.254/latest/user-data
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
範例:使用 PowerShell 存取以擷取指令碼
下列範例使用 PowerShell 擷取指定為指令碼的使用者資料。
IMDSV2
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>
IMDSv1
Invoke-RestMethod -uri http://169.254.169.254/latest/user-data
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>
Console
若要查詢現有執行個體的執行個體中繼資料選項,請使用主控台
-
在
https://console.aws.amazon.com/ec2/
開啟 Amazon EC2 主控台。
-
在導覽窗格中,選擇
Instances
(執行個體)。
選取執行個體。
選擇
動作
、
執行個體設定
、
修改執行個體中繼資料選項
。
在「
修改執行個體中繼資料選項
」對話方塊中,檢閱目前執行個體中繼資料選項。
-
AWS CLI
-
使用 查詢現有執行個體的執行個體中繼資料選項 AWS CLI
使用
describe-instances
命令。
aws ec2 describe-instances \
--instance-id i-1234567898abcdef0
\
--query 'Reservations[].Instances[].MetadataOptions'
-
PowerShell
-
若要查詢現有執行個體的執行個體中繼資料選項,請使用 Tools for PowerShell
使用
Get-EC2Instance
Cmdlet。
(Get-EC2Instance `
-InstanceId i-1234567898abcdef0
).Instances.MetadataOptions
所有執行個體中繼資料都會以文字傳回 (HTTP 內容類型
text/plain
)。
特定中繼資料資源的請求會傳回適當的值。若資源無法使用,則會傳回
404 -
Not Found
HTTP 錯誤碼。
一般中繼資料資源的請求 (URI 的結尾為 /) 會傳回可用資源的清單,或是
404 - Not Found
HTTP 錯誤碼 (若沒有該資源的話)。清單項目會位於不同列,以換行字元 (ASCII 10) 終止。
如果 IMDSv1 請求未收到回應,則可能需要 IMDSv2。
對於使用 IMDSv2 提出的請求,可以傳回下列 HTTP 錯誤代碼:
400 - Missing or Invalid Parameters
–
PUT
請求無效。
401 - Unauthorized
–
GET
請求使用的字符無效。建議動作會產生新字符。
403 - Forbidden
– 不允許請求,或 IMDS 已關閉。
404 - Not Found
– 資源無法使用,或沒有此類資源。
503
:請求無法完成。重試 請求。
如果 IMDS 傳回錯誤,
curl
會在輸出中列印錯誤訊息,並傳回成功狀態碼。錯誤訊息會儲存在
TOKEN
變數中,進而造成使用字符的
curl
命令失敗。如果您使用
-f
選項呼叫
curl
,則會在 HTTP 伺服器出現錯誤時傳回錯誤狀態碼。如果您啟用錯誤處理,Shell 可能會攔截錯誤並停止指令碼。