后端与接口
用华为云 OBS Python SDK…
当需要为已有华为云 OBS 桶启用或修复静态网站托管、设置首页/错误页、通过自定义域名公开访问并完成 DNS 解析与验证时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用华为云 OBS Python SDK 特定
解决思路
- 确认运行环境:Python 3.10+、安装 esdk-obs-python(pip install esdk-obs-python)、obsutil(用于维护 .obsutilconfig)、华为云 AK/SK、可访问 OBS endpoint 与 website endpoint;如需管理华为云 DNS 还需 hcloud CLI,可选 dig/nslookup。
- 收集必需输入:region、bucket_name、custom_domain(必需)、index_document(可选,默认 index.html)、error_document(可选)、dns_zone 或 DNS 账号上下文(可选,仅当本次要改华为云 DNS 时需要);假设静态网站文件已由用户上传。
- 先确认自定义域名前置条件:若用户没有域名,引导其在华为云域名注册服务(https://www.huaweicloud.com/product/domain.html)或其他常见注册站注册;中国大陆区域还需完成 ICP 备案(网站备案);在用户完成前停止后续配置。
- 确认 DNS 归属:判断用户是在华为云 DNS 还是外部 DNS 提供商管理解析;若本次要改华为云 DNS,先确认 hcloud 已安装并已认证;若 DNS 在华为云之外或不在本次范围内,先明确记录该约束再继续。
- 检查桶是否存在及区域是否正确:运行 python scripts/verify_obs_website.py --bucket-name "<bucket_name>" --region "<region>" --index-document "<index_document>"(obs endpoint 自动构建为 https://obs.<region>.myhuaweicloud.com);PASS 规则为 headBucket 返回 2xx 且区域匹配(或区域无法返回但桶可达 2xx),FAIL 为 headBucket 非 2xx、getBucketLocation 非 2xx 或区域明确不匹配。
- 检查调用方是否有更新桶网站设置的权限;若因 IAM 权限报错,读取 references/iam-policies.md,向用户展示所需权限列表与策略 JSON,指导其在华为云 IAM 控制台创建自定义策略并授权,然后暂停执行等待用户确认。
- 检查网站文件是否允许匿名读取:用不带 AK/SK 的匿名 HTTP 请求访问 OBS website endpoint 作为判断依据;优先运行 python scripts/verify_obs_website.py --bucket-name "<bucket_name>" --region "<region>" --domain "<custom_domain>" --index-document "<index_document>",若用户未提供自定义域名则去掉 --domain 验证默认 OBS website endpoint;也可快速单文件检查 curl -s -o /dev/null -w "%{http_code}\n" "$site_url/<index_document>"。
- 不要上传或修改网站内容对象(index.html、资源文件等),假定内容已存在于桶中。
- 运行 scripts/set_obs_website_sdk.py 配置静态网站托管:scripts/set_obs_website_sdk.py <bucket_name> <endpoint> --custom-domain <domain> [--index-document <name>] [--error-document <name>];未提供 index_document 时使用 index.html;不要用一次性临时 SDK 调用替代该脚本。
- 通过脚本使用的 OBS SDK 路径注册必需的自定义域名:client.setBucketCustomDomain(bucket_name, custom_domain),即使 DNS CNAME 已存在也必须执行。
- 若本次需要修改 DNS 记录,创建指向 OBS website hostname 的 DNS CNAME 记录并等待传播(参考 references/hcloud-dns-obs-website.md);若 DNS 由华为云之外或本次范围之外管理,提供所需 CNAME 目标并明确指示用户在 OBS 自定义域名注册完成后到外部 DNS 提供商创建或更新 CNAME 记录,交接细节需包含记录类型 CNAME、主机/名称、目标/值以及 dig 等验证命令。
- 运行 scripts/verify_obs_website.py --bucket-name <bucket_name> --region <region> [--domain <custom_domain>] [--index-document <name>] 验证已发布站点;若用户提供了自定义域名,最终验证必须使用 --domain <custom_domain>,默认 OBS hostname 仅用于临时检查或未提供自定义域名时。
- 确认根路径返回首页(HTTP 200)。
- 确认缺失路径返回配置的错误行为(HTTP 404 或配置的错误页)。
- 验证 DNS 解析(dig / nslookup)并通过用户提供的自定义域名进行 HTTP 访问;当请求包含自定义域名时,不能仅凭默认 OBS hostname 判定完成。
- 处理 403:视为两种可能并都告知用户——桶/对象未开启匿名公开读(ACL/策略问题),或用于 SDK 验证/配置的 AK/SK 缺少所需 IAM 权限;按 references/iam-policies.md 提供修复方案。
- 处理 404:视为对象路径/名称问题(例如 index.html 缺失或 key 路径不匹配),而非匿名权限成功。
- 凭证读取顺序:脚本默认依次从 CLI 参数(--access-key、--secret-key、--security-token)、环境变量(HW_ACCESS_KEY、HW_SECRET_KEY、HW_SECURITY_TOKEN)、.obsutilconfig 读取;若所有来源的 ak/sk 均为空,脚本必须停止并要求用户在 .obsutilconfig 中补齐缺失的 key(或提供 CLI/环境变量凭证)。
- 凭证检查只报告 key(ak、sk、securitytoken)的存在与否,绝不打印凭证值,绝不打印 .obsutilconfig 的完整行;禁止使用 cat ~/.obsutilconfig 或 grep -E "ak|sk|token" ~/.obsutilconfig;可使用提供的 Linux/macOS awk 脚本或 Windows PowerShell 脚本做仅状态检查。
- 若用户需要 HTTPS 访问,必须通过 https:// 验证成功(使用 verify_obs_website.py --https),这要求通过 setBucketCustomDomain(..., certificateInfo=...) 为自定义域名绑定证书;OBS 仅在自定义域名上支持 HTTPS,且仅支持国际(通用)证书,不支持 SM(国密)证书;绑定证书时使用 --certificate-name 配合 --certificate + --private-key(直接 PEM)或 --certificate-id(CCM 证书);绝不打印或回显通过 --private-key 传入的私钥材料。
- 若桶名包含点号,警告 HTTPS 访问可能有问题。
- 始终返回:1) 输入摘要 2) 执行的操作 3) 验证结果 4) 失败时的修复步骤;当 DNS 由外部管理时,额外包含简短的 DNS 交接部分,明确告诉用户应在其提供商处配置哪条 CNAME 记录。
- 安全规则:绝不打印密钥、AK/SK 或 token;在网站 endpoint 验证通过前不得声称成功;若用户提供了自定义域名,最终成功必须基于该自定义域名的验证;权限缺失时停止并报告缺失能力;DNS 提供商归属未明确时先询问区域是在华为云 DNS 还是外部管理,不要假设 hcloud 步骤;若完成需要华为云 DNS 变更但区域未知,向用户询问区域而非猜测;不要用常规桶 endpoint 作为最终网站结果;obsutil 仅允许用于管理 ~/.obsutilconfig,不得用于配置网站托管;本技能不执行任何对象上传操作,验证期间只用只读检查,绝不上传测试文件。
- 已知坑:esdk-obs-python >= 3.x 的 setBucketWebsite API 使用 WebsiteConfiguration 模型对象,而不是 indexDocumentSuffix 之类的关键字参数;必须导入 WebsiteConfiguration、IndexDocument、ErrorDocument 并正确构造。
- 按需加载参考文档:references/obs-python-sdk-website.md(网站托管与自定义域名注册 setBucketCustomDomain 的 SDK 用法)、references/iam-policies.md(所需 IAM 动作与策略 JSON)、references/hcloud-dns-obs-website.md(通过华为云 DNS 的 hcloud CLI 配置自定义域名 CNAME 的分步指南,含区域查找、记录创建与验证)、references/cli-installation-guide.md(hcloud CLI 或 obsutil 安装与配置)、references/verification-method.md(验证规则)。
适用边界 · 注意事项
- 用户没有自定义域名且未完成注册(中国大陆还需 ICP 备案)时,不要继续配置静态网站托管;默认 OBS 域名即使测试环境也不允许用于网站访问。
- DNS 区域归属未明确(华为云 DNS 还是外部提供商)时,不要假设使用 hcloud 步骤。
- 用户要求 HTTPS 但只有 SM(国密)证书或未绑定证书时,不要声称 HTTPS 验证成功。