Install
openclaw skills install @huaweiclouddev/huawei-cloud-obs-website-hostConfigure Huawei Cloud OBS static website hosting with Python SDK and a custom domain. Use when the user needs to enable or repair OBS website hosting, set index or error pages, expose an existing bucket for public website access through a custom domain, or connect that domain through Huawei Cloud DNS when Huawei manages the zone. Triggers include OBS static website hosting, website endpoint, index page, error page, public-read bucket website access, custom domain CNAME, Huawei Cloud DNS, setBucketWebsite. 中文触发词包括:OBS 静态网站托管、网站托管、自定义域名解析。
openclaw skills install @huaweiclouddev/huawei-cloud-obs-website-hostConfigure an existing Huawei Cloud OBS bucket for static website hosting with Huawei Cloud OBS Python SDK and register a custom domain for the site.
Use this skill when the user wants to:
index.html from the website endpoint.Collect these before making changes:
regionbucket_nameindex_document (optional, default: index.html)error_document (optional)custom_domaindns_zone or DNS account context (optional; required only if the user wants Huawei Cloud DNS changes in this run)Assume static website files are already uploaded by the user.
The skill depends on the following runtime/tooling components:
scripts/set_obs_website_sdk.py and scripts/verify_obs_website.py)esdk-obs-pythonobsutil (for generating and maintaining .obsutilconfig credential config).obsutilconfig)hcloud CLI (required only when this skill manages Huawei Cloud DNS record operations)Install command:
pip install esdk-obs-python
Load references/cli-installation-guide.md when hcloud CLI or obsutil installation and configuration is needed.
Load references/hcloud-dns-obs-website.md when creating or managing DNS CNAME records for OBS static website custom domains (step-by-step guide with hcloud DNS CreateRecordSet commands).
Security note:
Load references/cli-installation-guide.md when you need obsutil installation or .obsutilconfig setup guidance.
The Python SDK helper script (scripts/set_obs_website_sdk.py) reads credentials by default from:
--access-key, --secret-key, --security-token)HW_ACCESS_KEY, HW_SECRET_KEY, HW_SECURITY_TOKEN).obsutilconfigIf ak/sk are empty across all sources, the script must stop and ask the user to fill missing keys in .obsutilconfig (or provide CLI/env credentials).
Credential check rule:
ak, sk, securitytoken)..obsutilconfig to console.Safe check examples (status only, no secret values):
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"
}
Do not use:
cat ~/.obsutilconfiggrep -E "ak|sk|token" ~/.obsutilconfigUse the bundled scripts by default for the tasks they were built for:
scripts/set_obs_website_sdk.py applies or updates the bucket website configuration and registers the required custom domain. Use it whenever the task is to enable, repair, or change OBS static website hosting settings.scripts/verify_obs_website.py validates the published website endpoint. Use it after any website configuration change, and also when the user asks whether the site is reachable or when troubleshooting 403/404 behavior.pip install esdk-obs-python if missing).custom_domain is provided.hcloud is installed and authenticated.index.html, assets, etc.). Assume content already exists in the bucket.scripts/set_obs_website_sdk.py with --custom-domain <domain> (use index.html if index_document is not provided).
client.setBucketCustomDomain(bucket_name, custom_domain) — required even if DNS CNAME already exists.references/hcloud-dns-obs-website.md)CNAME, host/name, target/value, and a verification command such as dig.scripts/verify_obs_website.py --bucket-name <bucket_name> --region <region> [--domain <custom_domain>] [--index-document <name>].
--domain <custom_domain>.dig / nslookup) and HTTP access through the user-provided custom domain. Do not treat the setup as complete based only on the default OBS hostname when a custom domain is part of the request.Run a read-only SDK check with verify_obs_website.py before website configuration.
python scripts/verify_obs_website.py \
--bucket-name "<bucket_name>" \
--region "<region>" \
--index-document "<index_document>"
obs endpoint is auto-built as https://obs.<region>.myhuaweicloud.com.
Pass/Fail rules:
PASS: headBucket is 2xx and region matches (or region cannot be returned but bucket is reachable with 2xx).FAIL: headBucket non-2xx, getBucketLocation non-2xx, or explicit region mismatch.Use anonymous HTTP requests against the OBS website endpoint (no AK/SK) as the source of truth.
http://<bucket_name>.obs.<region>.myhuaweicloud.compython scripts/verify_obs_website.py \
--bucket-name "<bucket_name>" \
--region "<region>" \
--domain "<custom_domain>" \
--index-document "<index_document>"
python scripts/verify_obs_website.py \
--bucket-name "<bucket_name>" \
--region "<region>" \
--index-document "<index_document>"
site_url="http://<custom_domain>"
curl -s -o /dev/null -w "%{http_code}\n" "$site_url/<index_document>"
Pass/Fail rules:
200 on root_path and index_document: anonymous read is working.403: treat as two possible issues that must both be reported to the user: anonymous/public read is not enabled (ACL/policy issue), or the AK/SK used for SDK verification/configuration lacks required IAM permissions.404: object path/name issue (for example, index.html missing or key path mismatch), not an anonymous-permission success.When 403 appears, treat setup as failed and tell the user both common possibilities:
Provide remediation via references/iam-policies.md.
Always return:
When DNS is externally managed, also include a short DNS handoff section that tells the user exactly which CNAME record to configure with their provider.
hcloud steps.obsutil is allowed only for managing ~/.obsutilconfig; do not use it to configure website hosting.When any command fails due to IAM permission errors:
references/iam-policies.md.Load references/obs-python-sdk-website.md for SDK method usage for website hosting and custom domain registration (setBucketCustomDomain).
Load references/iam-policies.md for required IAM actions and policy JSON.
Load references/hcloud-dns-obs-website.md for step-by-step DNS CNAME configuration for custom domains via Huawei Cloud DNS (hcloud CLI), including zone lookup, record creation, and verification.
Known Pitfall: The
setBucketWebsiteAPI in esdk-obs-python >= 3.x usesWebsiteConfigurationmodel objects, not keyword arguments likeindexDocumentSuffix. Always importWebsiteConfiguration,IndexDocument, andErrorDocumentand construct them properly.
Use scripts only for repeatable checks and verification. Keep command output human-readable and focused on success/failure.
scripts/set_obs_website_sdk.py <bucket_name> <endpoint> --custom-domain <domain> [--index-document <name>] [--error-document <name>] applies static website hosting settings through the OBS SDK, registers the required custom domain, and reads credentials from CLI args, env vars, or ~/.obsutilconfig.scripts/verify_obs_website.py --bucket-name <name> --region <region> [--domain <custom_domain>] [--index-document <name>] [--json] verifies endpoint DNS/HTTP behavior and also performs a read-only bucket existence + region check (headBucket + getBucketLocation). If --domain is provided, that custom domain is the final verification target; otherwise it auto-builds the default website URL as http://<bucket>.obs.<region>.myhuaweicloud.com. The OBS API endpoint remains https://obs.<region>.myhuaweicloud.com. It prints structured sections (Input summary, Actions performed, Verification results, Remediation steps) so agent responses can directly reuse them.Load references/verification-method.md for validation rules.