huawei-cloud-ecs-dsh-deploy について
Huawei Cloud Flexus X に DeepSeek Harness(dsh)をデプロイするスキルです。クラウド上にエージェント開発環境を用意する開発者向けで、実行前に明示的な確認が必要です。Web UI は SSH トンネル経由で利用します。
主な機能
- 01dsh のデプロイとクラウドサーバー管理
- 02リージョンと既存サーバーの一覧表示
- 03Huawei Cloud 認証情報のテスト
- 04状態確認またはサーバー削除
- 05SSH トンネル経由の Web UI アクセス
活用シーン
- 01クラウド上のエージェント開発環境の構築
- 02dsh Web UI のデプロイと実行
- 03デプロイ済みサーバーの確認と管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ huaweicloud/ huaweicloud-skills --skill huawei-cloud-ecs-dsh-deployインストール後、Claude Code で/huawei-cloud-ecs-dsh-deployを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/acceptance-criteria.mdcli-installation-guide.mdconversation-examples.mdiam-policies.mdverification-method.mdscripts/coc_deploy.pyconfig.pydeploy_dsh.pyhuawei_cloud_ecs.pypyproject.tomlquery_regions.pyutils.py詳細
Huawei Cloud Flexus X + DeepSeek Harness(dsh)のワンクリックデプロイ
⚠️ デプロイ前の確認事項(最優先)
このスキルでは実際に料金が発生する操作(Huawei Cloud Flexus X インスタンスの作成)を行うため、実行前にユーザーの確認が必要です!
必ず確認する項目:
- リージョン(デフォルト:cn-north-4)
- フレーバー(デフォルト:x1.2u.4g、2 コア、4GB)
- 課金モード(デフォルト:従量課金)
禁止事項:
- ❌ ユーザーが明示的に確認する前にデプロイを実行しないでください
- ❌ ユーザーに確認せず、デフォルト設定でデプロイしないでください
- ❌ ユーザーがデフォルト値を受け入れると決めつけないでください
- ❌ 料金を捏造したり、推定したりしないでください(例:「約 ¥0.2~0.3/時間」)。必ず公式の料金ページを案内してください
正しい手順:
- デフォルト設定(リージョン、フレーバー、課金モード)をユーザーに提示します
- 料金については、公式料金計算ツール(https://www.huaweicloud.com/pricing/calculator.html#/hecs)を利用するよう案内します
- 設定を確認するか、変更するかをユーザーに尋ねます
- ユーザーが
CONFIRM(大文字)と入力した後にのみ、デプロイを実行します
概要
このスキルを使うと、DeepSeek AI のオープンソース AI エージェントハーネスである DeepSeek Harness(dsh) を Huawei Cloud Flexus X インスタンスにワンクリックでデプロイできます。
| モジュール | 説明 | コマンド |
|---|---|---|
| リージョン一覧 | 利用可能なリージョンを表示します | python3 scripts/deploy_dsh.py --list-regions |
| 接続テスト | AK/SK 認証情報を検証します | python3 scripts/deploy_dsh.py --test |
| デプロイ | Flexus X インスタンスを購入して dsh をデプロイします | python3 scripts/deploy_dsh.py |
コンポーネント
| コンポーネント | 説明 | ポート | 備考 |
|---|---|---|---|
| Node.js | JavaScript ランタイム | - | Node.js 22 LTS。/opt/nodejs/current にインストールされます |
| @deepseek-ai/dsh | DeepSeek Harness CLI | 3080(ループバック) | 公式 npm パッケージ。dsh web は 127.0.0.1 のみで待ち受けます |
| Nginx | リバースプロキシ | 80(ループバック) | ローカルサーバーが 80 → 127.0.0.1:3080 をプロキシします(パブリックアクセスにはこのポートを使用しません。下記の SSH トンネルを参照) |
| systemd | サービスマネージャー | - | dsh.service が dsh のライフサイクルを管理し、障害時に自動再起動します |
| UFW | ファイアウォール | - | 22(SSH)/80/443 を許可します(80/443 はセキュリティグループでブロックされるため、パブリックからは到達できません) |
デプロイされるアプリケーション
| アプリケーション | 説明 | ポート | アクセス URL |
|---|---|---|---|
| dsh Web UI | AI エージェントハーネスの Web インターフェイス | 3080(ループバック) | http://127.0.0.1:3080(**先に SSH トンネルが必要**。ローカルアクセスガイドを参照) |
✅ 重要:dsh の
webコマンドは、意図的に127.0.0.1のみで待ち受けます。CLI は--host 0.0.0.0を拒否します。リモートアクセスには SSH ローカルポートフォワーディングトンネルを使用します。お使いのマシンでssh -L 3080:127.0.0.1:3080 root@{public_ip}を実行し、その後http://127.0.0.1:3080を開いてください。セキュリティグループで開放する必要があるのはポート 22 のみです。dsh がパブリックに公開されることはなく、より安全です。
使用例
- AI エージェント開発 - Web UI を使って DeepSeek AI エージェントハーネスを実行・管理します
- 自動化とワークフロー - 「すべてがプラグイン」というアーキテクチャで、複数ステップのエージェントワークフローを構築します
- 開発とテスト - AI エージェント開発環境をすばやくセットアップします
- チームでの共同作業 - チーム内でエージェントのワークスペースを共有します
- マルチリージョンデプロイ - 世界中のユーザーに近い場所からアクセスできる環境を提供します
重要な注意事項
⚠️ すべてのスクリプトと環境チェック用スクリプトはスキルパッケージ内にあります。実行にはスキルの action=exec を必ず使用し、シェルから直接実行しないでください。
前提条件
このスキルを使用する前に、次の条件を満たしていることを確認してください。
1. Huawei Cloud アカウント
- 有効な Huawei Cloud アカウントがあること
- アカウントの実名認証が完了していること
- 十分な残高があるか、支払い方法が登録されていること
2. AK/SK 認証情報
- Huawei Cloud のアクセスキー(AK/SK)が作成済みであること
- AK/SK に次の権限が付与されていること:
ECS:Elastic Cloud Server の管理VPC:Virtual Private Cloud の管理EIP:Elastic Public IP の管理COC:Cloud Operations Center の管理
- 取得方法:Huawei Cloud Console → My Credentials → Access Keys → Create Access Key
認証情報の設定方法:
| 方法 | 説明 | 優先度 |
|---|---|---|
| 環境変数 | HW_ACCESS_KEY、HW_SECRET_KEY、HW_SECURITY_TOKEN | 最優先(推奨) |
| コマンドライン引数 | --ak、--sk、--security-token | 低(使用可能ですが非推奨) |
認証情報の種類(推奨順):
| 優先度 | 種類 | パラメーター | 説明 |
|---|---|---|---|
| 第一候補 | 一時 AK/SK | 環境変数 + HW_SECURITY_TOKEN | セキュリティトークンを含む一時的な認証情報で、セキュリティがより高くなります |
| 第二候補 | 永続 AK/SK | 環境変数のみ | Huawei Cloud Console で取得する長期アクセスキー |
注: 認証情報は環境変数を優先して使用します。ユーザーに AK/SK の直接入力を求めることはありません。ただし、ユーザーが会話への入力や設定ファイルなど、別の方法で認証情報を自発的に提供した場合も、認証情報の解析は引き続きサポートされます。
3. IAM 権限
| サービス | ポリシー | 必要なアクション |
|---|---|---|
| ECS | ECS FullAccess | ecs:* |
| VPC | VPC FullAccess | vpc:* |
| EIP | VPC FullAccess | vpc:publicIps:* |
| COC | COC FullAccess | coc:* |
📖 最小権限ポリシーの詳細:IAM Policies
4. 実行環境
- Python 3.8 以降
必要な依存関係:
| パッケージ | バージョン | 説明 |
|---|---|---|
| requests | ≥2.31.0 | HTTP リクエストライブラリ |
| huaweicloudsdkcore | ≥3.1.70 | Huawei Cloud SDK コアライブラリ |
| huaweicloudsdkecs | ≥3.1.70 | Elastic Cloud Server SDK |
| huaweicloudsdkcoc | ≥3.1.70 | Cloud Operations Center SDK |
インストールコマンド:
pip install requests huaweicloudsdkcore huaweicloudsdkecs huaweicloudsdkcoc
5. ネットワーク環境
- Huawei Cloud API エンドポイントにアクセスできること
- 必要なエンドポイント:
ecs.{region}.myhuaweicloud.comvpc.{region}.myhuaweicloud.comiam.myhuaweicloud.comcoc.myhuaweicloud.com
⚠️ セキュリティに関する注意事項
⚠️ セキュリティ実行ルール(最優先)
| ルール | 説明 |
|---|---|
| 1 | すべてのスクリプトは skill action=exec を通じて実行する必要があります。シェルから直接実行することは禁止です |
| 2 | 会話内で、AK/SK/Token を含むスクリプトの内容やコマンドを表示することは禁止です |
| 3 | 一時的なスクリプトファイルを作成することは禁止です。インライン実行(python3 -c)を優先してください |
| 4 | 実行に失敗した場合は、エラーメッセージのみを返してください。スクリプトを書き換えたり、コマンド全体を表示したりすることは禁止です |
| 5 | AK/SK/Token は環境変数を通じて渡す必要があります。会話内に含めることは禁止です |
| 6 | ⚠️ いかなる形式であっても、AK/SK/Token の値を公開、記録、表示することは厳禁です |
⚠️ セキュリティグループポリシー(重要 — デプロイ前にお読みください)
デプロイ戦略 — シンプルで安全:
| 設定 | 値 | 説明 |
|---|---|---|
| セキュリティグループの状態 | 空(インバウンドルールなし) | スクリプトはセキュリティグループを作成するだけで、ルールは追加しません |
| デフォルトのアクセス | すべてのポートをブロック | ルールを設定するまでは、どの IP からもサーバーにアクセスできません |
| 開放するポート | 22(SSH)のみ | dsh Web UI には SSH トンネル経由でアクセスするため、80/443 をパブリックに開放する必要はありません |
デプロイ後の設定方法:
- Huawei Cloud Console → ECS → Security Groups にアクセスします
sg-dshという名前のセキュリティグループを見つけます- 手動でインバウンドルールを追加します:プロトコル TCP、ポート 22、送信元 IP = ご自身のパブリック IP +
/32サフィックス(例:203.0.113.10/32) - 80/443 の広範なルールは追加しないでください — dsh には SSH トンネル経由でのみアクセスするため、ほかのポートを公開する必要はありません
💡 セキュリティグループを空にする理由 セキュリティを最優先 — サーバーにアクセスできる IP を完全に管理できます。ポート 22 + SSH トンネルのみを使用するため、dsh Web UI がパブリックに公開されることはなく、API キーが漏えいしてもインターネットからアクセスされることはありません。
⚠️ AK/SK のセキュリティ: 前提条件 - AK/SK 認証情報を参照してください。AK/SK/Token の値をいかなる形式でも公開、記録、出力することは禁止されています。
⚠️ dsh のセキュリティ(重要)
| ルール | 説明 |
|---|---|
| 1 | dsh は 127.0.0.1 のみにバインドします — 0.0.0.0 でリッスンするよう強制しないでください(CLI は設計上これを拒否します) |
| 2 | SSH ローカルポートフォワーディングでリモートアクセスします:ローカルで ssh -L 3080:127.0.0.1:3080 root@{public_ip} を実行し、その後 http://127.0.0.1:3080 を開きます |
| 3 | DEEPSEEK_API_KEY は systemd drop-in を使用し、ファイルモード 600 で注入します — ユニットファイルやログに記載しないでください |
| 4 | デプロイ時に API キーを設定する必要はありません。ユーザーは後から Web UI(設定 → モデル)で設定することもできます |
| 5 | dsh は root ではなく、専用システムユーザー dsh(シェルなし)で実行します |
| 6 | 本番環境で使用する場合、HTTPS を必ず有効にしてください(例:Nginx ローカルプロキシ経由で Let's Encrypt を使用) |
🔐 SSL/TLS 検証
- 🔒 すべての Huawei Cloud API リクエストでは、SSL/TLS 証明書の検証がデフォルトで有効です(
verify=true)。 HW_VERIFY_SSL環境変数で上書きできます —HW_VERIFY_SSL=falseにすると検証が無効になります。- ⚠️
HW_VERIFY_SSL=falseはテスト専用です。 本番環境で SSL 検証を無効にしないでください。中間者攻撃により AK/SK 認証情報や API トラフィックが漏えいするおそれがあります。
主なコマンドと使い方
💡 注:操作オプションが指定されていない場合、デフォルトでデプロイ操作が実行されます。
コマンドオプション
| コマンド/オプション | 機能 | 説明 |
|---|---|---|
python3 scripts/deploy_dsh.py | デプロイ | Flexus X インスタンスを購入し、dsh をデプロイします |
python3 scripts/deploy_dsh.py --list-regions | 利用可能なリージョンを表示 | 利用可能なすべてのリージョン(19 リージョン)を表示します |
python3 scripts/deploy_dsh.py --test | 接続をテスト | AK/SK 認証情報を検証します |
python3 scripts/deploy_dsh.py --list-servers | サーバー一覧 | 指定したリージョンのすべてのサーバーを表示します |
python3 scripts/deploy_dsh.py --delete <ID> | サーバーを削除 | ID または名前を指定してサーバーを削除します |
python3 scripts/deploy_dsh.py --status <ID> | ステータスを確認 | サーバー ID を指定してデプロイ状況を確認します |
グローバルパラメーター
💡 必須パラメーター:
--ak、--sk(またはHW_ACCESS_KEY、HW_SECRET_KEY環境変数を設定) 💡 推奨パラメーター:--security-token(または一時認証情報用にHW_SECURITY_TOKENを設定)
実行例
例 1:利用可能なリージョンを一覧表示する
python3 scripts/deploy_dsh.py --list-regions
例 2:AK/SK 接続をテストする
python3 scripts/deploy_dsh.py --test
例 3:デフォルト設定でデプロイする(ユーザーの確認が必要です)
python3 scripts/deploy_dsh.py
例 4:リージョンとフレーバーを指定してデプロイする
python3 scripts/deploy_dsh.py --region cn-east-3 --flavor x1.4u.8g
例 5:既存のサーバーを一覧表示する
python3 scripts/deploy_dsh.py --list-servers --region cn-north-4
例 6:デプロイのステータスを確認する
python3 scripts/deploy_dsh.py --status <server_id>
例 7:サーバーを削除する
python3 scripts/deploy_dsh.py --delete <server_id_or_name>
| パラメーター | 説明 | デフォルト |
|---|---|---|
| --region | 対象リージョン | cn-north-4 |
| --flavor | インスタンスのフレーバー | x1.2u.4g |
| --name | サーバー名 | 自動生成 |
| --password | サーバーのパスワード | 自動生成 |
| --charging-mode | 課金モード | postPaid |
| --bandwidth | EIP 帯域幅(Mbps) | 100 |
| --volume-size | システムディスク(GB) | 40 |
| --coc-region | COC サービスのリージョン | cn-north-4 |
| --coc-timeout | COC スクリプトの実行タイムアウト(秒) | 1800 |
dsh パラメーター
| パラメーター | 説明 | デフォルト |
|---|---|---|
| --dsh-port | dsh の待ち受けポート(ループバックのみ) | 3080 |
| --api-key | dsh サービスに事前設定する DEEPSEEK_API_KEY(任意) | 未設定 |
💡 dsh ポートは 127.0.0.1 のみにバインドされます。SSH トンネル経由でローカルからアクセスしてください(
ssh -L 3080:127.0.0.1:3080 root@{ip})。dsh ポート自体にセキュリティグループのルールを設定する必要はありません。
詳細パラメーター
💡 以下のパラメーターは上級ユーザー向けで、一般的な用途では必要ありません。
| パラメーター | 説明 | デフォルト |
|---|---|---|
| --project-id | Huawei Cloud プロジェクト ID(任意) | 自動取得 |
| --image | イメージ ID | デフォルトの Ubuntu 22.04 |
| --zone | アベイラビリティゾーンを指定 | 自動選択 |
| --random-zone | アベイラビリティゾーンをランダムに選択 | オフ |
| --no-eip | エラスティックパブリック IP を作成しない | オフ |
| --auto-confirm | 対話形式の確認をスキップする(注意して使用してください!) | オフ |
認証情報の設定例
方法 1:環境変数を使用する(第一選択—強く推奨)
python3 scripts/deploy_dsh.py
方法 2:コマンドライン引数を使用する(第二選択—使用可能)
# Temporary credentials
python3 scripts/deploy_dsh.py \
--ak <AK> --sk <SK> --security-token <TOKEN> \
--region cn-north-4 \
--flavor x1.2u.4g
# Permanent credentials
python3 scripts/deploy_dsh.py \
--ak <AK> --sk <SK> \
--region cn-north-4 \
--flavor x1.4u.8g
🔒 重複デプロイ防止機構
システムに組み込まれたロックファイル機構により、重複デプロイを防止します。
- デプロイ開始時にロックファイルを自動作成します:
dsh_deploy.lock - ロックファイルの有効期間:30 分(自動的に期限切れになります)
- ロックファイルが存在する場合、新しいデプロイは自動的にブロックされます
- ロックファイルのパス:システムの一時ディレクトリ(Linux では
/tmp/dsh_deploy.lock、Windows では%TEMP%\dsh_deploy.lock)
⚠️ 重要な注意事項:
- ❌ 複数のデプロイタスクを同時に実行しないでください
- ❌ 重複デプロイによって複数のサーバーが作成され、料金が二重に発生します
- デプロイに失敗した場合は、ロックファイルが削除されているか確認してください
**失敗時の処理:**デプロイに失敗した場合は、失敗理由を返し、コンソールを確認するようユーザーに案内します。自動再試行やパラメーターの変更は行いません。
🚀 国内ミラーによる高速化
国内ミラーを組み込んでおり、デプロイを高速化できます。
| ミラーの種類 | ミラーソース | 説明 |
|---|---|---|
| Ubuntu APT | USTC (mirrors.ustc.edu.cn) | システムパッケージの更新 |
| npm レジストリ | npmmirror (registry.npmmirror.com) | @deepseek-ai/dsh のインストールと Node.js バイナリのダウンロード |
| pip(ローカル) | Huawei Cloud (repo.huaweicloud.com) | オペレーター側での Python 依存関係のインストール |
ミラー設定の場所: scripts/coc_deploy.py の COMBINED_INSTALL_SCRIPT
モジュールの詳細
DeepSeek Harness(dsh)のデプロイ
⏱️ デプロイ時間:全体で約 10 分 かかります(サーバーの作成に 3~5 分+ソフトウェアのデプロイに 5~8 分)。しばらくお待ちください。
💡 デプロイコマンドについては認証情報の設定例を、すべてのパラメーターについてはグローバルパラメーターを参照してください。
サーバー上のデプロイ段階(COC スクリプト経由):
| 段階 | 操作 | 説明 |
|---|---|---|
| 0 | 国内ミラー | USTC APT ミラーと npmmirror npm レジストリを設定 |
| 1 | Node.js 22 LTS | 公式 tarball(npmmirror ミラー、失敗時は nodejs.org)経由でインストール |
| 2 | @deepseek-ai/dsh | npm install -g @deepseek-ai/dsh |
| 3 | 専用ユーザー | システムユーザー dsh を作成し、DSH_HOME(/home/dsh/.dsh)を準備 |
| 4 | systemd サービス | dsh.service を作成(restart=on-failure、ProtectSystem、ReadWritePaths) |
| 5 | Nginx リバースプロキシ | 80 → 127.0.0.1:3080、WebSocket アップグレードヘッダー(ループバックのみ) |
| 6 | ファイアウォール | UFW で 22/80/443 を許可(80/443 はセキュリティグループでブロックされ、パブリックからは到達不可) |
| 7 | 起動と検証 | dsh を起動し、ループバックで HTTP 200 を待機して、デプロイ情報を出力 |
利用可能なリージョン
一般的なリージョン(その他のリージョンは --list-regions を実行してください):
| リージョン ID | リージョン名 | 対応する Flexus X インスタンスタイプ |
|---|---|---|
| cn-north-4 | 中国北部・北京 4 | x1, x1e, x1i, x2e |
| cn-east-3 | 中国東部・上海 1 | x1, x1e, x1i, x2e |
| cn-south-1 | 中国南部・広州 | x1, x1e, x1i, x2e |
| ap-southeast-1 | 中国・香港 | x1, x2e |
| ap-southeast-3 | アジア太平洋・シンガポール | x1, x1e, x2e |
💡 リージョンの全リスト(19 件)は、次を実行してください:
python3 scripts/deploy_dsh.py --list-regions
出力形式の仕様
⛔ 重要 — SSH トンネルコマンドは省略・要約・言い換えをせず、必ずそのまま出力してください:
デプロイ後の返信には、コピーしてすぐに実行できる SSH トンネルコマンドを必ず含めてください。
{public_ip}はスクリプト出力の実際のパブリック IP に置き換えてください。 たとえば、スクリプトの出力がPublic IP: 121.36.x.xの場合、返信には次を含める必要があります:ssh -L 3080:127.0.0.1:3080 [email protected]完全なコマンドを示さずに「SSH トンネルを確立してください」とだけ書くことは絶対に避けてください。ユーザーはコピーして実行する必要があります。コマンドがないと Web UI にアクセスできません。
デプロイが成功したら、必ず次の形式で結果を返してください:
🎉 Deployment Successful!
| Item | Value |
|------|-----|
| Server Name | {server_name} |
| Public IP | {public_ip} |
| SSH Password | {password} |
| Region | {region_id} ({region_name}) |
🌐 Access URL (SSH tunnel required first):
- Run on your local machine (Windows PowerShell / macOS Terminal), replacing {public_ip} with the Public IP from the table above:
ssh -L 3080:127.0.0.1:3080 root@{public_ip}
- Enter the SSH password (from the table above), keep the terminal window open
- Then open in your browser: http://127.0.0.1:3080
🔑 SSH Login: `ssh root@{public_ip}` (password: {password})
📦 Installed Components:
- Node.js 22 LTS ({node_version})
- @deepseek-ai/dsh ({dsh_version}, systemd service 'dsh')
- Nginx reverse proxy (80 → 127.0.0.1:{dsh_port}, loopback only)
📋 Post-deployment TODO:
1. Configure security group: Console → ECS → Security Groups → sg-dsh → Add inbound rule (TCP 22, source your_ip/32)
2. Establish SSH tunnel locally (see command above), then open Web UI: http://127.0.0.1:3080
3. In the Web UI: Settings → Models, enter your DeepSeek API key and save
4. Choose a workspace directory, then start a session
📖 [DeepSeek Harness GitHub](https://github.com/deepseek-ai/deepseek-harness) | [Flexus X Docs](https://support.huaweicloud.com/productdesc-flexusx/pd_01_0002.html)
変数: {server_name} サーバー名 | {public_ip} パブリック IP | {password} SSH パスワード | {region_id}/{region_name} リージョン | {dsh_port} dsh のループバックポート | {node_version} Node.js バージョン | {dsh_version} dsh CLI バージョン
🔐 ローカルアクセスガイド(SSH ポートフォワーディング)
⚠️ デプロイ後は必ずこのセクションの手順に従ってください。従わない場合、ブラウザーで dsh Web UI を開けません。dsh はサーバーのループバックアドレス
127.0.0.1:3080のみでリッスンします。ローカルポート 3080 からサーバーのポート 3080 に転送するため、お使いのローカルマシンで SSH トンネルを確立する必要があります。
仕組み:ssh -L 3080:127.0.0.1:3080 root@{public_ip} は、ローカルの 3080 ポートのすべてのトラフィックを、暗号化された SSH チャネル経由でクラウドサーバー上の 127.0.0.1:3080(dsh が実行されている場所)に転送するという意味です。データは完全に暗号化され、dsh Web UI がパブリックに公開されることはありません。SSH 接続が可能なユーザーだけがアクセスできます。
Windows ユーザー(PowerShell)
- PowerShell を開きます:
Winキーを押し →powershellと入力 → Enter キーを押します(またはWin+Xを押し →「Windows PowerShell」/「Windows Terminal」を選択します) - トンネルコマンドを実行します(
{public_ip}をデプロイ出力に表示されたパブリック IP に置き換えます):ssh -L 3080:127.0.0.1:3080 root@{public_ip} - 初回のフィンガープリント確認:
Are you sure you want to continue connecting (yes/no)?と表示されたら、yesと入力して Enter キーを押します - パスワードを入力します:デプロイ出力に表示された SSH パスワードを入力し(入力中に文字は表示されませんが、正常な動作です)、Enter キーを押します
- ウィンドウを開いたままにします:リモートシェルのプロンプト(例:
root@xxx:~#)が表示されたら、トンネルは確立されています。このウィンドウを閉じないでください - ブラウザーを開きます:
http://127.0.0.1:3080にアクセスして dsh Web UI を開きます
💡 Windows 10/11 には OpenSSH クライアントが標準搭載されています。追加のインストールは不要です。「'ssh' is not recognized」と表示された場合は、設定 → アプリ → オプション機能 →「OpenSSH Client」を追加してください。
macOS ユーザー(Terminal)
- Terminal を開きます:
Command + Spaceを押し →Terminalと入力 → Enter キーを押します(または Finder → アプリケーション → ユーティリティ → Terminal) - トンネルコマンドを実行します(
{public_ip}をデプロイ出力に表示されたパブリック IP に置き換えます):ssh -L 3080:127.0.0.1:3080 root@{public_ip} - 初回のフィンガープリント確認:
Are you sure you want to continue connecting (yes/no)?と表示されたら、yesと入力して Enter キーを押します - パスワードを入力します:デプロイ出力に表示された SSH パスワードを入力し(入力中に文字は表示されませんが、正常な動作です)、Enter キーを押します
- ウィンドウを開いたままにします:リモートシェルのプロンプトが表示されたら、トンネルは確立されています。このウィンドウを閉じないでください
- ブラウザーを開きます:
http://127.0.0.1:3080にアクセスして dsh Web UI を開きます
💡 macOS には OpenSSH クライアントが標準搭載されています。追加のインストールは不要です。
トンネルの終了と高度な使い方
| シナリオ | 操作 |
|---|---|
| トンネルを終了する | PowerShell/Terminal のウィンドウで Ctrl+C を押すか、exit と入力して Enter キーを押します |
| シェルなしでポート転送のみを行う | ssh -N -L 3080:127.0.0.1:3080 root@{public_ip} を実行します(-N はリモートコマンドを実行しません。シェルプロンプトは表示されません。推奨) |
| macOS でバックグラウンド実行する | ssh -f -N -L 3080:127.0.0.1:3080 root@{public_ip} を実行します(-f はバックグラウンドで実行します。pkill -f "ssh -f -N" または killall ssh で停止します) |
| ローカルポート 3080 が使用中の場合 | 別のローカルポートを使います:ssh -L 18080:127.0.0.1:3080 root@{public_ip} を実行し、http://127.0.0.1:18080 を開きます |
| パスワードなしでログインする(推奨) | ssh-copy-id root@{public_ip} を実行します(macOS/Linux)。または、以後パスワードなしで接続できるよう、PowerShell で SSH キーを使用します |
⚠️ 注:トンネルを終了すると、
http://127.0.0.1:3080にアクセスできなくなります。これは正常な動作です。トンネルコマンドを再実行してください。マシンを再起動するたびに、トンネルを再確立する必要があります。
dsh の初期設定
SSH トンネルを確立したら、dsh Web UI(http://127.0.0.1:3080)を開きます。
| 設定 | 説明 |
|---|---|
| API Key | Settings → Models に移動し、DeepSeek API キーを入力して保存します(--api-key で事前設定されていない場合) |
| Workspace | セッションと成果物を保存するワークスペースディレクトリを選択します |
| Start Session | Web UI でセッションを開始すると、ハーネスが応答します |
⚠️ 重要:dsh はファイルの読み書きやコマンドの実行が可能です。セキュリティグループで開放するポートは 22 のみにしてください(接続元は
your_ip/32)。dsh には SSH トンネル経由でアクセスします。80/3080 を公開インターネットに開放しないでください。また、0.0.0.0/0は絶対に使用しないでください。
デプロイアーキテクチャ
このスキルでは、従来の SSH 方式に代わり、安全なデプロイのために COC (Cloud Operations Center) を使用します。
┌─────────────────────────────────────────────────────────────┐
│ Flexus Cloud Server X Instance │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Ubuntu 22.04 Server │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ SSH tunnel ──► dsh (127.0.0.1:3080) │ │
│ │ (port 22) (loopback only) │ │
│ │ │ │
│ │ ┌───────────────┐ ┌───────────────┐ │ │
│ │ │ Nginx │ │ systemd │ │ │
│ │ │ (port 80) │ │ dsh.service │ │ │
│ │ │ loopback │ └───────┬───────┘ │ │
│ │ └───────────────┘ │ │ │
│ │ ▼ │ │
│ │ dsh web (Node.js 22) │ │
│ │ user: dsh (no-shell) │ │
│ │ DSH_HOME: /home/dsh/.dsh│ │
│ └───────────┬──────────────────────┬──────────────────┘ │
│ │ │ │
│ │ ┌───────┴───────┐ │
│ │ │ Security Group │ │
│ │ │ sg-dsh │ │
│ │ │ allow 22 /32 │ │
│ │ └───────┬───────┘ │
│ │ │ │
│ └──────────────────────┼──────────────────────┘
│ ▼ │
│ ┌─────────────┐ │
│ │ EIP │ SSH only (22) │
│ └─────────────┘ │
│ ▲ │
│ │ │
│ ┌─────────┴─────────┐ │
│ │ COC (Cloud │ │
│ │ Operations │ │
│ │ Center) │ │
│ │ Secure Script │ │
│ │ Execution │ │
│ └───────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────┐
│ User machine (Windows/macOS) │
│ ssh -L 3080:127.0.0.1:3080 root@{ip} │
│ Browser → http://127.0.0.1:3080 │
└─────────────────────────────┘
デプロイフロー
| ステージ | 操作 | 説明 |
|---|---|---|
| 1 | サーバーの作成 | Huawei Cloud SDK を使用して Flexus X インスタンスを作成します |
| 2 | セキュリティグループの設定 | sg-dsh セキュリティグループを作成します(ルールは空のため、手動での設定が必要です) |
| 3 | UniAgent の起動待ち | COC UniAgent がオンラインになるまで待ちます |
| 4 | COC スクリプトの作成 | Cloud Operations Center でインストールスクリプトを作成します |
| 5 | スクリプトの実行 | COC を通じて対象インスタンスでスクリプトを実行します |
| 6 | デプロイの確認 | dsh サービスとループバックポートの状態を確認します |
COC デプロイの利点
SSH 方式と比較して、COC デプロイには次のような利点があります。
| 機能 | SSH 方式 | COC 方式 |
|---|---|---|
| セキュリティ | SSH ポートを開放する必要があり、セキュリティリスクがあります | Cloud Operations Center を通じて安全に実行でき、SSH ポートは不要です |
| 権限管理 | SSH パスワードまたはキーが必要です | Huawei Cloud IAM の権限管理を使用します |
| 監査ログ | 手動でのログ記録が必要です | COC が実行ログを自動的に記録します |
| 一括デプロイ | SSH 接続を順次行う必要があります | 複数のサーバーへの一括デプロイに対応しています |
| エラー処理 | 手動での処理が必要です | COC が標準化されたエラー処理を提供します |
ログファイル
| ファイルパス | 説明 |
|---|---|
| /var/log/dsh-bootstrap.log | デプロイスクリプトの実行ログ |
| /home/dsh/.dsh/ | dsh データディレクトリ(セッション、ワークスペース、アーティファクト) |
| /etc/systemd/system/dsh.service | dsh systemd ユニットファイル |
| /etc/systemd/system/dsh.service.d/10-credentials.conf | DEEPSEEK_API_KEY のドロップイン(モード 600、--api-key を使用した場合のみ) |
| /etc/nginx/conf.d/dsh.conf | Nginx リバースプロキシの設定 |
ファイル構成
skills/huawei-cloud-ecs-dsh-deploy/
├── SKILL.md # English version
├── scripts/
│ ├── deploy_dsh.py # Main deployment script
│ ├── pyproject.toml # Dependency list
│ ├── huawei_cloud_ecs.py # Huawei Cloud SDK wrapper
│ ├── coc_deploy.py # COC deployment module (includes install script)
│ ├── config.py # Configuration constants
│ ├── utils.py # Utility functions
│ └── query_regions.py # Region query helper
└── references/
├── acceptance-criteria.md # Acceptance criteria
├── cli-installation-guide.md # CLI installation guide (KooCLI & dependencies)
├── iam-policies.md # IAM policies
├── verification-method.md # Verification methods
└── conversation-examples.md # Natural-language conversation examples
エラー処理
既知の制限事項
| 制限事項 | 説明 | 解決策 |
|---|---|---|
| dsh はループバックにのみバインドします | dsh web は設計上、--host 0.0.0.0 を拒否します | ローカルで SSH トンネルを確立します:ssh -L 3080:127.0.0.1:3080 root@{ip} を実行し、http://127.0.0.1:3080 を開きます |
| ステータス確認方法 | --status はサーバーインスタンスの状態を確認します。dsh のヘルスチェックには SSH トンネルが必要です | トンネル接続後に http://127.0.0.1:3080 を開いて確認するか、サーバー上で curl http://127.0.0.1:3080 を実行します |
よくあるエラー
| エラーコード | 説明 | 解決策 |
|---|---|---|
| 401 Unauthorized | AK/SK が無効です | AK/SK が正しく、有効であることを確認します |
| 403 Forbidden | 権限がありません | 必要な IAM ポリシーを追加します |
| QuotaExceeded | リソースのクォータを超過しました | ECS/VPC/EIP のクォータを確認します |
| ServerLimitExceeded | インスタンス数の上限に達しました | 使用していないインスタンスを解放します |
| FlavorNotFound | フレーバーを利用できません | 別のリージョンまたはフレーバーを試します |
| Timeout | サーバーの作成がタイムアウトしました | コンソールで実際の状態を確認します |
| Node.js < 22 | dsh には Node.js >= 22 が必要です | インストールスクリプトが Node 22 LTS を自動的にインストールします |
参考資料
スキルの参考ドキュメント
外部参考資料
- DeepSeek Harness GitHub - 公式リポジトリ(デフォルトブランチ:master)
- Flexus Cloud Server X インスタンスのドキュメント - Flexus X インスタンスの製品ドキュメント
- AK/SK 認証 - IAM 認証ガイド