Modern computer placed next to server racks in a clean data center — Google Cloud Storage at scale.

Setup guide

Cloud Storage

How to Set Up Google Cloud Storage for Asset Migration

Create a GCP service account, grant the right IAM roles on your bucket, and connect to GCS — works on both Workspace and personal Gmail accounts.

Univaultport TeamMay 18, 20265 min readEasy · 8 min

Unlike Google Drive, Google Cloud Storage (GCS) has no service-account quota gotchas. The storage belongs to your GCP project, so a service account can read and write freely as long as it has the right IAM roles on the bucket. This makes GCS the simplest "real" destination for service-account migrations.

Step 1 — Create a GCP project and enable billing

Sign in to console.cloud.google.com. Create a project (or pick an existing one) and enable billing for it. GCS will refuse API calls on a no-billing project, even within the free tier.

Billing → Link a billing account

A credit card is required, but typical migrations of a few GB cost less than a coffee.

Step 2 — Create or pick a bucket

Go to Cloud Storage → Buckets → Create.

  1. Name

    Globally unique. Examples: acme-assets-prod, migrated-2026-q2.
  2. Location

    Single-region is cheapest; multi-region is for global distribution. Pick something close to your other infra.
  3. Storage class

    Standard for active migrations. Switch to Nearline/Coldline later if you're archiving.
  4. Access control

    Uniform (recommended) — IAM applies to all objects. Avoid Fine-grained unless you have legacy ACLs to support.
  5. Encryption

    Default Google-managed keys are fine for almost everyone. CMEK only if your compliance team has asked.

Step 3 — Create a service account

Navigate to IAM & Admin → Service Accounts → Create Service Account.

  • Name: asset-migrator-gcs
  • Description: "Used by Univaultport for GCS migrations" (optional)
  • Skip the optional project-level role step — we'll grant bucket-scoped permissions instead, which is the principle-of-least-privilege way.

Click Done.

Step 4 — Grant the service account access to the bucket

This is the step most teams get wrong. Project-level Storage roles work but grant access to every bucket in the project. Bucket-level roles are scoped and recommended.

Go back to Cloud Storage → Buckets → your bucket → Permissions → Grant Access.

  • Principal: paste the service account email (looks like asset-migrator-gcs@my-project.iam.gserviceaccount.com)
  • Role: choose one of the following based on use case:
Use caseRoleWhat it allows
Source only (read migrations FROM GCS)Storage Object ViewerList + download
Destination only (write migrations TO GCS)Storage Object CreatorUpload only — no list
Source and destinationStorage Object AdminRead, write, delete
Full managementStorage AdminEverything, including bucket-level operations

Click Save.

Step 5 — Generate a JSON key

Back at IAM & Admin → Service Accounts, click into your service account → Keys → Add Key → Create new key → JSON → Create.

A JSON file downloads. Open it — you'll paste its full contents into Univaultport.

Step 6 — Paste credentials into Univaultport

In the connector wizard:

  1. Service Account JSON

    Paste the entire JSON key file (including the { and }).
  2. Bucket Name

    The bucket name only — no gs:// prefix, no project prefix. e.g. acme-assets-prod.
  3. Object Prefix

    Optional. Scopes the connector to a sub-path inside the bucket. e.g. images/2026/. Every read and write happens under this prefix.

Hit Save & test. A green check means GCS responded successfully.

What the prefix actually does

GCS is flat object storage — "folders" are virtual. Setting prefix: images/2026/ means:

  • Listings only return objects whose keys begin with images/2026/.
  • Writes prepend images/2026/ to every uploaded asset key.
  • Folder navigation in the UI is scoped to that subtree.

This is useful for multi-team buckets where each team owns a top-level prefix. Leave it blank to use the entire bucket.

Troubleshooting

ErrorCauseFix
403 ForbiddenService account is missing the IAM role on the bucketGrant the role at the bucket level, not just the project
404 Bucket not foundTypo in bucket name, or bucket is in a different projectDouble-check the name; remove any gs:// prefix
Caller does not have storage.objects.list accessHas Creator but not ViewerSwitch to Object Admin if you need to list
Billing requiredProject has no billing accountLink a billing account; free tier still applies

Cost estimate

For a one-time migration of 100 GB to/from GCS in Standard storage:

  • Storage: $0.020/GB/month → ~$2/month while resident
  • Operations: $0.005 per 10,000 PUTs → essentially free for typical migrations
  • Egress (downloads to outside Google Cloud): $0.12/GB → factor this in for large migrations leaving GCS

For migrations between GCS buckets in the same region, egress is free.

Next steps

With GCS connected, common patterns are:

  • GCS → Cloudinary for CDN-fronted delivery of asset libraries
  • Cloudinary → GCS for archive/backup of legacy DAM libraries
  • Local → GCS for initial cloud onboarding of on-prem assets

Pick a source and destination in the migration wizard and you're off.

Keep going

Related guides