A session manages state about a particular configuration. By default, a session is created for you when needed. However, it’s possible and recommended that in some scenarios you maintain your own session. Sessions typically store the following:

  • Credentials

  • AWS Region

  • Other configurations related to your profile

Default session#

Boto3 acts as a proxy to the default session. This is created automatically when you create a low-level client or resource client:

import boto3

# Using the default session
sqs = boto3.client('sqs')
s3 = boto3.resource('s3')

Custom session#

You can also manage your own session and create low-level clients or resource clients from it:

import boto3
import boto3.session

# Create your own session
my_session = boto3.session.Session()

# Now we can create low-level clients or resource clients from our custom session
sqs = my_session.client('sqs')
s3 = my_session.resource('s3')

Session configurations#

You can configure each session with specific credentials, AWS Region information, or profiles. The most common configurations you might use are:

  • aws_access_key_id - A specific AWS access key ID.

  • aws_secret_access_key - A specific AWS secret access key.

  • region_name - The AWS Region where you want to create new connections.

  • profile_name - The profile to use when creating your session.


Only set the profile_name parameter when a specific profile is required for your session. To use the default profile, don’t set the profile_name parameter at all. If the profile_name parameter isn’t set and there is no default profile, an empty config dictionary will be used.

For a detailed list of per-session configurations, see the Session core reference.

Multithreading or multiprocessing with sessions#

Similar to Resource objects, Session objects are not thread safe and should not be shared across threads and processes. It’s recommended to create a new Session object for each thread or process:

import boto3
import boto3.session
import threading

class MyTask(threading.Thread):
    def run(self):
        # Here we create a new session per thread
        session = boto3.session.Session()

        # Next, we create a resource client using our thread's session object
        s3 = session.resource('s3')

        # Put your thread-safe code here