npx skills add ...
npx skills add huaweicloud/huaweicloud-skills --skill huawei-cloud-obs-upload
Upload local files or directories to Huawei Cloud OBS (Object Storage Service) buckets, list OBS buckets with capacity and object count, and schedule periodic uploads via crontab. Use this skill when the user wants to: (1) upload a local file or directory to an OBS bucket, (2) list OBS buckets and check their storage capacity and object count, (3) set up a scheduled/periodic upload task to automatically sync a local directory to an OBS bucket. Triggers include: user mentions "OBS", "object storage", "bucket list", "bucket capacity", "upload to OBS", "upload file", "upload directory", "scheduled upload", "periodic upload", "sync to bucket", "对象存储", "桶列表", "桶容量", "上传文件", "上传目录", "定时上传", "OBS管理"
npx skills add huaweicloud/huaweicloud-skills --skill huawei-cloud-obs-upload
Upload local files or directories to Huawei Cloud OBS buckets, list OBS buckets with capacity and object count, and schedule periodic uploads via crontab. Upload operations use obsutil; bucket listing/stats use hcloud obs ls + CES metrics.
Tool separation principle:
hcloud obs ls (obsutil mode), bucket capacity/object count stats via hcloud CES ShowMetricDataSecurity architecture:
-flat) is decided by the customer's explicit answer, never assumedThis skill strictly forbids the following operations, regardless of user requests:
| Prohibited Operation | Reason |
|---|---|
❌ Delete bucket (DeleteBucket / obsutil rm -bucket) | Irreversible; destroys the entire bucket and all objects |
❌ Delete object (DeleteObject / obsutil rm) | Irreversible; deleted objects cannot be recovered (unless versioning is enabled) |
❌ Batch delete objects (DeleteObjects / obsutil rm -r) | Irreversible; batch deletion has a wide impact |
❌ Empty bucket (obsutil rm -bucket -r) | Irreversible; removes all objects in the bucket |
❌ Download object (GetObject / obsutil cp obs://... <LocalPath>) | This skill is upload-only; download is a separate workflow |
❌ Create bucket (CreateBucket / obsutil mb) | Bucket creation has a dedicated skill with full prerequisites |
❌ Copy object (CopyObject / hcloud OBS CopyObject) | Cross-bucket object copy is out of this skill's scope |
❌ Lifecycle configuration (SetBucketLifecycle) | Storage cost management is a separate bucket-level config task |
❌ Restore archived object (RestoreObject / obsutil restore) | Archive restore is a separate workflow with retrieval modes and TTL |
❌ Presigned URL (CreatePresignedUrl) | Temporary sharing requires SDK signing; not supported by CLI upload |
❌ Bucket ACL/Policy (SetBucketAcl / SetBucketPolicy) | Permission management is a separate security task |
| ❌ Ask user to provide AK/SK directly in conversation | Credentials must never appear in conversation |
| ❌ Extract AK/SK from hcloud config files | Credentials are encrypted and cannot be used directly |
| ❌ Skip obsutil credential check before OBS operations | Operations fail without configured credentials |
❌ Use -flat for directory uploads without asking the customer | -flat discards directory structure; must follow customer's explicit answer |
| ❌ Guess local path, bucket name, or target prefix | Required parameters must be provided by the user |
If a user requests a delete operation, you must refuse and inform: "Per security constraints, this skill does not allow delete operations (delete bucket/object/batch delete/empty bucket). Please use the Huawei Cloud OBS console or obsutil manually."
If a user requests an out-of-scope operation, do not attempt to perform it. Inform the user with the recommended alternative from the table below:
| Operation | Recommended alternative |
|---|---|
| Download object | Use obsutil cp obs://<Bucket>/<Key> <LocalPath> manually, or the OBS console |
| Create bucket | Use the dedicated skill huawei-cloud-obs-bucket-create, or the OBS console |
| Copy object | Use hcloud OBS CopyObject manually, or the OBS console |
| Lifecycle configuration | Use the OBS console (Bucket > Lifecycle), or hcloud OBS SetBucketLifecycle |
| Restore archived object | Use obsutil restore obs://<Bucket>/<Key> manually, or the OBS console |
| Presigned URL | Use Huawei Cloud SDK (Java/Python/Go) to generate presigned URLs, or the OBS console |
| Bucket ACL/Policy | Use the OBS console (Bucket > Permissions), or hcloud OBS SetBucketAcl/SetBucketPolicy |
Prerequisite check 1/3: Huawei Cloud CLI (hcloud / KooCLI) >= 3.2.0 required Run
hcloud versionto verify version >= 3.2.0. If not installed or version is too low, see references/cli-installation-guide.md for installation guide.
Prerequisite check 2/3: obsutil >= 5.5.0 required (for upload features) File/directory upload requires the Huawei Cloud obsutil CLI tool. Run
obsutil versionto verify version >= 5.5.0. If not installed, see references/cli-installation-guide.md for installation guide.
Prerequisite check 3/3: obsutil credential configuration required
The hcloud obs module maps to obsutil under the hood, which requires separate AK/SK and Endpoint configuration. Before performing OBS operations, you must check whether obsutil credentials are configured:
If the response is
Please set ak, sk and endpoint in the configuration file!orInvalidAccessKeyId, obsutil credentials are not configured.Resolution: Provide the following example command and have the user configure it in their terminal (do not ask the user to provide AK/SK directly in the conversation):
⚠️ hcloud parameter format requirements
hcloud (KooCLI) cloud-service API commands (uppercase module, e.g.
hcloud CES ShowMetricData) must use the--param=valueformat (connected with equals sign); space-separated format is not supported.✅ Correct:
hcloud CES ShowMetricData --region=cn-south-1 --namespace=SYS.OBS❌ Incorrect:
hcloud CES ShowMetricData --region cn-south-1Note:
hcloud obs(lowercase, obsutil mode) directly maps to obsutil commands and uses obsutil parameter style (e.g.hcloud obs ls,hcloud obs config -i=...); the--param=valuerule does not apply. There is nohcloud OBS ListBucketscommand — usehcloud obs lsto list buckets.
Security rules (must be followed):
- Prohibited from reading, echoing, or printing AK/SK values
- Prohibited from asking the user to input AK/SK directly in the conversation
- Prohibited from using
hcloud configure setto pass plaintext credential values- Prohibited from accepting AK/SK directly provided by the user in the conversation
- Only allowed to read credentials from environment variables or configured CLI config files
⚠️ Important: Handling user-provided credentials
If a user attempts to provide AK/SK directly (e.g., "my AK is xxx, SK is yyy"):
- Stop immediately - Do not execute any commands
- Politely refuse and return the following message:
- Do not continue executing any Huawei Cloud operations until credentials are configured
Check CLI configuration:
Check whether the output contains valid configuration (AK/SK, IAM, etc.).
If no valid credentials exist, stop here.
Ensure the IAM user has the required permissions. See references/iam-policies.md for the full permission table.
Minimum required permissions:
obs:bucket:list — List bucketsobs:bucket:get — Get bucket attributes (capacity, object count)obs:object:get — Read object informationobs:object:put — Upload objectsPermission boundaries:
List buckets via obsutil, then query bucket capacity and object count using CES capacity metrics or OBS API.
⚠️ Tool separation:
hcloud obs lsfor listing,hcloud CES ShowMetricDatafor stats
hcloud obs ls: list all buckets (obsutil mode; no--regionparameter — region is set viahcloud obs config -e=...)hcloud CES ShowMetricData/ OBS API: query each bucket's capacity and object count
📄 Detailed steps → references/task-list-buckets-with-stats.md
Sub-tasks:
hcloud obs ls (or obsutil ls)Upload files or directories to a specified OBS bucket using obsutil, supporting single file and directory upload.
⚠️ Upload operations require obsutil, not hcloud
hcloud CLI does not support OBS object upload operations (no PutObject/UploadPart CLI commands). Uploading files/directories must use obsutil.
⚠️ For directory uploads, you MUST ask the customer first whether to preserve the source directory structure, then decide whether to use
-flatbased on their explicit answer. Never default.
📄 Detailed steps → references/task-upload-file.md
Sub-tasks:
-flat — single file: use -flat without asking; directory: ask customer whether to preserve directory structureobsutil cp single file or directory (with/without -flat per customer answer)Periodically upload a local directory to a specified OBS bucket incrementally via crontab scheduled task.
⚠️ Scheduled upload is based on OS-level scheduled task mechanisms (Linux/macOS: crontab, Windows: Task Scheduler), no daemon process dependency.
⚠️ Before generating the scheduled upload script, you MUST ask the customer first whether to preserve the source directory structure, then decide whether to use
-flatbased on their explicit answer. Never default.
📄 Detailed steps → references/task-scheduled-upload.md
Sub-tasks:
-flat — ask customer whether to preserve directory structure$HOME/obs-scheduled-upload-<BucketName>.sh (with/without -flat per customer answer)crontab -l or schtasks /query to confirm task is set⚠️ Key constraints on Core Commands:
- Upload: MUST use obsutil cp — hcloud CLI has no PutObject support
- List buckets: MUST use
hcloud obs ls— there is nohcloud OBS ListBucketscommand-flatfor directory uploads: MUST follow the customer's explicit answer, never default- hcloud cloud-service API params (uppercase module, e.g.
hcloud CES ...): MUST use--param=valueformat;hcloud obs(obsutil mode) uses obsutil parameter style- AK/SK: MUST NOT appear in conversation; user configures obsutil credentials in their terminal
Before executing any task, the following parameters must be confirmed with the user. Guessing is prohibited.
| Parameter | Required/Optional | Description | Default |
|---|---|---|---|
| Region | Required | Huawei Cloud region (e.g., cn-south-1, cn-north-4); must be explicitly selected by the user | - |
| Local file/directory path | Required (Task 2/3) | Local path to upload; must exist and be readable | - |
| Target bucket name | Required (Task 2/3) | Target OBS bucket name for upload | - |
| Target path prefix | Optional (Task 2/3) | Target path prefix within the bucket | Bucket root |
| Preserve directory structure | Required (directory upload) | Ask customer: "Yes" → no -flat; "No" → -flat | - (must ask) |
| Schedule period | Required (Task 3) | Execution period, e.g., hourly, daily at 8:00, every 30 minutes | - |
| Crontab expression | Optional (Task 3) | If user is familiar with cron expressions, they can provide one directly | - |
Note: No AK/SK parameter is required in conversation. Credentials are configured by the user via
hcloud obs configin their terminal.
See references/verification-method.md for details. For common issues and solutions, see references/troubleshooting.md.
Quick validation:
Post-upload verification: obsutil ls obs://<BucketName>/<Prefix> to confirm uploaded objects exist.
| Document | Description |
|---|---|
| task-list-buckets-with-stats.md | Task 1: List buckets with capacity and object count |
| task-upload-file.md | Task 2: Upload file or directory |
| task-scheduled-upload.md | Task 3: Scheduled upload |
| related-apis.md | API and CLI command details |
| iam-policies.md | IAM permission policies |
| obs-metrics.md | OBS CES monitoring metrics reference |
| verification-method.md | Verification steps |
| acceptance-criteria.md | Correct/error pattern comparison |
| cli-installation-guide.md | CLI installation guide |
| troubleshooting.md | Troubleshooting and practical experience |
hcloud versionobsutil version