Get started with Amazon S3 pre-signed URLs

By default, all Amazon S3 objects are private, only the object owner has permission to access them. However, the object owner may share objects with others by creating a presigned URL. A presigned URL uses security credentials to grant time-limited permission to download objects. The URL can be entered in a browser or used by a program to download the object. The credentials used by the presigned URL are those of the AWS user who generated the URL.

For general information about presigned URLs, see Working with presigned URLs.

Here's a breakdown of how it works and its key aspects:

  1. Temporary Access: The primary purpose of a pre-signed URL is to provide temporary access to an object stored in an S3 bucket. This access can be for either uploading or downloading the object.

  2. Generated by AWS Credentials: To create a pre-signed URL, you need to have valid AWS credentials. The URL is generated using your AWS access key ID and secret access key.

  3. Expiration Time: When you create a pre-signed URL, you specify an expiration time after which the URL becomes invalid. This time frame can be a few minutes or several hours, depending on your requirements.

  4. Access Control: Pre-signed URLs are useful for controlling access to your S3 objects, especially when you don’t want to make them public but need to share them with specific users or for a limited time.

  5. Use Cases: Common use cases include sharing large files that are impractical to email, allowing users to upload files to your S3 bucket without giving them full AWS credentials, and providing temporary access to resources for a limited time.

  6. Security: While pre-signed URLs are secure as they are generated using your AWS credentials, it’s important to note that anyone with the URL can access the object until the URL expires. Therefore, it’s crucial to keep these URLs secure and share them only with trusted parties.

  7. Flexibility: You can create pre-signed URLs for any object in your S3 bucket, regardless of the object’s current access permissions. The object can be private, and the URL will still allow access as specified.

  8. HTTP Methods: You can generate pre-signed URLs for various HTTP methods like GET (for downloading objects) and PUT (for uploading objects).

  9. SDK and CLI Support: AWS provides support for generating pre-signed URLs through its SDKs (like Boto3 for Python) and the AWS Command Line Interface (CLI), making it easy to integrate this feature into your applications or scripts.

AWS S3 pre-signed URLs are a powerful and secure way to share access to objects stored in S3, offering both flexibility and control over how and when your data is accessed.

Tutorial: Create a pre-signed URL for an S3 object by using AWS SDK

Creating a pre-signed URL for an object in Amazon S3 is a straightforward process that can be accomplished using the AWS SDK for various programming languages. Below is a step-by-step guide using Python and the Boto3 library, which is the AWS SDK for Python.


  • AWS account with access to S3.

  • An S3 bucket with the object for which you want to create a pre-signed URL.

  • AWS credentials (Access Key ID and Secret Access Key) configured on your machine. This can be done via the AWS CLI or by setting environment variables.


  1. Install Boto3: If you haven't already installed Boto3, you can do so by running:

     pip install boto3
  2. Import Boto3: In your Python script or interpreter, import Boto3:

     import boto3
     from botocore.exceptions import NoCredentialsError
  3. Create a Boto3 Client for S3: Set up a Boto3 client for S3. This client will interact with the S3 service.

     s3_client = boto3.client('s3')
  4. Generate the Pre-Signed URL: Define the bucket name and the object key (filename in the bucket). Specify the method (GET for download) and the expiration time in seconds.

         bucket_name = 'your-bucket-name'
     object_name = 'your-object-key'
     expiration = 3600  # 1 hour; adjust as needed
         pre_signed_url = s3_client.generate_presigned_url('get_object',
                                                           Params={'Bucket': bucket_name, 'Key': object_name},
         print("Pre-Signed URL:", pre_signed_url)
     except NoCredentialsError:
         print("Credentials not available")
  5. Use or Share the URL: The generated URL can be used in a web browser or any HTTP client to access the specified S3 object. Remember, the URL will only be valid for the duration you specified.


  • The expiration time is in seconds. AWS allows a maximum expiration time of 7 days for pre-signed URLs.

  • If you need to create a pre-signed URL for uploading (PUT operation), change the method in generate_presigned_url to 'put_object'.

  • Ensure that the AWS credentials used to generate the URL have the necessary permissions to access the specified S3 object.

  • Be cautious when sharing pre-signed URLs as anyone with the URL can access the object until it expires.

This tutorial provides a basic example. Depending on your needs, you might need to customize the process, especially regarding AWS credentials management and error handling.


  1. Sharing objects with presigned URLs

  2. Working with presigned URLs

  3. Create a presigned URL for Amazon S3 using an AWS SDK

  4. Amazon S3 code examples for the SDK for Python