Skip to main content
Skyvern generates several types of artifacts during task execution: screenshots, browser recordings, HAR files, and extracted data. By default, these are stored on the local filesystem. For production deployments, you can configure S3 or Azure Blob Storage.

Storage types

Skyvern supports three storage backends:

Local storage (default)

By default, Skyvern stores all artifacts in a local directory.
.env

Docker volume mounts

When using Docker Compose, these paths are mounted from your host:
docker-compose.yml

Limitations

Local storage works well for single-server deployments but has limitations:
  • Not accessible across multiple servers
  • No automatic backup or redundancy
  • Requires manual cleanup to manage disk space

AWS S3

Store artifacts in S3 for durability, scalability, and access from multiple servers.

Configuration

.env

Authentication

Skyvern uses the standard AWS credential chain. Configure credentials using one of these methods: Environment variables:
.env
IAM role (recommended for EC2/ECS/EKS): Attach an IAM role with S3 permissions to your instance or pod. No credentials needed in environment. AWS profile:
.env

Required IAM permissions

Create an IAM policy with these permissions:

Creating the buckets

Create the S3 buckets in your AWS account:
Bucket names must be globally unique across all AWS accounts. Add a unique prefix or suffix (e.g., your company name or a random string).

Bucket configuration recommendations

Lifecycle rules: Configure automatic deletion of old artifacts to control costs.
Encryption: Enable server-side encryption for data at rest. Access logging: Enable access logging for audit trails.

Azure Blob Storage

Store artifacts in Azure Blob Storage for Azure-based deployments.

Configuration

.env

Creating the storage account and containers

Using Azure CLI:
For Azure VMs or AKS, use Managed Identity instead of storage account keys:
  1. Enable Managed Identity on your VM or AKS cluster
  2. Grant the identity “Storage Blob Data Contributor” role on the storage account
  3. Omit AZURE_STORAGE_ACCOUNT_KEY from your configuration

What gets stored where

Videos (recordings) are currently always stored locally in VIDEO_PATH regardless of storage type.

Pre-signed URLs

When artifacts are stored in S3 or Azure Blob, Skyvern generates pre-signed URLs for access. These URLs:
  • Expire after PRESIGNED_URL_EXPIRATION seconds (default: 24 hours)
  • Allow direct download without additional authentication
  • Are included in task responses (recording_url, screenshot_urls)
Adjust the expiration based on your needs:
.env

Migrating from local to cloud storage

To migrate existing artifacts from local storage to S3 or Azure:

S3

Azure

After migration, new artifacts will be stored in cloud storage, but existing local artifacts won’t be automatically moved. The sync is a one-time operation.

Disk space management

Local storage

Monitor disk usage and clean up old artifacts periodically:

Cloud storage

Use lifecycle policies to automatically delete old objects: S3: Configure lifecycle rules to expire objects after N days. Azure: Configure lifecycle management policies in the Azure portal or via CLI.

Troubleshooting

”Access Denied” errors

  • Verify your credentials are correct
  • Check IAM permissions include all required actions
  • Ensure the buckets/containers exist
  • For S3, verify the AWS region matches your bucket location

Pre-signed URLs not working

  • Check that PRESIGNED_URL_EXPIRATION hasn’t elapsed
  • Verify bucket policy allows public access to pre-signed URLs
  • For S3, ensure the bucket isn’t blocking public access if needed

Artifacts not appearing

  • Check Skyvern logs for storage errors: docker compose logs skyvern | grep -i storage
  • Verify the storage type is correctly set: SKYVERN_STORAGE_TYPE
  • Ensure network connectivity to the storage endpoint

Next steps

Docker Setup

Return to the Docker setup guide

Kubernetes Deployment

Deploy Skyvern at scale