Skip to content

AWS S3 Provider

AWS S3 Bucket is a cloud storage solution for data storage and retrieval that is highly available, secure, durable, and scalable. cshelve can be configured to use AWS S3 Bucket as a provider for storing and retrieving data.

To install the cshelve package with AWS S3 support, run the following command:

Terminal window
pip install cshelve[aws-s3]

The following table lists the configuration options available for the AWS S3 provider:

ScopeOptionDescriptionRequired
defaultbucket_nameThe name of the S3 Bucket.Yes
defaultauth_typeThe authentication method to use: access_key.Yes
defaultkey_idThe AWS key ID.Yes
defaultkey_secretThe AWS key secret.Yes

Depending on the open flag, the permissions required by cshelve for S3 storage vary:

FlagDescriptionPermissions Needed
rOpen an existing S3 bucket for reading only.AmazonS3ReadOnlyAccess
wOpen an existing S3 bucket for reading and writing.AmazonS3ReadWriteAccess
cOpen an S3 bucket for reading and writing, creating it if needed.AmazonS3FullAccess
nPurge the S3 bucket before using it.AmazonS3FullAccess

Currently, only Access Key authentication is supported. The secret can be set as an environment variable, and the key must be defined in the configuration.

Terminal window
cat access-key.ini
[default]
provider = aws-s3
bucket_name = cshelve
auth_type = access_key
# Here the environment variable containing the key is named AWS_KEY_ID and the secret AWS_KEY_SECRET.
key_id = $AWS_KEY_ID
key_secret = $AWS_KEY_SECRET

Behind the scenes, this provider uses the Boto3 Client. Users can pass specific parameters using the provider_params parameter of the cshelve.open function and in the configuration file.

Here is an example where endpoint_url is specified using provider_params:

import cshelve
provider_params = {'endpoint_url': 'http://localhost:9000'}
with cshelve.open('aws-s3.ini', provider_params=provider_params) as db:
...

Here is an example where endpoint_url is specified using the configuration file:

Terminal window
cat aws-s3.ini
[default]
provider = aws-s3
bucket_name = cshelve
auth_type = access_key
key_id = $AWS_KEY_ID
key_secret = $AWS_KEY_SECRET
[provider_params]
endpoint_url = "http://localhost:9000"
import cshelve
with cshelve.open('aws-s3.ini') as db:
...

This provider doesn’t raise cshelve.KeyNotFoundError when attempting to delete a non-existing key. This behavior is consistent with the AWS S3 API, which does not report errors when deleting non-existing objects. Implementing consistent behavior in CShelve to raise KeyNotFoundError for non-existing keys would require additional verification before deletion, which would negatively impact performance.