huawei-cloud-cdn-abnormal-status-code-analysis
huawei-cloud-cdn-abnormal-status-code-analysis について
このスキルはHuawei Cloudのhcloud CLIを使い、CDN配信ドメインの4xx/5xx異常を診断します。運用・障害分析向けの読み取り専用ツールで、エラー量の集計、エッジとオリジンの切り分け、設定やアクセスログによる調査を行います。
主な機能
- 014xx/5xxの件数と比率を集計
- 02エッジ生成とオリジンのコードを切り分け
- 03送信元IP・パス・ユーザーエージェントを分析
- 04CDN設定とアクセスログを確認
- 05原因候補と対応範囲を報告
活用シーン
- 01CDNの403や502の急増を調査
- 02エラーがエッジかオリジンかを判定
- 03アクセスログから異常リクエストを特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ huaweicloud/ huaweicloud-skills --skill huawei-cloud-cdn-abnormal-status-code-analysisインストール後、Claude Code で/huawei-cloud-cdn-abnormal-status-code-analysisを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.markdownlint.jsonreferences/acceptance-criteria.mdcli-installation-guide.mddataflow-diagram.mdiam-policies.mdprohibited-operations.mdrelated-apis.mdtask-discovery.mdtask-distribution.mdtask-forensics.mdtask-localize.mdtask-report.mdtask-rootcause.mdtroubleshooting.mdverification-method.mdscripts/fetch_cdn_log.py詳細
CDN 異常ステータスコード分析
概要
このスキルは、Huawei Cloud CDN の加速対象ドメインで発生する異常な HTTP ステータスコード(4xx / 5xx)を診断します。 最初から最後まで読み取り専用です。すべての操作はクエリです(統計情報の取得(GET)/設定の取得(GET)/ログダウンロードリンクの取得(GET)/読み取り専用のログ取得)。 4xx / 5xx の異常について、次の4つの質問に答えます。
- 異常は発生しているか、規模はどのくらいか? — 対象期間の4xx / 5xxの件数と割合を定量化します。
- 具体的なコード、発生時刻、エッジかオリジンか? — 特定のコードと時間帯まで掘り下げ、バックソース(
bs_*)ステータス統計を使って、エッジ生成かオリジン生成かを切り分けます。 - 誰が/どこから/どのパスにアクセスしたか? — IP/パス/UA/リファラーの上位情報と、クライアント IP 数(刷量か実ユーザーか)を確認します。
- 根本原因とフォレンジックは? — エッジ設定ルールまたはオリジン側の問題に絞り込み、アクセスログから該当リクエストを特定します。
主な機能:
- 1つのコマンド(
bs_status_code_*)で、エッジとオリジンを切り分けます。result={}⇒ エッジ生成、空でない場合 ⇒ オリジン生成です。 - 4xx / 5xxの全コードに対応します:400/401/403/404/405/406/408/410/412/416/429/499/495/496/500/501/502/503/504/505/530…。
- 読み取り専用のログヘルパー
scripts/fetch_cdn_log.pyは、CDN ログをダウンロードして展開し、異常ステータスの行を JSON として抽出します。 - ステータスコードから根本原因にたどる判断ツリーと、コンソール/工単での対処範囲を含む、構造化された診断レポートを作成します(CLI による書き込み操作はありません)。
ツール:hcloud CLI(KooCLI)+ Python ログヘルパー(scripts/fetch_cdn_log.py)。
基本原則:読み取り専用の診断です。設定は変更しません。
トリガー
次のいずれかにユーザー入力が一致する場合に使用します(ユーザーの表現レベル、多言語対応)。
| 言語 | トリガーの例(ユーザーの表現) |
|---|---|
| 中文 | 「CDN ドメインで 403 が急増したので調べてください」「最近 502 が続いているのはなぜですか」「4xx/5xx ステータスコード異常分析」「この問題はエッジですか、それともバックソースですか?切り分けてください」「業務異常コードの調査」「CDN のレート制限/ブロックの調査」「ステータスコード異常」 |
| English | "403 spike on my CDN domain" / "root-cause a 5xx burst" / "status code analysis" / "is this edge or origin?" / "abnormal status codes during daily inspection" |
キーワードによるトリガー(frontmatter の description にも記載):ステータスコード異常、業務異常コード、4xx、5xx、403、404、502、503、504、status code、abnormal status、CDN 異常、エッジ/バックソース、レート制限、status code analysis、edge vs origin。
該当しないケース/使用禁止
次の場合は、このスキルを使用しないでください。
| ケース | 代わりに行うこと |
|---|---|
| ドメインが Huawei Cloud CDN に登録されていない | まず CDN への登録状況/ドメインの存在を確認してください。CDN 以外の HTTP 問題は対象外です |
| ユーザーがCDN 設定の変更/更新/プリフェッチ/URL のブロック/ドメインの有効化・無効化を希望している | 拒否してください — このスキルは読み取り専用です。CDN コンソールまたは手動での hcloud CLI 操作を案内してください(禁止されている操作を参照) |
| ステータスコードに関係しない、純粋な帯域幅/トラフィック分析 | このスキルの対象外です(説明すべき4xx / 5xxの異常がありません) |
| ユーザーが AK/SK を貼り付けた、またはチャットで認証情報の設定を求めている | 拒否してください — 認証を参照してください。安全な設定テンプレートを提示して、返答を待ってください |
| CDN に関係しない業務上の例外(ECS/ELB/OBS/CDN の仕様に関係しないアプリケーション層の問題) | 該当するサービスのスキルを案内してください |
⛔ 禁止されている操作(セキュリティ上の制約)
このスキルでは、ユーザーから依頼された場合でも、すべての非GET(書き込み/変更/削除)CDN 操作を厳格に禁止しています。
禁止されている操作の合計:55 件(POST 24 件+PUT 25 件+DELETE 6 件)。
リスクの説明を含む、禁止されている非GET 操作 55 件の完全な一覧については、references/prohibited-operations.md を参照してください。
代表的な禁止操作(完全な一覧は参考ドキュメントを参照):
| 禁止操作 | CLI の例 | 理由 |
|---|---|---|
| ❌ ドメインの作成 | CreateDomain (v1/v2), CreateDomainByDuplicate | 書き込み操作であり、本番リソースを作成するため |
| ❌ ドメインの削除 | DeleteDomain (v1/v2) | 元に戻せないため |
| ❌ ドメイン設定の変更 | hcloud CDN UpdateDomainFullConfig / UpdateBlackWhiteList / UpdateRefer / UpdateResponseHeader / UpdateOriginHost / UpdateCacheRules / UpdateHttpsInfo | 書き込み操作であり、本番トラフィックに影響するため |
| ❌ ドメインの有効化/無効化 | EnableDomain (v1/v2), DisableDomain (v1/v2) | 書き込み操作であり、本番トラフィックに影響するため |
| ❌ 更新/プリヒート | hcloud CDN CreateRefreshTasks / CreatePreheatingTasks | 書き込み操作であり、キャッシュを変更するため |
| ❌ 課金モードの変更 | SetChargeModes | 金銭的な影響があるため |
| ❌ ドメイン所有者の検証 | hcloud CDN VerifyDomainOwner | 書き込み操作であるため |
| ❌ 統計設定/エクスポートの有効化 | SetStatsConfig / ExportStatsOpen | 書き込み操作であるため |
ユーザーから禁止操作を依頼された場合は、拒否して次のように伝えてください。 「セキュリティ上の制約により、このスキルでは読み取り専用の診断のみを行い、書き込み操作や削除操作は実行しません。 CDN の設定を変更するには、Huawei Cloud CDN コンソールを使用するか、該当する hcloud コマンドを手動で実行してください。このスキルでは実行しません。 禁止操作 55 件の完全な一覧は、references/prohibited-operations.md に記載されています。」
アーキテクチャ
CDN Abnormal Status Code Analysis (read-only)
├── ListDomains/v2 (target domain → domain_id)
├── ShowDomainStats/v2
│ ├── summary http_code_2xx..5xx + req_num → quantify 4xx/5xx volume + ratio
│ └── detail status_code_4xx/5xx → exact code + time array
├── ShowDomainStats/v2 bs_status_code_4xx/5xx → ★ edge vs origin fork ★
├── ShowBandwidthCalc / ListDomainClientStats → traffic-spike / 刷量 correlation
├── Top-N family → who / where / what path
├── Root cause fork
│ ├── origin side: ShowOriginHost / ShowDomainDetail / ShowHistoryTasks / TopOriginUrl
│ └── edge side: ShowDomainFullConfig / ShowRefer / ShowBlackWhiteList /
│ ListRuleDetails / ListBanUrl / ListAccessControlTask /
│ ShowResponseHeader / ShowCertificatesHttpsInfo
├── ShowLogs/v2 + python scripts/fetch_cdn_log.py → per-request forensics (JSON)
├── ShowIpInfo/v2 → client/edge IP attribution
└── generate diagnosis report
API 呼び出し予算
| ステップ | API/スクリプト | レート制限 | 推定時間 |
|---|---|---|---|
| 1 | hcloud CDN ListDomains/v2 --cli-region={region} | — | <2s |
| 2 | hcloud CDN ShowDomainStats/v2 --cli-region={region}(概要+詳細+bs) | 5/s | <3s |
| 3 | Top-N ファミリー+ListDomainClientStats | 2-5/s | <5s |
| 4 | hcloud CDN ShowDomainFullConfig/v2 --cli-region={region} + Show* 設定 | — | <5s |
| 5 | hcloud CDN ShowLogs/v2 --cli-region={region} + python scripts/fetch_cdn_log.py | — | ≤ 30s |
推定合計時間:< 45 秒(ログが多い時間帯では、さらに時間がかかる場合があります)。
KooCLI コマンド形式の標準
hcloud CDN <Operation> --cli-region=<region> [--key=value ...]
- サービス名:
CDN(大文字)。操作名:PascalCase(例:ShowDomainStats/v2)。 - リージョンパラメーター:
--cli-region=<region>。CDN がサポートするのはcn-north-1(北京)とap-southeast-1(シンガポール)です。結果はリージョンに依存しません。 推奨:一律でcn-north-1を使用してください。(cn-north-4は CDN でサポートされていません。) - パラメーター形式:
--key=value(等号を使用し、スペースは入れません)。スペース区切り形式はサポートされていません。 - 出力:機械で解析できるよう、末尾に
--cli-output=jsonを追加します。
前提条件
事前確認:hcloud(KooCLI)>= 3.2.0 —
hcloud version。インストールされていない場合は、references/cli-installation-guide.md を参照してください。
事前確認:Python >= 3.8 —
python --version。scripts/fetch_cdn_log.pyで必要です。
事前確認:Python
requests >= 2.25—python -c "import requests; print('ok')"。ログヘルパーはrequestsを使ってダウンロードします。 インストールされていない場合は、次を実行してください:pip install requests>=2.25
事前確認:hcloud の認証情報 —
hcloud configure list。無効な場合は中止し、安全な設定方法を案内してください。AK/SK を読み取る、エコーする、表示することは禁止です。また、チャットでユーザーに AK/SK の貼り付けを求めないでください。
⚠️ hcloud のパラメーター形式:すべてのパラメーターで
--key=valueを使用してください。
⚠️ CDN リージョン:
cn-north-1を一律で使用してください(CDN はcn-north-4に対応していません)。
⚠️ 時刻/間隔のルール:時刻 = ミリ秒単位のタイムスタンプ、
[start,end)は左閉右開です。interval=300(≤2d、5 分間隔のポイント)/3600(≤7d、1 時間間隔のポイント)/86400(≤31d、CST 0:00 のポイント)。status_code_*(エッジ)とbs_status_code_*(オリジン)は、1 つのクエリで混在できません。
認証
- 禁止事項:AK/SK の読み取り、エコー、表示、ユーザーにチャットで AK/SK の入力を求めること、平文を指定した
hcloud configure set、ユーザーが貼り付けた AK/SK の受け入れ。 - 許可事項:環境変数またはアクティブな CLI プロファイルからのみ認証情報を読み取ること。
- ユーザーが AK/SK を貼り付けた場合は、中止して拒否し、安全なセットアップ用テンプレート(
export HUAWEICLOUD_SDK_AK=.../HUAWEICLOUD_SDK_SK=...)を出力してから待機してください。 - 確認:
hcloud configure list— 有効なプロファイルが存在することを確認してください。存在しない場合は中止してください。
IAM 権限ポリシー
references/iam-policies.md を参照してください。最低限必要な権限は、ログのフォレンジック用の cdn:*:query*(および cdn:configuration:queryDomains)と cdn:log:* です。
このスキルは読み取り専用であり、作成/更新/削除/更新(refresh)/禁止の権限は必要なく、含まれていません。
主なコマンド
| コマンド | 用途 | 主なパラメーター |
|---|---|---|
hcloud configure list | 認証情報の確認 | なし |
hcloud CDN ListDomains/v2 --cli-region=<region> | ドメインを一覧表示 → domain_id | — |
hcloud CDN ShowDomainStats/v2 --cli-region=<region> --action=summary|detail --domain_name=<d> --stat_type=<t> --start_time=<ms> --end_time=<ms> --interval=<s> | ステータスコードの数値化/発生箇所の特定 | --action、--stat_type、--interval |
hcloud CDN ShowBandwidthCalc --cli-region=<region> --domain_name=<d> --calc_type=bw_peak --start_time=<ms> --end_time=<ms> | 帯域幅のピーク(トラフィック急増との相関) | --calc_type |
hcloud CDN ListDomainClientStats --cli-region=<region> --domain_name=<d> --stat_type=ip_num --start_time=<ms> --end_time=<ms> | クライアント IP 数(アクセス水増しと実ユーザーの判別) | --stat_type=ip_num |
hcloud CDN ListCdnDomainTopIps --cli-region=<region> --domain_name=<d> --stat_type=req_num --start_time=<ms> --end_time=<ms> | 上位 N 件の詳細確認(TopIps。Path/OriginUrl/Refers/Uas も同じ形式。req_num のみで、ステータスは対象外) | --stat_type=req_num |
hcloud CDN ShowDomainFullConfig/v2 --cli-region=<region> --domain_name=<d> | エッジ設定全体(認証/refer/IP フィルター/UA/…) | — |
hcloud CDN ShowRefer --cli-region=<region> --domain_id=<id> | Referer アクセス制御設定 | --domain_id |
hcloud CDN ShowBlackWhiteList --cli-region=<region> --domain_id=<id> | IP ブラックリスト/ホワイトリスト | --domain_id |
hcloud CDN ListRuleDetails --cli-region=<region> --domain_name=<d> | ルールエンジンのブロックルール | — |
hcloud CDN ListBanUrl --cli-region=<region> --start_time=<ms> --end_time=<ms> --page_number=1 --page_size=50 | ブロック対象 URL(チケットによるホワイトリスト登録が必要な場合があります) | 期間 |
hcloud CDN ListAccessControlTask --cli-region=<region> --start_time=<ms> --end_time=<ms> --limit=100 | ブロック/ブロック解除タスク(チケットによるホワイトリスト登録が必要な場合があります) | 期間 |
hcloud CDN ShowOriginHost --cli-region=<region> --domain_id=<id> | オリジンHOST | --domain_id |
hcloud CDN ShowResponseHeader --cli-region=<region> --domain_id=<id> | レスポンスヘッダー/エラーページ設定 | --domain_id |
hcloud CDN ShowDomainDetail --cli-region=<region> --domain_id=<id> | ドメイン詳細(オリジン/ステータス/CNAME) | --domain_id |
hcloud CDN ShowHistoryTasks/v2 --cli-region=<region> --file_type=file --page_number=1 --page_size=50 | 更新/事前ウォームアップの履歴 | — |
hcloud CDN ShowCertificatesHttpsInfo/v2 --cli-region=<region> --domain_name=<d> | HTTPS 証明書(49x/TLS) | --domain_name |
hcloud CDN ShowLogs/v2 --cli-region=<region> --domain_name=<d> --start_time=<ms> --end_time=<ms> --page_size=100 | ログのダウンロードリンク(単一ドメイン、最大30日) | --domain_name |
python scripts/fetch_cdn_log.py --url <link> [--status 403,502,503,504] [--timeout 30] [--max-lines 200] | ログを取得・展開し、異常行を抽出(JSON を出力) | --url、--status |
hcloud CDN ShowIpInfo/v2 --cli-region=<region> --ips=<ip1>,<ip2> | IP の帰属情報(最大20件) | --ips |
Top-N 系の
stat_typeでサポートされるのはflux/req_numのみです(ステータスコードは対象外)。ShowDomainStats/ログと照合してください。
パラメーターの確認
| パラメーター | 必須 | 説明 | デフォルト | 例 |
|---|---|---|---|---|
domain_name | はい | 診断対象の CDN 高速化ドメイン | — | www.example.com |
domain_id | はい(一部の ID 指定の Show* 操作で必要) | ListDomains/v2 の出力から取得 | — | d3aaa521… |
--cli-region | はい | CDN リージョン | cn-north-1 | cn-north-1 |
| 時間範囲 | はい | 区間の境界に合わせた [start,end) のミリ秒タイムスタンプ | — | 過去7日間 |
--status(ログヘルパー) | いいえ | 抽出するステータスコード | 403,404,499,500,502,503,504,530 | 403,502 |
ユーザー確認チェックリスト:
- 対象ドメインが指定されている
- 読み取り専用の診断であることをユーザーが理解している
- ログ取得のタイムアウトが30秒であることをユーザーが理解している
コアワークフロー
診断を始める前に、対象ドメインが必要です。
- ユーザーが対象ドメインを指定していない場合は、ドメイン名を尋ね、返信を待ってから開始してください。
- ユーザーがドメインを知らない場合、または検索を依頼した場合に限り、
hcloud CDN ListDomains/v2でアカウントのドメイン一覧を取得し、ユーザーに選択してもらってください。- ユーザーから明示的にドメインを指定される前に、診断を開始しないでください。ドメインを推測したり、例示用/デフォルトのドメインに切り替えたり、一覧から自分でドメインを選んだりしてはいけません。
ステップ 1:検出と定量化 — 4xx/5xx、サイズ、トラフィックの相関を確認する
📄 詳細な手順 → references/task-discovery.md
ステップ 2:範囲の特定と分岐 — 正確なコード+時間+エッジ/オリジン
📄 詳細な手順 → references/task-localize.md
ステップ 3:分布 — 上位 N 件+クライアント IP 数
📄 詳細な手順 → references/task-distribution.md
ステップ 4:根本原因 — ステップ 2 の分岐に応じたオリジン側(4A)/エッジ側(4B)
📄 詳細な手順 → references/task-rootcause.md
ステップ 5:リクエストごとのフォレンジック — ログ取得+IP の帰属
📄 詳細な手順 → references/task-forensics.md
ステップ 6:レポート — 判断ツリー+修正対応の範囲
📄 詳細な手順 → references/task-report.md
FAQ(Q&A)
詳細なトラブルシューティングとエラーコードの全一覧は、references/troubleshooting.md を参照してください。
Q1:ListBanUrl/ListAccessControlTask が CDN.0004 を返すのはなぜですか?
A:これら 2 つのクエリ API は工单(サポートチケット)のホワイトリスト登録が必要です。いずれもクエリ系の GET 操作です。 エラーを記録し、回避せず、他の証拠の確認を続け、レポートには「CLI では未確認」と記載してください。
Q2:ShowDomainStats が空の結果を返すのはなぜですか?
A:対象期間にトラフィックがない、該当するステータスコードが発生していない、またはタイムスタンプが間隔と一致していない(interval=86400 では CST の 0:00 の時点が必要)ことが原因です。期間を広げ(例:31 日間)、時点をそろえ、ドメインにトラフィックがあったことを確認してから再試行してください。
Q3:status_code_* と bs_status_code_* を 1 つのクエリで組み合わせられますか?
A:いいえ。 エッジ側とオリジンへのリクエスト側の統計は、別々に ShowDomainStats/v2 を呼び出して取得する必要があります。
Q4:Top-N の結果にステータスコードがないのはなぜですか?
A:Top-N 系(TopIps/Path/OriginUrl/Refers/Uas)の stat_type が対応しているのは flux/req_num のみです。ステータスコードのディメンションはありません。Top-N で疑わしい IP/パスを絞り込み、ShowLogs/ShowDomainStats で実際のステータスコードを照合してください。
Q5:ShowLogs が logs: []/total: 0 を返すのはなぜですか?
A:対象期間をカバーするログファイルがない、期間が左閉右開になっていない/時間単位にそろっていない、またはその期間にドメインへのトラフィックがなかったことが原因です。CST の時刻を時間単位にそろえ、期間を広げ、トラフィックがあったことを確認してから再試行してください。
Q6:fetch_cdn_log.py のエラーにはどう対処すればよいですか?
A:references/troubleshooting.md のエラーコード表を参照してください(error.reason の値は 9 種類です:
connect_timeout/connect_failed/http_error/bad_gzip/invalid_url/invalid_timeout/
invalid_max_lines/invalid_status/missing_library)。ソフトエラーでは終了コード 0(JSON に error を含む)、引数エラー/ライブラリ不足では終了コード 2 になります。よくある対処法:--timeout を引き上げる(≤60)、期限切れリンクを更新するために ShowLogs/v2 を再実行する、または python -m pip install requests>=2.25 を実行してください。
Q7:CDN クエリが 403 Insufficient permission を返すのはなぜですか?
A:IAM ユーザーに CDN 読み取り専用スコープがありません。references/iam-policies.md に従って、ログのフォレンジックには cdn:*:query*(および cdn:configuration:queryDomains と cdn:log:*)を付与してください。
書き込み操作の権限には絶対に昇格させないでください。
既知の問題と制限事項
| 制限事項 | 説明 |
|---|---|
ShowLogs/v2 | 単一ドメインのみ。期間は 30 日以内 |
Top-N stat_type | flux/req_num のみ。ステータスコードのディメンションはありません(相互確認が必要です) |
ListDomainClientStats | ip_num は 1 日単位(CST 0:00)のみ対応します。ユニークビジター指標は 5 分単位に対応します |
ListBanUrl / ListAccessControlTask | 工单(サポートチケット)ホワイトリストへの登録が必要です(CDN.0004)。記録して続行してください |
| ログ解析 | fetch_cdn_log.py は Huawei Cloud の公式 14 フィールドログ形式を解析します。空白を含むフィールド(time、user_agent)は 1 つのトークンとして保持されるか、引用符で囲まれます(公式ドキュメント) |
| CDN リージョン | cn-north-1/ap-southeast-1 のみ対応しています。一律で cn-north-1 を推奨します。cn-north-4 には対応していません |
エラーコード早見表
| エラー | 意味 | 対応 |
|---|---|---|
CDN.0004 | 工单ホワイトリストに登録されていません(ListBanUrl / ListAccessControlTask) | 記録して続行し、「CLI では未確認」と明記します |
cli-region的值不支持 | CDN がサポートしていないリージョンです | --cli-region=cn-north-1(または ap-southeast-1)を使用します |
403 Insufficient permission | IAM に CDN の読み取り専用スコープがありません | cdn:*:query*(および cdn:log:*)を付与します。権限を昇格させないでください |
失敗モード
詳細なトラブルシューティングについては、references/troubleshooting.md を参照してください。各タスク手順の終了条件がセルフチェックになります。
既知の失敗モードと復旧戦略
| 失敗モード | 症状 | 復旧戦略(再試行/フォールバック/縮退/報告) |
|---|---|---|
| サポートされていないリージョン | cli-region的值不支持 が表示され、cn-north-4/ru-moscow-1 のみが候補として示される | --cli-region=cn-north-1(または ap-southeast-1)に切り替えます |
| CDN.0004 ホワイトリスト | ListBanUrl/ListAccessControlTask が「ホワイトリストに登録されていない」と返す | 縮退:CLI では未確認として記録し、ほかの証拠を用いて続行し、レポートに明記します。回避してはいけません |
| 結果が空 | ShowDomainStats が {} を返す | 再試行:期間を広げ(31 日)、間隔の境界に合わせ(86400 の場合は CST 0:00)、トラフィックを確認します |
| エッジ/オリジンの混在クエリ | status_code_* と bs_status_code_* を同時に渡すとエラーになる | ShowDomainStats/v2 を 2 回に分けて呼び出します |
| Top-N にステータスコードがない | Top-N がリクエスト数のみを返す | 相互確認:実際のコードを ShowLogs/ShowDomainStats で確認します |
| ShowLogs がリンクを返さない | logs: []/total: 0 | 再試行:CST の正時に合わせ、期間を広げて、その期間内にトラフィックがあることを確認します |
| ログのダウンロード失敗 | fetch_cdn_log.py の error.reason が connect_timeout/connect_failed/http_error/bad_gzip | 再試行/更新:--timeout を引き上げ(≤60)、ShowLogs/v2 を再実行して期限切れのリンクを更新し、gzip を確認します |
| 権限拒否 | クエリが 403 Insufficient permission を返す | IAM の読み取り専用スコープ(cdn:*:query* と cdn:log:*)を確認します。書き込み操作に権限を昇格させてはいけません |
エラーの伝播と処理プロトコル(fetch_cdn_log.py)
- exit 0:プローブが完了しました(HTTP の非 200、結果なし、不正な gzip、タイムアウトなどのソフト失敗を含みます)。呼び出し元に
error.reasonを含む JSON を出力します。 - exit 2:引数エラー、または依存ライブラリ(
requests)がありません。 error.reasonの列挙値(9 種類):connect_timeout/connect_failed/http_error/bad_gzip/invalid_url/invalid_timeout/invalid_max_lines/invalid_status/missing_library。
出力前のセルフチェック
- レポートに必要なすべてのセクション(Summary/Distribution/Root Cause/Conclusion/Remediation boundary)が含まれていますか?
- すべての主張に証拠(設定状態/bs の判定/ログ行/ルール一覧)がありますか?
- 未確認の項目(例:CDN.0004 によるブロック)が「CLI では未確認」と明記されていますか?
- このスキルが実行する書き込み操作を推奨していませんか?(必ず「はい」であること)
出力形式
このスキルには 2 つの出力契約があります。
1. 診断レポート(プレーンテキスト)
レポートのテンプレート:references/task-report.md。必須のセクションとフィールド:
| セクション | 必須フィールド |
|---|---|
| ヘッダー | 分析時刻(ISO8601)、対象ドメイン、リージョン |
| 概要 | 異常なステータスコードのセット、異常期間(CST)、ボリューム/比率、エッジ起因の判定(bs_status_code_<X> が空 → エッジ/空でない → オリジン) |
| 分布 | 上位 IP/URL/UA/Referer、クライアントの判定(少数 IP のバースト/多数の実ユーザー、ip_num/req_num を含む)、帯域幅のピーク |
| 根本原因 | 候補となるメカニズム、証拠、除外した項目、CLI で未確認の項目 |
| 結論 | ステータス(エッジ生成/オリジン生成/部分的)、提案、修正の範囲(書き込み操作は CDN コンソールまたは手動の hcloud CLI からのみ実行) |
2. fetch_cdn_log.py JSON(構造化データ)
スキーマ:references/related-apis.md。トップレベルのフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
url | string | ログのダウンロードリンク |
http_status | int | ダウンロード時の HTTP ステータス |
byte_size | int | ダウンロードしたバイト数 |
status_filter | int[] | ステータスコードのフィルターセット |
rows[] | object[] | 一致した行(フィールドの列挙値:status(int 100-599)、cache_status(HIT/MISS)、time、…)。client_ip、url、user_agent、edge_node_ip を含む |
count | int | 一致した行の数 |
duration_ms | int | 経過時間 |
error | object/null | null または {reason, message}(reason の列挙値 — 失敗モードを参照) |
出力例(fetch_cdn_log.py JSON の抜粋)
{"status":403,"client_ip":"120.46.140.45","url":"/index.html","cache_status":"HIT","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","edge_node_ip":"39.136.130.12","time":"[10/Aug/2026:15:55:13 +0800]"}
出力に絶対に含めてはならない内容
- AK/SK およびあらゆる認証情報(認証を参照)
- 内部アドレス/機密アドレスおよび顧客の個人情報(診断に必要なフィールドのみを出力)
- 生の完全なログテキスト(抽出した行のフィールドのみを出力)
- 証拠に基づかない結論(未確認の項目は「未確認」と明記)
参考資料
| ドキュメント | 説明 |
|---|---|
| task-discovery.md | ステップ 1:調査と定量化 |
| task-localize.md | ステップ 2:正確なコードの特定とエッジ/オリジンの切り分け |
| task-distribution.md | ステップ 3:上位 N 件/クライアントの分布 |
| task-rootcause.md | ステップ 4:オリジン側(4A)/エッジ側(4B)の根本原因 |
| task-forensics.md | ステップ 5:リクエスト単位のログフォレンジック |
| task-report.md | ステップ 6:診断レポートと判断ツリー |
| prohibited-operations.md | 禁止されている GET 以外の操作(POST/PUT/DELETE)全 55 件 |
| dataflow-diagram.md | Mermaid データフロー図 |
| related-apis.md | API/CLI リファレンス + stat_type + ステータスコードマップ |
| iam-policies.md | IAM 最小権限ポリシー |
| verification-method.md | 検証方法 |
| acceptance-criteria.md | 受け入れ基準チェックリスト |
| troubleshooting.md | トラブルシューティング |
| cli-installation-guide.md | CLI インストールガイド |
変更履歴/バージョン履歴
| バージョン | 日付 | メンテナー | 変更内容 |
|---|---|---|---|
| v1.0.0 | 2026-08-10 | cdn-ops | 初回リリース:読み取り専用の6ステップ診断ワークフロー(検出/特定/配信/根本原因/フォレンジック/レポート)、禁止操作55件、ログフォレンジック用ヘルパー fetch_cdn_log.py、参考ドキュメント14件 |
バージョン管理には SemVer(
major.minor.patch)を使用します。現在のフロントマターのversion: 1.0.0。大きな変更のたびに、表に行を追加し、フロントマターのversionを更新してください。 メンテナー:cdn-ops。このスキルが依存する CDN クエリ API(例:ShowLogs/v2、bs_status_code_*統計)が非推奨化/提供終了となる場合、または動作が変更された場合は、references/related-apis.md と references/troubleshooting.md を適宜更新してください。