Offloft 0.1.0 is here: offload your WordPress media and know it arrived.Read what's new

Connect Amazon S3 to WordPress

To move your WordPress media library to Amazon S3, install Offloft, create a bucket and an IAM user that can reach only that bucket, then let visitors read the files. Offloft tests the connection and public delivery before it serves anything from the cloud.

What you'll need

  • An AWS account
  • A WordPress admin login
  • Offloft installed (WordPress 6.5 or later and PHP 8.1 or later with the cURL extension)
  1. Create the bucket

    Open the S3 console, choose General purpose buckets and select Create bucket.

    Region: pick the one closest to most of your visitors and enter the same region in Offloft. It cannot be changed later.

    Name: 3 to 63 lowercase letters, numbers and hyphens. Avoid periods: they break secure (https) addresses.

    Leave Object Ownership on Bucket owner enforced and leave Block Public Access on for now; the public access step explains when to change it.

    Bucket name
    my-site-media

    Open Amazon S3's consoleAmazon S3's documentation

  2. Create a user with access to this bucket only

    In the IAM console, go to Policies > Create policy, choose JSON and paste the policy below. It allows exactly what Offloft does, on "my-site-media" only. Name it, for example, offloft-my-site-media.

    Go to Users > Create user. Give it a name, choose Attach policies directly, pick the policy you just made and create the user.

    Open the user, go to the Security credentials tab and select Create access key. Choose Other, then Next, then Create access key.

    Copy the Access key and the Secret access key into Offloft (select Show, or Download .csv file). AWS shows the secret only once.

    IAM policy
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "OffloftListBucket",
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": ["arn:aws:s3:::my-site-media"]
        },
        {
          "Sid": "OffloftManageFiles",
          "Effect": "Allow",
          "Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:AbortMultipartUpload"],
          "Resource": ["arn:aws:s3:::my-site-media/*"]
        }
      ]
    }

    Open Amazon S3's consoleAmazon S3's documentation

  3. Let visitors read the files

    New buckets block all public access, so visitors cannot see your images yet. Make the files readable here.

    Open the bucket, go to Permissions > Block public access (bucket settings), select Edit, clear Block all public access and save. If it still fails, the same setting at account level (Block Public Access settings for this account) is on.

    Then, under Bucket policy, select Edit and paste the policy below. It lets anyone read a file whose address they know; nobody can list, change or delete files.

    Offloft does not need object ACLs; keep Bucket owner enforced.

    Bucket policy
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "PublicReadGetObject",
          "Effect": "Allow",
          "Principal": "*",
          "Action": ["s3:GetObject"],
          "Resource": ["arn:aws:s3:::my-site-media/*"]
        }
      ]
    }

    Open Amazon S3's consoleAmazon S3's documentation

  4. Allow your site to read files (CORS)Optional

    This step is optional. Images on your pages load without it. You need it only when your site's own scripts read files from storage, for example image editors, web fonts or 3D viewers. The rule below lets only your site read files, and only read them.

    Open the bucket, go to Permissions > Cross-origin resource sharing (CORS), select Edit and paste the rule.

    CORS configuration
    [
      {
        "AllowedOrigins": ["https://yoursite.com"],
        "AllowedMethods": ["GET", "HEAD"],
        "AllowedHeaders": ["*"],
        "MaxAgeSeconds": 3600
      }
    ]

    Open Amazon S3's consoleAmazon S3's documentation

  5. Run the connection test and the delivery check

    In Offloft, paste your values and run the connection test. It checks your credentials, finds the bucket, uploads a test file, reads it back and deletes it. The delivery check then loads a small test image from your public address. Offloft serves nothing from the cloud until both pass.

The steps above match the guide inside the plugin, checked against Amazon S3's documentation on 2026-10-26. Example values are shown here; the plugin fills in your own.

Permissions Offloft needs

An IAM policy that allows s3:ListBucket on the bucket, and s3:PutObject, s3:GetObject, s3:DeleteObject and s3:AbortMultipartUpload on its files. The exact policy is in step 2.

Serving your files

New buckets block all public access, so visitors can't see files until you allow it. Turn off Block Public Access for this bucket and add the bucket policy from step 3. It lets anyone read a file whose address they know; nobody can list, change or delete files. The delivery check confirms it works.

Amazon S3 questions

Can I change the region later?

No. A bucket's region can't be changed, so pick the one closest to most of your visitors and enter the same region in Offloft.

Should I use periods in the bucket name?

No. Periods break secure (https) addresses. Use lowercase letters, numbers and hyphens.

Do I need object ACLs?

No. Offloft does not need them, so keep Object Ownership on Bucket owner enforced.

Does anyone get to list my files?

No. The bucket policy lets someone read a file whose address they know. Nobody can list, change or delete files.

Ready to connect your bucket?

Install Offloft free. Nothing moves until the connection test passes.

Type to search.