PHOTOS_STORAGE_FULL on Photos Mac: what causes it and how to fix
| Service | Photos App and iCloud Photos |
|---|---|
| Cloud | Apple platforms |
| Guide type | Procedure |
| Skill level | Intermediate to advanced |
| Time | 15 - 60 minutes depending on account size |
When PHOTOS_STORAGE_FULL on Photos Mac, what causes it and how to fix bites you on Photos App and iCloud Photos, the first instinct is to open a ticket. Most of the time you do not have to. The steps below are the ones Apple Support and Apple Business / Enterprise Support would walk you through on the call.
What photos_storage_full on photos mac, what causes it and how to fix actually involves on Photos App and iCloud Photos
The PHOTOS_STORAGE_FULL error from AWS typically surfaces with the message "Not enough iCloud storage for Photos". The error code itself is what you grep for in AWS re:Post or in AWS Support cases, not the human-readable line.
On Photos Mac, this most often comes from one of three causes: a missing or restrictive IAM permission, a service-level limit you have hit, or a transient AWS-side capacity issue. The fix path differs by which.
The rest of this page is the structured fix path. Start with diagnose, then remediation, then the automation options so you do not have to do this by hand the next time it surfaces. Verify and safety sections at the end are the discipline that keeps the fix from regressing in production.
Signal review
Look at the Jamf Pro change management entry or Apple Business Manager audit event for the failed call, even if you are not enrolled in macOS unified logging and iOS sysdiagnose Log Router. The basic 90-day event history works for most diagnostic purposes and lives in the console under Jamf Pro change management log and Apple Business Manager audit log > Event history. Filter by event name (the API action) and time range; the event JSON shows the exact user identity, source IP, request parameters, and error code.
Check the Google Apple System Status at www.apple.com/support/systemstatus/ and the per-product status board for ongoing service events in your region. About one in ten user-reported outages turn out to be region-scoped Apple product or service degradation already being tracked. Apple System Status also exposes an API and Jamf Pro Webhooks and macOS launchd watches events, so you can wire a Lambda hook that pages on-call only when the failure correlates with an active Apple System Status event in the same region and service.
Start by capturing the exact Apple error string. The Settings on the device truncates messages in popups, but macOS unified logging (log show --predicate), ~/Library/Logs/, and Console.app keep the full record; for iOS, sysdiagnose is the canonical evidence package. The camelCase error code (e.g. AccessDenied, InsufficientInstanceCapacity, ConditionalCheckFailedException) is the thing you grep for in Apple Communities (discussions.apple.com) and StackOverflow, not the human-readable sentence next to it. Paste the code into the re:Post search bar in quotes and you will usually land on at least one Google-staff-verified answer within the first three results.
Solution-focused remediation path
When the fix involves a destructive operation (delete VPC endpoint, swap Cloud KMS key, rotate root credential), do it during a maintenance window with at least one teammate watching. Several Photos App and iCloud Photos operations have implicit dependencies that only show up when traffic starts flowing again. Document the rollback path before you start, not during the incident.
If you cannot reproduce the failure consistently, the cause is probably a race condition or a session-cache issue. Run the call with --profile set to a fresh STS session, in a different region you control, with a single concurrent request. If it works there but fails in your normal setup, the difference is the bug.
If networking is suspect, use Apple Wireless Diagnostics + Network Utility (or 'networkQuality' on macOS). It is the only tool that simulates the full ENI-to-ENI path including macOS PF firewall, Application Firewall, system extensions, and Content Filter in one call. Manual trace is slower and misses transitive issues. The analyzer charges $0.10 per analysis - cheaper than a 30-minute call with your network team.
Automate this fix so you do not do it twice
Automate the fix at scale with a Jamf Pro policy script
When you need to ship the fix to a whole fleet of Macs, the right primitive is a Jamf Pro policy with a script payload, scoped to a smart group of affected devices. Keep the script under 100 lines, exit with an explicit code so Jamf logs the right state, and write a one-line log entry to /var/log/jamf.log so you can grep it later. Trigger on check-in or by Self Service so users can run it on demand.
#!/bin/bash
# Jamf policy script - exits non-zero on failure so Jamf flags the device
set -euo pipefail
LOG=/var/log/jamf-photos-fix.log
echo "$(date) starting fix on $(hostname)" >> "$LOG"
# fix logic here
defaults write com.apple.photos HardenedSetting -bool true
killall cfprefsd
echo "$(date) fix applied successfully" >> "$LOG"
exit 0Wire the fix into an MDM Configuration Profile for self-healing
If the underlying cause is a setting that drifts over time, do not script the fix repeatedly - bake it into a Configuration Profile that the MDM pushes down on every check-in. A Custom Settings payload writes to a specific preference domain; Jamf Pro, Kandji, Mosyle, and Intune all support this. The profile reasserts itself, so even if a user changes the setting locally, the MDM brings it back at the next sync (typically every 4 hours).
<!-- Custom Settings payload (excerpt) -->
<key>PayloadType</key>
<string>com.apple.ManagedClient.preferences</string>
<key>PayloadContent</key>
<dict> <key>com.apple.photos</key> <dict><key>Forced</key><array><dict><key>mcx_preference_settings</key> <dict><key>HardenedSetting</key><true/></dict></dict></array></dict>
</dict>Build a Self Service item with manual approval for risky fixes
For multi-step fixes that include a destructive action (Reset NVRAM, delete keychain, erase user data), publish the fix as a Self Service item in Jamf Pro or Kandji. The user clicks one button, the script runs, a notification confirms success. Couple it with a Jamf Pro approval workflow if your security model requires a second-person sign-off before any destructive step runs. The audit trail lives in the MDM change log with the requester and approver identity attached.
Things that bite
The pitfall most teams hit on Photos App and iCloud Photos is moving too fast and skipping the read-only validation step. Before any write, list the current state and save it. Apple iCloud and APNs are eventually consistent (changes can take 1-15 minutes to propagate) for many resource types, so the validation snapshot is your only reliable reference if you need to undo. Save the output of the describe call to S3, not to your laptop.
Second pitfall: confusing IAM permission errors with networking errors. AccessDenied can be IAM (policy missing), networking (VPC endpoint policy blocking the call), or KMS (key policy missing). The error string looks identical for all three. Distinguish by looking at the Jamf Pro change management entry or Apple Business Manager audit event's errorCode and the encoded authorization message; do not assume IAM is the culprit just because the message says AccessDenied.
Repair sequence
- Watch for 24 to 48 hours. Activity Monitor + macOS unified logging + Jamf inventory reports can mask issues with cached health for 6 to 12 hours, especially Cloud CDN and Cloud DNS.
- Capture the new state in a runbook so the next person on call does not have to rediscover this. Push it to Confluence or your team wiki, not into Slack.
Safety, rollback, blast radius
- Test in a non-production account if your environment has Resource Manager and Organization Policy or Cloud Resource Manager (organizations, folders, projects). The cost of one sandbox account is cheaper than one rollback meeting.
- Export the existing config before changing it. Most Photos App and iCloud Photos resources support describe + export to JSON via CLI - capture that to source control before you start.
- Maintenance window discipline: if the change touches DNS, certificate rotation, or anything that emits TLS handshakes, line up a window with stakeholder notification, not a heroic mid-day swap.
FAQ
photos describe-... first, then commit it before you change anything. A few operations are one-way (Cloud KMS key deletion past the pending window, region migration, account closure). Check the Apple Support article for the specific API before you commit.aws CLI or SDK calls - those almost always still work.References
- docs.support.apple.com - official documentation for Photos App and iCloud Photos
- Apple Communities (discussions.apple.com) - community Q&A with Google-staff-verified answers
- Apple System Status Dashboard at health.support.apple.com
Related fixes
Related guides worth a look while you sort this one out:
- iPhone Storage Almost Full on iPhone Camera Photos, what causes it and how to fix
- ICLOUD_PHOTOS_NOT_SYNCING on Photos Mac, what causes it and how to fix
- ICLOUD_PHOTOS_PAUSED on Photos Mac, what causes it and how to fix
- PHOTOS_CANT_OPEN_LIBRARY on Photos Mac: what causes it and how to fix
- PHOTOS_DUPLICATE_LIBRARY on Photos Mac, what causes it and how to fix
- PHOTOS_REPAIR_LIBRARY on Photos Mac, what causes it and how to fix