AgentSkillsCN

hcloud-go-sdk

在编写Go代码以与Hetzner Cloud API交互时使用——自动化、基础设施配置、机器人、集成或程序化云操作

SKILL.md
--- frontmatter
name: hcloud-go-sdk
description: Use when writing Go code to interact with Hetzner Cloud API - automation, infrastructure provisioning, bots, integrations, or programmatic cloud operations

Hetzner Cloud Go SDK

Overview

The official Go SDK for Hetzner Cloud provides type-safe access to 23+ resource types with automatic retries, action polling, and comprehensive error handling. Use it for bots, automation, integrations, and complex workflows. For quick CLI operations, use hetzner:hcloud-cli instead.

Quick Setup

go
import "github.com/hetznercloud/hcloud-go/v2/hcloud"

// Create client
client := hcloud.NewClient(hcloud.WithToken("your-api-token"))
bash
go get github.com/hetznercloud/hcloud-go/v2/hcloud

Quick Reference

TaskMethod
Servers
List serversclient.Server.All(ctx)
Get serverclient.Server.GetByID(ctx, 123) or GetByName(ctx, "web")
Create serverclient.Server.Create(ctx, hcloud.ServerCreateOpts{})
Delete serverclient.Server.Delete(ctx, server)
Reboot/Resetclient.Server.Reboot(ctx, server) / Reset(ctx, server)
Networks
Create networkclient.Network.Create(ctx, hcloud.NetworkCreateOpts{})
Attach serverclient.Server.AttachToNetwork(ctx, server, opts)
Volumes
Create volumeclient.Volume.Create(ctx, hcloud.VolumeCreateOpts{})
Attach volumeclient.Volume.Attach(ctx, volume, server)
Actions
Wait for actionclient.Action.WaitFor(ctx, action)
Poll with callbackclient.Action.WaitForFunc(ctx, callback, action)

API Categories

See references/api-reference.md for complete method list:

  • Servers (create, lifecycle, networking)
  • Networks, subnets, routes
  • Volumes
  • Firewalls and rules
  • Load balancers, targets, services
  • Floating IPs, Primary IPs
  • SSH keys, images, certificates
  • DNS zones (GA in v2.30.0)
  • Storage boxes (experimental)

Client Configuration

go
client := hcloud.NewClient(
    hcloud.WithToken("token"),                    // Required
    hcloud.WithEndpoint("https://api.hetzner.cloud/v1"), // Custom endpoint
    hcloud.WithApplication("myapp", "1.0.0"),     // User-Agent
    hcloud.WithDebugWriter(os.Stderr),            // Debug logging
    hcloud.WithHTTPClient(customClient),          // Custom HTTP client
    hcloud.WithRetryOpts(hcloud.RetryOpts{        // Retry config
        MaxRetries: 5,
        BackoffFunc: hcloud.ExponentialBackoff(2, time.Second),
    }),
    hcloud.WithPollOpts(hcloud.PollOpts{          // Action polling
        BackoffFunc: hcloud.ConstantBackoff(500 * time.Millisecond),
    }),
)

Common Patterns

See references/patterns.md for idiomatic patterns:

  • Error handling
  • Action polling
  • Pagination
  • Resource lookups

Action Handling

All long-running operations return an Action:

go
result, _, err := client.Server.Create(ctx, opts)
if err != nil {
    return err
}

// Wait for completion
if err := client.Action.WaitFor(ctx, result.Action); err != nil {
    return err
}

// Or with progress callback
err = client.Action.WaitForFunc(ctx,
    func(update *hcloud.Action) error {
        fmt.Printf("Progress: %.0f%%\n", update.Progress)
        return nil
    },
    result.Action,
)

Error Handling

go
import "github.com/hetznercloud/hcloud-go/v2/hcloud"

err := someAPICall()

// Check specific error codes
if hcloud.IsError(err, hcloud.ErrorCodeNotFound) {
    // Resource doesn't exist
}

// Get error details
if apiErr, ok := err.(*hcloud.APIError); ok {
    fmt.Printf("Error: %s - %s\n", apiErr.Code, apiErr.Message)
}

Common error codes:

  • ErrorCodeNotFound - Resource doesn't exist
  • ErrorCodeInvalidInput - Validation error
  • ErrorCodeForbidden - Insufficient permissions
  • ErrorCodeRateLimitExceeded - Rate limit hit (auto-retried)
  • ErrorCodeConflict - Resource changed (auto-retried)
  • ErrorCodeLocked - Another action running

Common Mistakes

ProblemSolution
Nil pointer panicAlways check error before using result
Action timeoutUse ctx, cancel := context.WithTimeout(...)
Missing paginationUse client.Server.All(ctx) for complete list
Action failedCheck action error with WaitFor() return value
Rate limitingSDK auto-retries, but add backoff for bulk ops