mcpField
H
huawei-cloud-obs-website-host

huawei-cloud-obs-website-host

github.com/huaweicloudクラウド・DevOps5917.2k 回インストール2 日前に更新
リポジトリ

huawei-cloud-obs-website-host について

既存の Huawei Cloud OBS バケットで静的ウェブサイトホスティングを設定し、必須のカスタムドメインを登録するスキルです。アクセス検証に加え、権限、パス、DNS の一般的な問題を調査します。

主な機能

  1. 01OBS 静的ウェブサイトホスティングの設定
  2. 02インデックスとエラードキュメントの指定
  3. 03必須カスタムドメインの登録
  4. 04ウェブサイトと DNS アクセスの検証
  5. 05403 と 404 エラーの調査

活用シーン

  1. 01既存 OBS バケットでのホスティング有効化
  2. 02ウェブサイトとカスタムドメインの接続
  3. 03ホスト中のサイトのアクセス問題確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/huaweicloud/huaweicloud-skills --skill huawei-cloud-obs-website-host

インストール後、Claude Code で/huawei-cloud-obs-website-hostを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
cli-installation-guide.md
hcloud-dns-obs-website.md
iam-policies.md
obs-python-sdk-website.md
verification-method.md
scripts/
set_obs_website_sdk.py
verify_obs_website.py

詳細

Huawei Cloud OBS ウェブサイトホスト

概要

Huawei Cloud OBS Python SDK を使用して既存の Huawei Cloud OBS バケットを静的ウェブサイトホスティング用に設定し、サイトにカスタムドメインを登録します。

次のような場合に、このスキルを使用します。

  • OBS の静的ウェブサイトホスティングを有効化または修復する
  • インデックスドキュメントまたはエラードキュメントを設定する
  • OBS 静的ウェブサイトエンドポイントを使用して、カスタムドメインからサイトにアクセスできるようにする
  • Huawei Cloud DNS が該当する場合は、カスタムドメインを追加または修復する
  • ホストされている OBS サイトの 403、404、または DNS の問題を診断する

適切な状態

  • バケットで静的ウェブサイトホスティングが有効になっています。
  • バケットはウェブサイトエンドポイントから index.html を配信できます。
  • 匿名ユーザーがウェブサイトのコンテンツを読み取れます。
  • 存在しないパスへのアクセス時に、設定済みのエラーページまたは適切な 404 が返されます。
  • カスタムドメインが登録され、DNS を介して OBS ウェブサイトエンドポイントに解決されます。セキュリティコンプライアンス要件により、カスタムドメインは必須です。デフォルトの OBS バケットドメインをオンラインでのオブジェクトプレビューに使用することは許可されていません。
  • カスタムドメインがバケットに登録され、正しく解決されるまでは、設定が完了したとは見なされません。
  • 通常のバケット API エンドポイントではなく、OBS ウェブサイトエンドポイントを使用します。
  • 403 の主な原因は通常 2 つあります。バケットまたはオブジェクトで匿名/パブリック読み取りが有効になっていないか、OBS 操作に使用する AK/SK に必要な IAM 権限がないことです。
  • 404 は通常、インデックスドキュメント名またはアップロードパスが間違っていることを示します。

セキュリティコンプライアンス:カスタムドメインの要件

Huawei Cloud のセキュリティコンプライアンス要件に基づき、OBS バケットのデフォルトドメイン名(<bucket_name>.obs.<region>.myhuaweicloud.com)を、バケット内のオブジェクトのオンラインプレビューに使用することは禁止されています。そのため、静的ウェブサイトホスティングにはカスタムドメインが必須です。

ユーザーがカスタムドメインをまだ用意していない場合は、次の手順に従います。

  1. Huawei Cloud ドメイン登録サービスまたは一般的な他のドメイン登録サービスでドメインを登録するよう、ユーザーに案内します。
  2. 中国本土のユーザーは、ウェブサイトホスティングに使用する前に、ドメインの ICP 登録(网站备案) も完了する必要があります。
  3. ドメインの登録(該当する場合は ICP 登録も)が完了してから、静的ウェブサイトホスティングの設定を続行します。

重要: カスタムドメインが前提条件を満たしていることを確認するまで、静的ウェブサイトホスティングの設定に進まないでください。テスト環境であっても、デフォルトの OBS ドメインはウェブサイトへのアクセスに使用できる代替手段ではありません。

必要な入力情報

変更を行う前に、次の情報を収集します。

  • region
  • bucket_name
  • custom_domain(必須。上記の「セキュリティコンプライアンス」セクションを参照)
  • index_document(任意。デフォルト:index.html)
  • error_document(任意)
  • dns_zone または DNS アカウントの情報(任意。この実行で Huawei Cloud DNS の変更をユーザーが希望する場合にのみ必須)

静的ウェブサイトのファイルは、ユーザーによってすでにアップロードされているものとします。

依存関係

このスキルは、次のランタイム/ツールコンポーネントに依存します。

  • Python 3.10+(scripts/set_obs_website_sdk.py と scripts/verify_obs_website.py に必要)
  • Huawei OBS Python SDK パッケージ:esdk-obs-python
  • obsutil(認証情報設定ファイル .obsutilconfig の生成と管理に使用)
  • Huawei Cloud AK/SK 認証情報(.obsutilconfig から取得)
  • OBS エンドポイントおよびウェブサイトエンドポイントへのネットワークアクセス
  • hcloud CLI(このスキルで Huawei Cloud DNS レコード操作を管理する場合にのみ必須)
  • dig/nslookup(任意)

インストールコマンド:

pip install esdk-obs-python

hcloud CLI リファレンス

hcloud CLI または obsutil のインストールと設定が必要な場合は、references/cli-installation-guide.md を読み込んでください。 OBS 静的ウェブサイトのカスタムドメイン用に DNS CNAME レコードを作成または管理する場合は、references/hcloud-dns-obs-website.md を読み込んでください(hcloud の DNS CreateRecordSet コマンドを使った手順ガイドです)。

セキュリティに関する注意事項:

  • AK/SK をスクリプトやチェックイン対象のファイルにハードコードしないでください。
  • SDK スクリプトでは環境変数を、CLI の使用では安全なローカルプロファイルストレージを優先してください。

obsutil の設定依存関係

obsutil のインストールまたは .obsutilconfig の設定方法が必要な場合は、references/cli-installation-guide.md を読み込んでください。

Python SDK ヘルパースクリプト(scripts/set_obs_website_sdk.py)は、デフォルトで次の順に認証情報を読み込みます。

  1. CLI フラグ(--access-key、--secret-key、--security-token)
  2. 環境変数(HW_ACCESS_KEY、HW_SECRET_KEY、HW_SECURITY_TOKEN)
  3. .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 ~/.obsutilconfig
  • grep -E "ak|sk|token" ~/.obsutilconfig

スクリプトの使用方針

各スクリプトが想定するタスクには、デフォルトで同梱スクリプトを使用してください。

  • scripts/set_obs_website_sdk.py は、バケットのウェブサイト設定を適用または更新し、必要なカスタムドメインを登録します。OBS 静的ウェブサイトのホスティング設定を有効化、修復、または変更するタスクでは、必ずこのスクリプトを使用してください。
  • scripts/verify_obs_website.py は、公開されたウェブサイトエンドポイントを検証します。ウェブサイト設定を変更した後は必ず使用してください。また、ユーザーからサイトにアクセスできるかどうかを尋ねられた場合や、403/404 の問題を調査する場合にも使用してください。
  • スクリプト自体に不具合があり、パッチを適用する必要がある場合を除き、これらのスクリプトを場当たり的な単発コードに置き換えないでください。
  • スクリプトを使用して、認証情報の処理、SDK オブジェクトの構築、検証動作を実行間で一貫させてください。

ワークフロー

  1. Python ランタイムと OBS SDK が利用可能であることを確認します(見つからない場合は pip install esdk-obs-python を実行します)。
  2. カスタムドメインの前提条件を確認します(セキュリティコンプライアンスセクションを参照):
    • ユーザーから custom_domain が提供されていることを確認します。
    • ドメインを持っていない場合は、Huawei Cloud Domain Registration での登録と、中国本土リージョン向けの ICP 登録(网站备案) の完了を案内します。ここでいったん停止し、ユーザーがこの手順を完了するまで待ちます。
    • ユーザーが Huawei Cloud DNS と外部プロバイダーのどちらで DNS を管理しているか確認します。
    • この実行で Huawei Cloud DNS を変更する場合は、hcloud がインストールされ、認証済みであることを確認します。
    • Huawei Cloud 以外で DNS を管理している場合、またはこの実行の範囲外で管理している場合は、先にその制約を明確に確認します。
  3. 指定されたリージョンにバケットが存在することを確認します(以下のバケットの存在確認とリージョン確認の方法を使用します)。
  4. 呼び出し元にバケットのウェブサイト設定を更新する権限があることを確認します。
  5. ウェブサイトのファイルに対する匿名読み取りが許可されていることを確認します(以下の匿名読み取り確認の方法を使用します)。
  6. ウェブサイトのコンテンツオブジェクト(index.html、アセットなど)はアップロードも変更もしないでください。コンテンツはすでにバケットに存在すると想定します。
  7. scripts/set_obs_website_sdk.py を --custom-domain <domain> 付きで実行して、静的ウェブサイトホスティングを設定します(index_document が指定されていない場合は index.html を使用します)。
    • このスクリプトは、SDK オブジェクトの構築方法と認証情報の参照方法を統一するために用意されています。
    • 回答内で一回限りの SDK 呼び出しを記述するのではなく、このスクリプトを使用します。
  8. スクリプトで使用する OBS SDK の手順を通じて、必要なカスタムドメインをバケットに登録します。
    • client.setBucketCustomDomain(bucket_name, custom_domain) — DNS CNAME がすでに存在する場合でも必須です。
    • この実行で DNS レコードの変更を依頼された場合は、OBS ウェブサイトホスト名を指す DNS CNAME レコードを作成し、反映を待ちます。(references/hcloud-dns-obs-website.md を参照してください)
    • Huawei Cloud 以外で DNS を管理している場合、またはこの実行の範囲外で管理している場合は、必要な CNAME のターゲットを提示し、OBS のカスタムドメイン登録が完了した後に外部 DNS プロバイダーで CNAME レコードを作成または更新するよう、ユーザーにはっきりと案内します。
    • 外部 DNS で管理されている場合は、ユーザーが作業を引き継ぐために必要な実用的な情報として、レコードタイプ CNAME、ホスト名、ターゲット、および dig などの確認コマンドを提示します。
  9. scripts/verify_obs_website.py --bucket-name <bucket_name> --region <region> [--domain <custom_domain>] [--index-document <name>] を実行して、公開されたサイトを確認します。
    • ユーザーがカスタムドメインを指定した場合、最終確認では必ず --domain <custom_domain> を使ってそのカスタムドメインを確認します。
    • デフォルトの OBS ホスト名は、中間確認時、またはカスタムドメインが指定されていない場合にのみ使用します。
  10. ルートパスがホームページを返すことを確認します(HTTP 200)。
  11. 存在しないパスが、設定されたエラー動作を返すことを確認します(HTTP 404 または設定されたエラーページ)。
  12. DNS 解決(dig/nslookup)と、ユーザーが指定したカスタムドメイン経由の HTTP アクセスを確認します。依頼にカスタムドメインが含まれている場合、デフォルトの OBS ホスト名だけで設定完了と判断しないでください。

バケットの存在確認とリージョン確認の方法

ウェブサイトの設定前に、verify_obs_website.py を使用して読み取り専用の SDK チェックを実行します。

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 以外を返す、またはリージョンが明確に一致しないこと。

匿名読み取りの確認方法

OBS ウェブサイトのエンドポイントに対する匿名 HTTP リクエスト(AK/SK なし)を、正しい情報源として使用します。

  1. 検証ツールはデフォルトのウェブサイト URL を自動的に組み立てます。
    • http://<bucket_name>.obs.<region>.myhuaweicloud.com
  2. 同梱の検証ツールを実行します(推奨)。
python scripts/verify_obs_website.py \
  --bucket-name "<bucket_name>" \
  --region "<region>" \
  --domain "<custom_domain>" \
  --index-document "<index_document>"
  1. ユーザーからカスタムドメインが指定されていない場合は、デフォルトの OBS ウェブサイトエンドポイントを検証します。
python scripts/verify_obs_website.py \
  --bucket-name "<bucket_name>" \
  --region "<region>" \
  --index-document "<index_document>"
  1. 単一ファイルをすばやく確認する場合は、次を実行します。
site_url="http://<custom_domain>"
curl -s -o /dev/null -w "%{http_code}\n" "$site_url/<index_document>"

合否ルール:

  • root_path と index_document が 200 の場合、匿名読み取りは機能しています。
  • 403 の場合は、どちらもユーザーに報告が必要な次の 2 つの問題として扱います。匿名/パブリック読み取りが有効になっていない(ACL/ポリシーの問題)、または SDK の検証/設定に使用した AK/SK に必要な IAM 権限がありません。
  • 404 はオブジェクトのパス/名前の問題(例:index.html がない、またはキーのパスが一致しない)であり、匿名権限が有効であることを示すものではありません。

403 が発生した場合は、セットアップを失敗として扱い、次の一般的な可能性を両方ともユーザーに伝えてください。

  • バケット/オブジェクトで、ウェブサイトアクセス用のパブリック読み取りが有効になっていない
  • AK/SK に OBS 操作に必要な IAM 権限がない

references/iam-policies.md を参照して、修正方法を提示してください。

応答形式

必ず次の内容を返してください。

  1. 入力の概要
  2. 実行した操作
  3. 検証結果
  4. 失敗があった場合の修正手順

DNS が外部で管理されている場合は、プロバイダーで設定する CNAME レコードを正確に示す、簡潔な DNS 引き継ぎセクションも含めてください。

安全ルール

  • シークレット、AK/SK、トークンを表示しないでください。
  • ウェブサイトのエンドポイントを検証するまで、成功したと報告しないでください。
  • ユーザーからカスタムドメインが指定された場合、デフォルトの OBS ホスト名だけではなく、そのカスタムドメイン経由の検証に基づいて最終的な成功を判断してください。
  • 権限が不足している場合は、処理を停止し、不足している機能を報告してください。
  • DNS プロバイダーの所有者が指定されていない場合は、hcloud の手順を前提とする前に、ゾーンが Huawei Cloud DNS で管理されているか、外部で管理されているかを確認してください。
  • 完了に Huawei Cloud DNS の変更が必要で、ゾーンが不明な場合は、推測せずにゾーンを確認してください。
  • 通常のバケットエンドポイントを、最終的なウェブサイトの結果として使用しないでください。
  • バケット名にドットが含まれる場合は、HTTPS アクセスに問題が生じる可能性があることを警告してください。
  • ユーザーが HTTPS アクセスを必要としている場合は、https:// 経由で成功を検証する必要があります。verify_obs_website.py は HTTP と HTTPS の両方のエンドポイントを常に確認するため、有効な証明書がないカスタムドメインには TLS の修正手順が提示されます。OBS で HTTPS を使用するには、setBucketCustomDomain(..., certificateInfo=...) を使ってカスタムドメインに証明書を紐付ける必要があります。OBS が HTTPS をサポートするのは、カスタムドメインのみで、国際(一般)証明書を使用する場合に限られます。SM(国家暗号)証明書はサポートされません。
  • --private-key で渡された秘密鍵の内容を表示または出力しないでください。
  • obsutil は ~/.obsutilconfig の管理に限り使用できます。ウェブサイトホスティングの設定には使用しないでください。
  • このスキルでは、オブジェクトのアップロード操作を実行しないでください。
  • 特に検証時は読み取り専用の確認のみを使用し、テストファイルをアップロードしないでください。
  • DNS が外部で管理されている場合、「DNS は外部管理です」と伝えるだけで終わらせず、セットアップを完了するために必要な CNAME の引き継ぎ情報をユーザーに提示してください。

権限エラーへの対応(必須)

いずれかのコマンドが IAM 権限エラーで失敗した場合:

  1. references/iam-policies.md を読みます。
  2. 必要な権限の一覧とポリシー JSON をユーザーに提示します。
  3. カスタム IAM ポリシーを作成し、Huawei Cloud IAM コンソールで付与するようユーザーを案内します。
  4. 権限が付与されたことをユーザーが確認するまで、処理を一時停止します。

参考資料

ウェブサイトホスティングの SDK メソッドの使用方法と、カスタムドメインの登録(setBucketCustomDomain)については、references/obs-python-sdk-website.md を読み込んでください。 必要な IAM アクションとポリシー JSON については、references/iam-policies.md を読み込んでください。 Huawei Cloud DNS(hcloud CLI)を使ったカスタムドメインの DNS CNAME 設定手順(ゾーンの検索、レコードの作成、検証を含む)については、references/hcloud-dns-obs-website.md を読み込んでください。

既知の注意点: esdk-obs-python >= 3.x の setBucketWebsite API では、キーワード引数(indexDocumentSuffix など)ではなく、WebsiteConfiguration モデルオブジェクトを使用します。必ず WebsiteConfiguration、IndexDocument、ErrorDocument をインポートし、適切に構築してください。

スクリプト

スクリプトは、繰り返し可能な確認と検証にのみ使用してください。コマンドの出力は、人が読みやすく、成功または失敗に焦点を当てた内容にしてください。

  • scripts/set_obs_website_sdk.py <bucket_name> <endpoint> --custom-domain <domain> [--index-document <name>] [--error-document <name>] は、OBS SDK を通じて静的ウェブサイトホスティングの設定を適用し、必要なカスタムドメインを登録します。認証情報は CLI 引数、環境変数、または ~/.obsutilconfig から読み込みます。OBS は setBucketCustomDomain(..., certificateInfo=...) によるカスタムドメインでの HTTPS をサポートしています。証明書を紐付けるには、--certificate-name とともに、--certificate + --private-key(PEM を直接指定)または --certificate-id(CCM 証明書)のいずれかを使用してください。対応しているのは国際(汎用)証明書のみで、SM(国家暗号)証明書はサポートされていません。
  • scripts/verify_obs_website.py --bucket-name <name> --region <region> [--domain <custom_domain>] [--index-document <name>] [--json] は、エンドポイントの DNS/HTTP/HTTPS の動作を検証し、読み取り専用のバケット存在確認とリージョン確認(headBucket + getBucketLocation)も実行します。--domain を指定した場合はそのカスタムドメインを最終的な検証対象とし、指定しない場合は既定のウェブサイト URL http://<bucket>.obs.<region>.myhuaweicloud.com を自動的に構築します。http:// と https:// の両方を必ず検証するため、カスタムドメインの TLS 証明書の問題(certificate_verify_failed/ホスト名の不一致)を検出し、修正手順を報告します。OBS API エンドポイントは https://obs.<region>.myhuaweicloud.com のままです。エージェントの応答でそのまま再利用できるよう、構造化されたセクション(Input summary、Actions performed、Verification results、Remediation steps)を出力します。

検証ルール

検証ルールについては、references/verification-method.md を読み込んでください。

コメント