Your iCloud Photos Stuck Outside Google Cloud? Here's How to Get Them Into GCS
Transfer iCloud Photos to Google Cloud Storage for analytics, ML pipelines, or durable archiving. 3 methods: gsutil CLI, web console upload, and cloud-to-cloud via CloudsLinker.
Introduction
I was building an image classification pipeline in Vertex AI and realized the training dataset I actually wanted — years of categorized travel and product photos — was locked inside my iCloud library. Google Cloud Storage is the native storage layer for everything in Google Cloud: BigQuery, Vertex AI, Cloud Functions, Dataflow. Having photos in a GCS bucket means they're immediately accessible to any Google Cloud service without extra data movement. iCloud has no API and no way to connect to external workflows. Moving the library to GCS turns a personal photo archive into a programmable data asset. Here are three ways to bridge that gap.
iCloud Photos keeps your entire photo library synchronized across every Apple device — iPhone, iPad, and Mac — automatically and quietly in the background. It's one of the most seamless photo experiences available, as long as you stay inside Apple's ecosystem.
- 5 GB free shared across backups, mail, files, and photos.
- iCloud+ plans scale from 50 GB up to 12 TB.
- Original quality storage with device optimization options.
- Apple ecosystem only — no API, no programmatic access.
iCloud Photos is a sync service, not a data platform. You pay monthly regardless of how often you access your photos, and there is no way to connect your library to external data pipelines, ML workflows, or cloud analytics services.
Google Cloud Storage (GCS) is Google's unified object storage for the entire Google Cloud ecosystem. It serves as the native storage layer for BigQuery, Vertex AI, Cloud Functions, Dataflow, and virtually every other Google Cloud service.
- Multiple storage classes — Standard, Nearline, Coldline, and Archive for cost optimization.
- Native integration with BigQuery, Vertex AI, Cloud Functions, and Dataflow.
- 11 nines durability (99.999999999%) — built for data you cannot afford to lose.
- Fine-grained IAM permissions — control access at the bucket, prefix, or object level.
GCS uses buckets and object prefixes — photos land as objects in the bucket and prefix you specify. Once your data is in GCS, it becomes immediately accessible to any Google Cloud service without extra data movement or ETL steps.
The moment I needed to run image classification on my own photos, iCloud became the bottleneck. Vertex AI reads directly from GCS buckets. BigQuery ML can reference GCS objects. Cloud Functions can trigger on new objects landing in a bucket. None of that works if the data is locked inside iCloud with no API and no programmatic access. Moving photos to GCS is not just about storage — it is about making the data usable inside Google Cloud's service mesh.
- Native Google Cloud ecosystem integration: GCS is the default data layer for BigQuery, Vertex AI, Cloud Functions, Dataflow, and Cloud Run. Photos in a GCS bucket are immediately accessible to any of these services — no data movement, no intermediate storage, no adapters. iCloud has no integration points with any cloud platform.
- Multiple storage classes for cost optimization: GCS offers Standard, Nearline, Coldline, and Archive storage classes. Active training datasets can sit in Standard; archived photo collections can move to Coldline or Archive at a fraction of the cost. You can set lifecycle rules to transition objects between classes automatically.
- Programmable via APIs, gsutil, and client libraries: Once photos are in GCS, you can manage them with gsutil, the JSON/gRPC API, or client libraries in Python, Go, Java, Node.js, and more. Automate organization, trigger processing pipelines, or build custom workflows — none of which is possible with iCloud.
- IAM-based access control: GCS uses Google Cloud IAM for fine-grained permissions. You can grant read-only access to a specific bucket for a Vertex AI service account, restrict write access to a CI/CD pipeline, or share individual objects via signed URLs — all without exposing your entire library.
- Foundation for ML and analytics workflows: A photo library in GCS is a training dataset, a feature store input, or a source for image analytics. Vertex AI AutoML Vision, Cloud Vision API, and custom TensorFlow pipelines all read natively from GCS. Moving photos from iCloud to GCS turns a personal archive into a machine-learning-ready data asset.
Getting photos out of iCloud and into a GCS bucket takes deliberate steps because iCloud was not designed for data export. Here are three approaches that work in practice.
Method 1: Download from iCloud Photos, Then Upload via GCS Web Console
The simplest approach — no CLI tools required. Best for small batches or a quick test before committing to a larger migration.
Step 1: Export from iCloud Photos
Open iCloud Photos on the web and sign in with your Apple ID.
Select the photos or albums you want to export. Click the download icon and choose your preferred format:
- Original Format — preserves HEIC, Live Photos, and RAW files at full quality.
- Most Compatible — converts HEIC to JPEG. Useful if downstream tools or Vision API preprocessing expect JPEG input.
Step 2: Upload to GCS via Cloud Console
Open the Google Cloud Console — Cloud Storage Browser and navigate to your target bucket (or create a new one).
- Click Upload Files or Upload Folder inside the bucket view.
- Select the extracted photo files from your local machine.
- Optionally create a folder prefix first (e.g.,
icloud-photos/2024/) to organize objects. - Wait for the upload to complete.
Method 2: Download from iCloud, Then Upload via gsutil / gcloud CLI
The developer-friendly path. Download photos locally from iCloud, then push them to GCS using gsutil or the gcloud storage commands. This gives you full control over object naming, parallel uploads, storage class selection, and metadata.
Step 1: Download from iCloud Photos
Use the same iCloud web export from Method 1, or download via the Photos app on macOS (Photos → Select All → File → Export Unmodified Originals) to a local folder.
Step 2: Install and Authenticate the gcloud CLI
If you do not have the Google Cloud SDK installed:
# Install the Google Cloud SDK (macOS example)
brew install --cask google-cloud-sdk
# Authenticate
gcloud auth login
# Set your project
gcloud config set project YOUR_PROJECT_ID
Step 3: Upload with gsutil
Use gsutil -m for parallel multi-threaded uploads:
# Parallel upload to a GCS bucket with a prefix
gsutil -m cp -r /path/to/icloud-photos/* gs://my-photo-bucket/icloud-archive/
# Or use rsync for incremental transfers (only uploads new/changed files)
gsutil -m rsync -r /path/to/icloud-photos gs://my-photo-bucket/icloud-archive/
The -m flag enables parallel operations — gsutil will upload
multiple files simultaneously, which dramatically improves throughput for
large batches. Use rsync if you plan to run the upload in
multiple sessions — it only transfers files that are new or changed.
Alternative: Specify a Storage Class
# Upload directly to Coldline storage for archival
gsutil -m -o "GSUtil:default_storage_class=COLDLINE" cp -r /path/to/icloud-photos/* gs://my-photo-bucket/archive/
Method 3: Move iCloud Photos to Google Cloud Storage Directly in the Cloud (No Local Downloads)
When Your Data Pipeline Starts at iCloud's Front Door
If the goal is getting photos into GCS for a Vertex AI pipeline, a BigQuery analysis, or long-term durable archiving, downloading everything to your laptop first adds hours of unnecessary data movement. Your local machine becomes a bottleneck that has nothing to do with the actual workflow. CloudsLinker connects iCloud Photos and Google Cloud Storage directly. Photos move cloud-to-cloud without passing through your computer, without consuming your home internet connection, and without needing a single gigabyte of free space on your hard drive.
Step 1: Connect iCloud Photos
In CloudsLinker, click Add Cloud and select iCloud Photos. Enter your Apple ID and password. If two-factor authentication is enabled, enter the verification code from your trusted Apple device when prompted.
Once connected, your iCloud albums appear in the CloudsLinker dashboard. You can transfer your entire library or select specific albums.
Step 2: Connect Google Cloud Storage (S3-Compatible Credentials)
Google Cloud Storage supports S3-compatible access through HMAC keys.
You need an Access Key ID, a Secret Access Key, and the GCS
S3-compatible endpoint (storage.googleapis.com).
Where to find your HMAC credentials:
In the Google Cloud Console, go to Cloud Storage → Settings → Interoperability. Under "Service account HMAC," click Create a Key for a Service Account. Select an existing service account (or create one under IAM & Admin → Service Accounts) and generate the HMAC key pair. Copy the Access Key and Secret — the secret is only shown once.
Add GCS in CloudsLinker:
- Click Add Cloud and select Google Cloud Storage (S3-compatible).
- Fill in the Access Key ID, Secret Access Key, and endpoint (
storage.googleapis.com). - Confirm the connection.
Once connected, your GCS buckets appear in the CloudsLinker file browser.
Step 3: Configure the Transfer
Go to the Transfer section. Set iCloud Photos as the source and Google Cloud Storage as the destination.
For the destination, select the target bucket and specify an optional object
prefix to organize your photos — for example,
icloud-archive/ or training-data/photos-2024/.
Photos arrive as individual objects inside that prefix path, named by their
original filenames.
If you want to preserve your iCloud album organization, transfer one album
at a time: select a specific iCloud album as the source, use a matching
prefix in GCS as the destination
(e.g., icloud-archive/italy-2024/),
and run each album as a separate task.
Step 4: Start and Monitor the Transfer
Click Transfer Now. The task appears in your Task List, where you can monitor progress in real time. Because the transfer runs entirely in the cloud, your computer does not need to stay on.
For large libraries, this is the key advantage: photos move directly from iCloud's infrastructure to Google's data centers using CloudsLinker's servers — not your home internet connection. Once transferred, the objects are immediately accessible via gsutil, the Cloud Console, client libraries, or any Google Cloud service that reads from GCS.
Comparing the 3 Ways to Move Photos from iCloud Photos to Google Cloud Storage
| Method | Ease of Use | Speed | Best For | Uses Local Bandwidth | Skill Level |
|---|---|---|---|---|---|
| GCS Cloud Console (Download → Upload) | ★★★★★ | ★★☆☆☆ | Small batches, quick tests | Yes (download + upload) | Beginner |
| gsutil / gcloud CLI | ★★★☆☆ | ★★★★☆ | Developers, automation, large structured uploads | Yes (download + upload) | Intermediate |
| CloudsLinker (Cloud-to-Cloud) | ★★★★☆ | ★★★★★ | Large libraries, full migration | No | Beginner |
- Choose your storage class before the first upload: Standard is best for data you access frequently (active ML pipelines, iterative analysis). Nearline works for data accessed less than once a month. Coldline and Archive are for long-term retention where you rarely read the data. Uploading to the wrong class and changing later incurs early deletion fees, so decide your access pattern up front.
-
Apply IAM least-privilege from day one:
Create a dedicated service account for the migration with only
roles/storage.objectCreatoron the target bucket. Do not use your project owner credentials for bulk uploads. After migration, revoke write access and grant read-only permissions to the service accounts that need to consume the data (Vertex AI, BigQuery, etc.). -
Plan your object naming and prefix structure:
GCS uses flat object storage with prefixes acting as virtual folders.
Decide on a naming convention before your first upload
(e.g.,
photos/2024/vacation/oricloud-archive/album-name/) so you do not end up reorganizing thousands of objects later. Consistent prefixes also make lifecycle rules and IAM policies easier to apply. - Set lifecycle rules for automatic cost optimization: GCS supports object lifecycle management that can automatically transition objects from Standard to Nearline or Coldline after a specified number of days, or delete old object versions. For a photo archive, set a rule to downgrade storage class after 30 or 90 days if you only need frequent access during the initial verification period.
- GCS stores files as-is — including HEIC: GCS stores whatever you upload without conversion. If your downstream pipeline (Vision API, AutoML Vision) expects JPEG input, convert HEIC files before uploading via the "Most Compatible" export option on iCloud.com, or handle conversion in a Cloud Function triggered on object creation.
- iCloud 2FA: have your Apple device nearby: When connecting iCloud Photos in CloudsLinker, you need to complete two-factor authentication. Have your trusted iPhone or iPad on hand to receive and enter the verification code. Confirm that "Access iCloud Data on the Web" is enabled in your Apple ID settings before starting.
- Verify before removing anything from iCloud: After the transfer completes, spot-check a few albums' worth of objects in GCS — verify file counts, open a few photos in the Cloud Console preview, and confirm object sizes match originals — before cancelling your iCloud+ plan or deleting originals. CloudsLinker's Task List shows a transfer summary when each task finishes.
Frequently Asked Questions
my-bucket/icloud-archive/IMG_1234.HEIC).
There is no automatic folder or album hierarchy. The Cloud Console displays prefixes as virtual folders for browsing convenience, but the underlying storage is flat. If you want to mirror your iCloud album structure, create matching prefixes in GCS and transfer one album at a time.
To preserve your album structure, transfer one album at a time: in CloudsLinker, set a specific iCloud album as the source, then use a matching prefix in GCS as the destination (e.g.,
icloud-archive/italy-2024/). Repeat for each album.
GCS itself does not render or preview most photo formats natively. If your downstream pipeline (Cloud Vision API, AutoML Vision) requires JPEG, you can convert before uploading or set up a Cloud Function that automatically converts HEIC to JPEG when new objects land in the bucket.
Before connecting, confirm that "Access iCloud Data on the Web" is enabled in your Apple ID settings at appleid.apple.com. Once connected, your iCloud albums and full library appear in the CloudsLinker dashboard.
For a photo archive with infrequent reads, storage is the dominant cost. Standard storage costs more per GB but has no minimum storage duration. Coldline and Archive are significantly cheaper per GB but carry minimum storage duration charges (90 days for Coldline, 365 days for Archive) and higher retrieval fees. Choose the class that matches your access pattern.
For most users building data workflows, the initial transfer is a backup: keep iCloud for daily phone use and GCS for programmatic access. If cost reduction is the goal, verify everything landed correctly in GCS, confirm your workflows function, and then decide whether to downgrade or cancel your iCloud+ plan.
Selective transfer also lets you route different albums to different bucket prefixes, keeping your GCS organization aligned with your downstream data needs.
Standard — best for active datasets: ML training runs, frequent reads from pipelines, or photos you access regularly. No minimum storage duration, lowest retrieval cost.
Nearline — good for data accessed less than once a month. Lower storage cost than Standard, 30-day minimum storage duration.
Coldline — for data accessed less than once a quarter. Significantly cheaper storage, 90-day minimum, higher retrieval fees.
Archive — cheapest storage for data you almost never read. 365-day minimum storage duration, highest retrieval cost. Best for disaster-recovery copies or regulatory retention.
A common pattern: upload to Standard initially, verify everything works in your pipeline, then set a lifecycle rule to transition objects to Nearline or Coldline after 30-90 days.
Conclusion
A quick dataset for a prototype? Download from iCloud and upload via the Cloud Console. A structured migration for a production pipeline or long-term archive? CloudsLinker transfers photos cloud-to-cloud — from iCloud's servers directly into your GCS bucket — without downloading anything locally. Start with one album to validate your bucket structure and IAM permissions before migrating the full library.
Online Storage Services Supported by CloudsLinker
Transfer data between over 48 cloud services with CloudsLinker
Didn' t find your cloud service? Be free to contact: [email protected]
Further Reading
Effortless FTP connect to google drive: Transfer Files in 3 Easy Ways
Learn More >
Google Photos to OneDrive: 3 Innovative Transfer Strategies
Learn More >
Google Photos to Proton Drive: 3 Effective Transfer Techniques
Learn More >