Menu

Go SDK — Storage

Persistent storage uses StorageServiceClient. Block disks are RWO volumes; file shares are RWX NFS exports mountable from multiple VMs in the same project and datacenter.

Block disks

Create

storage := storagev1connect.NewStorageServiceClient(httpClient, base)
resp, err := storage.CreateDisk(ctx, connect.NewRequest(&storagev1.CreateDiskRequest{
    Parent: "projects/my-app",
    Disk: &storagev1.Disk{
        DatacenterName: "datacenters/us-dal-1",
        SizeGib:        100,
        StorageClass:   "nvme",
        DisplayName:    "data-1",
        // NetworkName: defaults to project's default network in that DC
    },
}))
diskName := resp.Msg.GetDisk().GetName()
ConstraintValue
Size1–1024 GiB
Storage classnvme
DatacenterImmutable after create

States

PROVISIONINGAVAILABLEATTACHEDAVAILABLE (detach) → DELETING

List and delete

storage.ListDisks(ctx, connect.NewRequest(&storagev1.ListDisksRequest{
    ProjectName: project, PageSize: 100,
}))
storage.DeleteDisk(ctx, connect.NewRequest(&storagev1.DeleteDiskRequest{Name: diskName}))

Delete fails while ATTACHED — detach first.

Attach, detach, resize

VM must be RUNNING for hot attach/detach:

storage.AttachDisk(ctx, connect.NewRequest(&storagev1.AttachDiskRequest{
    DiskName: diskName,
    VmName:   "projects/my-app/virtual-machines/web-1",
}))
storage.DetachDisk(ctx, connect.NewRequest(&storagev1.DetachDiskRequest{DiskName: diskName}))
storage.ResizeDisk(ctx, connect.NewRequest(&storagev1.ResizeDiskRequest{
    DiskName: diskName, NewSizeGib: 200,
}))

Resize is grow-only — no shrink.

File shares

resp, err := storage.CreateFileShare(ctx, connect.NewRequest(&storagev1.CreateFileShareRequest{
    Parent:         "projects/my-app",
    DatacenterName: "datacenters/us-dal-1",
    SizeGib:        500,
    DisplayName:    "shared-data",
}))
share := resp.Msg.GetFileShare()
// share.GetMountCommand() — NFSv4 mount line for VMs in same project + DC
ConstraintValue
Size1–10240 GiB
Storage classcephfs-rwx
MountSame project + datacenter only
storage.ListFileShares(ctx, connect.NewRequest(&storagev1.ListFileSharesRequest{Parent: project}))
storage.DeleteFileShare(ctx, connect.NewRequest(&storagev1.DeleteFileShareRequest{Name: shareName}))

What's next