Huawei Cloud OBS Website Host
概覽
使用華為雲 OBS Python SDK 配置現有的 OBS 儲存桶以進行靜態網站託管,並為網站註冊自訂網域。
當使用者需要時使用此技能:
- 啟用或修復 OBS 靜態網站託管
- 設定索引文件或錯誤文件
- 讓網站可透過由 OBS 靜態網站端點支援的自訂網域存取
- 新增或修復自訂網域(包含適用的華為雲 DNS)
- 診斷託管 OBS 網站的 403、404 或 DNS 問題
何謂良好狀態
此技能執行寫入操作:它在儲存桶上啟用靜態網站託管(setBucketWebsite)並註冊該儲存桶所需的自訂網域(setBucketCustomDomain)。當使用者要求時,它也會建立/更新 DNS 記錄。這些寫入操作由此技能自身工作階段的捆綁腳本執行——它們不是模擬、不延後給使用者、也不以唯讀檢查取代。驗證會在寫入之後執行以確認結果。
- 儲存桶已透過此技能啟用靜態網站託管。
- 儲存桶可從網站端點提供
index.html服務。 - 匿名使用者可以讀取網站內容。
- 不存在的路徑會返回配置的錯誤頁面或乾淨的 404。
- 自訂網域已透過此技能註冊,並透過 DNS 解析到 OBS 網站端點。自訂網域是強制的——根據安全合規要求,不允許使用預設的 OBS 儲存桶網域進行線上物件預覽。
- 在自訂網域註冊到儲存桶且正確解析之前,設定不被視為完成。
- 使用 OBS 網站端點,而非一般的儲存桶 API 端點。
- 403 通常有兩個常見原因:儲存桶或物件未啟用匿名/公開讀取,或用於 OBS 操作的 AK/SK 缺少所需的 IAM 權限。
- 404 通常表示索引文件名稱或上傳路徑錯誤。
安全合規:自訂網域要求
根據華為雲安全合規要求,OBS 儲存桶預設網域名稱(<bucket_name>.obs.<region>.myhuaweicloud.com)禁止用於儲存桶內物件的線上預覽。因此,自訂網域是強制的,用於靜態網站託管。
如果使用者還沒有準備好自訂網域:
- 首先詢問使用者網站將部署在哪裡(部署區域/管轄區),以及網域將在哪裡註冊。僅在部署區域實際要求時,才套用區域特定的要求(例如 ICP 備案)。
- 引導使用者透過華為雲網域註冊服務或其他常見網域註冊網站註冊網域。
- 如果(且僅當)使用者的部署區域是中國大陸,該網域還必須完成 ICP 備案(網站備案),然後才能用於網站託管。對於中國大陸以外的部署,不需要此步驟——請不要強加。
- 只有在區域檢查完成,並且在適用的情況下,網域註冊/備案確認之後,才能繼續靜態網站託管配置。
重要: 在確認自訂網域前提條件之前,請勿繼續進行靜態網站託管配置。即使在測試環境中,預設的 OBS 網域也不是用於網站存取的合法替代方案。
必要的輸入
在進行更改之前,請收集以下資訊:
regionbucket_namecustom_domain(必要——請參閱上面的安全合規章節)index_document(可選,預設值:index.html)error_document(可選)dns_zone或 DNS 帳戶上下文(可選;僅當使用者希望在此次執行中進行華為雲 DNS 更改時才需要)
假設靜態網站檔案已由使用者上傳。
相依性
此技能依賴以下運行時/工具組件:
- Python 3.10+(
scripts/set_obs_website_sdk.py和scripts/verify_obs_website.py需要) - 華為 OBS Python SDK 套件:
esdk-obs-python obsutil(用於產生和維護.obsutilconfig憑證配置)- 華為雲 AK/SK 憑證(來自
.obsutilconfig) - 能存取 OBS 端點和網站端點的網路
hcloudCLI(僅當此技能管理華為雲 DNS 記錄操作時需要)- dig / nslookup(可選)
安裝指令:
pip install esdk-obs-python
能力與權限範圍
此技能宣告其確切的能力和權限範圍,以便呼叫者和審查者在呼叫之前知道它能做什麼和不能做什麼:
它可以寫入(修改)的內容:
- 僅使用者指定的 OBS 儲存桶的網站配置(
setBucketWebsite:索引文件、錯誤文件),透過scripts/set_obs_website_sdk.py。 - 該相同儲存桶上的自訂網域綁定(
setBucketCustomDomain),包含可選的 HTTPS 憑證綁定。 - 僅當使用者在此次執行中明確要求華為雲 DNS 更改並提供/指定區域時,華為雲 DNS 區域中的 DNS 記錄(
hcloud DNS CreateRecordSet)。 - 這些是面向生產環境的更改:它們可能會影響自訂網域的即時 Web 流量,並使儲存桶內容可公開存取。每次寫入前都會給出警告(請參閱工作流程)。
讀取憑證(及其來源):
scripts/set_obs_website_sdk.py和scripts/verify_obs_website.py按優先順序從下列來源讀取憑證:(1) CLI 標誌--access-key/--secret-key/--security-token、(2) 環境變數HW_ACCESS_KEY/HW_SECRET_KEY/HW_SECURITY_TOKEN、(3) 本機~/.obsutilconfig。hcloud使用其自己的配置 CLI 設定檔進行 DNS 操作。- 僅回報憑證的存在與否;值永遠不會被列印、回顯或寫入磁碟。
網路存取:
- 僅存取 OBS 服務端點(
https://obs.<region>.myhuaweicloud.com)、OBS 網站端點,以及(僅在要求時)配置區域的華為雲 DNS 服務。
它永遠不會做的事:
- 永遠不會上傳、刪除或修改儲存桶內的物件/內容。
- 永遠不會觸及使用者指定之外的儲存桶、網域、DNS 區域或憑證。
- 永遠不會建立 cron 任務、啟動腳本或狀態檔案,也永遠不會在工作階段之間保留任何內容(請參閱下面的「工作階段行為」)。
- 永遠不會揭露或轉發它讀取的憑證給任何第三方。
工作階段行為
此技能執行單次工作階段、一次性操作:它在目前執行期間執行請求的 OBS/DNS API 呼叫,然後退出。它不會建立 cron 任務、啟動腳本、背景守護行程或狀態檔案,也不會保留配置以供後續執行使用。每次呼叫都是獨立的,必須由使用者觸發;沒有任何事情是自動排程或重複的。任何長時間運行或外部排程的步驟(例如等待 DNS 傳播)會向使用者描述為需要檢查的項目,而不是由此技能安裝為任務。
憑證揭露與確認
由於 scripts/set_obs_website_sdk.py 會從您的環境或本機 ~/.obsutilconfig 讀取雲端憑證,然後更改遠端儲存桶/DNS 配置,因此執行它具有實際的安全影響。在執行之前,您必須:
- 向使用者揭露該腳本將從其 CLI 標誌 / 環境變數 /
~/.obsutilconfig讀取憑證,並將修改遠端儲存桶的網站配置和自訂網域(以及 DNS,如果要求)。 - 獲得使用者的確認,確認儲存桶名稱、自訂網域和 DNS 區域(如果有的話)是正確的,並且他們授權此更改。
- 僅在獲得該確認後才運行腳本。
hcloud CLI 參考
當需要安裝和配置 hcloud CLI 或 obsutil 時,請載入 references/cli-installation-guide.md。
當需要建立或管理 OBS 靜態網站自訂網域的 DNS CNAME 記錄時(使用 hcloud DNS CreateRecordSet 指令的逐步指南),請載入 references/hcloud-dns-obs-website.md。
安全注意事項:
- 切勿在腳本或已簽入的檔案中硬編碼 AK/SK。
- 對於 SDK 腳本,偏好使用環境變數;對於 CLI 使用,偏好使用安全的本機設定檔儲存。
obsutil 配置相依性
當需要 obsutil 安裝或 .obsutilconfig 設定指引時,請載入 references/cli-installation-guide.md。
Python SDK 輔助腳本(scripts/set_obs_website_sdk.py)依預設從下列來源讀取憑證:
- CLI 標誌(
--access-key、--secret-key、--security-token) - 環境變數(
HW_ACCESS_KEY、HW_SECRET_KEY、HW_SECURITY_TOKEN) .obsutilconfig
如果所有來源中的 ak/sk 都為空,腳本必須停止並要求使用者在 .obsutilconfig 中填寫缺少的金鑰(或提供 CLI/環境憑證)。
憑證檢查規則:
- 僅回報金鑰(
ak、sk、securitytoken)的存在/不存在。 - 在檢查期間切勿列印憑證值。
- 切勿將
.obsutilconfig的完整行列印到主控台。 - 將主控台輸出視為模型上下文;任何洩漏的值都是安全事件。
安全檢查範例(僅顯示狀態,不顯示機密值):
Linux/macOS:
CFG="${HOME}/.obsutilconfig"
if [ ! -f "$CFG" ]; then
echo "obsutilconfig_exists=false"
echo "ak_configured=false"
echo "sk_configured=false"
echo "securitytoken_configured=false"
else
awk -F= '
BEGIN { ak=0; sk=0; st=0 }
/^[[:space:]]*#/ { next }
/^[[:space:]]*(ak|access_key_id)[[:space:]]*=/ { if ($2 ~ /[^[:space:]]/) ak=1 }
/^[[:space:]]*(sk|secret_access_key)[[:space:]]*=/ { if ($2 ~ /[^[:space:]]/) sk=1 }
/^[[:space:]]*(securitytoken|security_token|token)[[:space:]]*=/ { if ($2 ~ /[^[:space:]]/) st=1 }
END {
print "obsutilconfig_exists=true"
print "ak_configured=" (ak ? "true" : "false")
print "sk_configured=" (sk ? "true" : "false")
print "securitytoken_configured=" (st ? "true" : "false")
}
' "$CFG"
fi
Windows (PowerShell):
$cfg = Join-Path $HOME ".obsutilconfig"
if (-not (Test-Path $cfg)) {
"obsutilconfig_exists=false"
"ak_configured=false"
"sk_configured=false"
"securitytoken_configured=false"
} else {
$lines = Get-Content $cfg
$ak = $false; $sk = $false; $st = $false
foreach ($line in $lines) {
if ($line -match '^\s*#') { continue }
if ($line -match '^\s*(ak|access_key_id)\s*=\s*(\S.*)$') { $ak = $true }
if ($line -match '^\s*(sk|secret_access_key)\s*=\s*(\S.*)$') { $sk = $true }
if ($line -match '^\s*(securitytoken|security_token|token)\s*=\s*(\S.*)$') { $st = $true }
}
"obsutilconfig_exists=true"
"ak_configured=$ak"
"sk_configured=$sk"
"securitytoken_configured=$st"
}
請勿使用:
cat ~/.obsutilconfiggrep -E "ak|sk|token" ~/.obsutilconfig
腳本使用意圖
對於為它們構建的任務,預設使用捆綁的腳本。這些腳本執行此技能所宣傳的寫入操作——它們不是唯讀驗證器:
scripts/set_obs_website_sdk.py寫入儲存桶網站配置(setBucketWebsite)並註冊自訂網域(setBucketCustomDomain)到指定的儲存桶。每當任務是啟用、修復或更改 OBS 靜態網站託管設定時,請使用它。它按照能力與權限範圍中聲明的方式讀取憑證,並在寫入前需要使用者確認(請參閱憑證揭露與確認)。scripts/verify_obs_website.py驗證已發布的網站端點(DNS、HTTP、HTTPS)並執行唯讀的 SDK 儲存桶/區域檢查。在進行任何網站配置更改後,以及當使用者詢問網站是否可存取或除錯 403/404 行為時,都可以使用它。- 請勿用臨時的一次性程式碼取代這些腳本,除非腳本本身已損壞且需要修補;修補損壞的腳本是您直接編寫 OBS SDK 呼叫的唯一情況。
- 使用腳本以保持跨執行階段的憑證處理、SDK 物件建構和驗證行為的一致性。
工作流程
- 驗證 Python 運行時和 OBS SDK 是否可用(如果缺少則執行
pip install esdk-obs-python)。 - 驗證自訂網域前提條件(請參閱安全合規一節):
- 確認使用者已提供
custom_domain。 - 詢問使用者網站將部署在哪裡(區域/管轄區),然後再套用任何區域特定的要求。如果使用者沒有網域且部署區域是中國大陸,請引導他們在華為雲網域註冊註冊一個網域,並完成 ICP 備案(網站備案)。對於非中國大陸的部署,請不要強加 ICP 備案。在此步驟停止,等待使用者完成此步驟。
- 檢查使用者是在華為雲 DNS 還是透過外部提供者管理 DNS。
- 如果此次執行包含華為雲 DNS 更改,請驗證
hcloud已安裝並通過身份驗證。 - 如果 DNS 在華為雲外部或此次執行之外管理,請在繼續之前明確收集該限制。
- 確認使用者已提供
- 驗證儲存桶存在於請求的區域(使用下面的儲存桶存在性和區域檢查方法)。
- 檢查呼叫者是否有權限更新儲存桶網站設定。
- 檢查網站檔案是否允許匿名讀取(使用下面的匿名讀取檢查方法)。
- 不要上傳或修改網站內容物件(
index.html、資源等)。假設內容已存在於儲存桶中。 - 在寫入前確認。 告訴使用者下一步將讀取他們的雲端憑證(環境變數 /
~/.obsutilconfig)並修改遠端儲存桶的網站配置和自訂網域綁定(以及 DNS,如果要求),這些是面向生產環境的更改,會影響即時流量。僅在確認後才繼續。然後執行scripts/set_obs_website_sdk.py並帶上--custom-domain <domain>(如果未提供index_document,則使用index.html)。- 該腳本的存在是為了使 SDK 物件建構保持一致。
...
(原文此處截斷,但翻譯已涵蓋所提供的內容。)