Advanced Topics | Getting more out of Elm#
We believe that Elm should be simple to use, though we understand that the way people create, access, and share data can vary quite a bit. This page is intended to address some scenarios that might be beyond the scope of an average user but might provide extended utility to advanced (or simply curious!) power users of Elm.
Deleting Files#
Note
Elm is primarily intended for writing, not deleting data. A key element of Elm's design is protecting data from accidental deletion. Elm deliberately requires more steps to delete data than to write it, encouraging thoughtful data management. When deletions must happen, version control ensures that permanent deletions are intentional and targeted.
Elm is specifically designed to provide affordable long-term data storage, making permanent data deletion a rare occurrence. By default, bucket versioning is enabled on Elm, ensuring that you can delete an object version and restore it later if necessary. However, in some cases, it may be required to permanently remove data. Examples of such cases include:
- Wrong data was uploaded and needs to be removed to correct the error
- The data is confirmed to be no longer needed, such as outdated backups or redundant information
- Storage optimization efforts require the deletion of obsolete or unnecessary files to free up space
- Other legal or compliance reasons
- In these instances, careful consideration should be given before permanently deleting the data on Elm
- Permanently deleting files from the UI can be tedious
Versioning is currently turned on by default, and there may be certain versions you want to delete. For that reason, using the CLI to delete files from your bucket can be accomplished using the following tools.
Choosing the Right Tool#
| Tool | Description | Best For | Links |
|---|---|---|---|
mc rm | MinIO client command line utility | Removing specific files and versions quickly | MinIO MC Reference GitHub MinIO Client (mc) |
rclone delete | Permanently delete objects with rclone tool | Automating deletions with scripting and advanced filtering | RClone Delete GitHub RClone Delete |
boto3 | The official AWS SDK for Python | Programmatic and API-based deletion | How do I delete a Versioned Bucket in AWS S3 Using the CLI |
Using mc rm#
NOTE: Before running any commands, please visit the MinIO Client Setup page to ensure everything is configured correctly.
The MinIO client (mc) allows you to remove files or specific versions from your bucket. You can delete a file by specifying the file path and version ID if needed.
mc is available on Sherlock with the minio-client module
$ module load system minio-client
$ mc --version
mc version RELEASE.2025-07-15T21-10-32Z (commit-id=8f7863f6a9d0dd624b06cfad7ba8ef92907da3c3)
Runtime: go1.24.5 linux/amd64
Copyright (c) 2015-2025 MinIO, Inc.
MinIO Enterprise License
List all versions of files in the bucket:#
$ mc ls --versions my-elm/rc-test
[2025-03-11 12:14:07 PDT] 1.3MiB STANDARD b7affb77-e8c6-4d6f-8f85-91742584a9fd v2 PUT background-SU-01.jpg
[2025-03-11 12:04:49 PDT] 1.3MiB STANDARD 74fbad21-3bce-45dc-a8dd-a36ecbbe7c2b v1 PUT background-SU-01.jpg
Perform a dry-run to delete all files in a directory#
mc rm --recursive --versions --force my-elm/rc-test/commands/ --dry-run
DRYRUN: Removing `my-elm/rc-test/commands/background-SU-01.jpg` (versionId=1a3cf8e1-82c9-44f5-9de8-fcc9ecdfec2f) (modTime=2025-04-08 22:46:21 UTC).
DRYRUN: Removing `my-elm/rc-test/commands/background-SU-02.jpg` (versionId=1d7704be-00d7-4cb0-b270-137f2b016cfc) (modTime=2025-04-08 22:46:21 UTC).
DRYRUN: Removing `my-elm/rc-test/commands/background-SU-03.jpg` (versionId=f129dd95-2ea8-4a11-a246-5b086f50c613) (modTime=2025-04-08 22:46:21 UTC).
DRYRUN: Removing `my-elm/rc-test/commands/background-SU-04.jpg` (versionId=63dcca6e-d39d-4f2f-9dbe-198b5507a397) (modTime=2025-04-08 22:46:21 UTC).
Delete all files in a directory#
mc rm --recursive --versions --force my-elm/rc-test/commands/
Removed `my-elm/rc-test/commands/background-SU-01.jpg` (versionId=1a3cf8e1-82c9-44f5-9de8-fcc9ecdfec2f).
Removed `my-elm/rc-test/commands/background-SU-02.jpg` (versionId=1d7704be-00d7-4cb0-b270-137f2b016cfc).
Removed `my-elm/rc-test/commands/background-SU-03.jpg` (versionId=f129dd95-2ea8-4a11-a246-5b086f50c613).
Removed `my-elm/rc-test/commands/background-SU-04.jpg` (versionId=63dcca6e-d39d-4f2f-9dbe-198b5507a397).
Perform a dry-run to delete ALL files and ALL directories in your bucket (Perform with caution)#
$ mc rm --recursive --force --versions my-elm/rc-test --dry-run
DRYRUN: Removing `my-elm/rc-test/Logo on Left.png` (versionId=b89269c3-3775-4038-97c8-c52617df2f62) (modTime=2025-04-07 20:07:01 UTC).
DRYRUN: Removing `my-elm/rc-test/Logo on Left.png` (versionId=24fe2527-ef3b-4c46-8a6d-0daae6fc915a) (modTime=2025-03-31 17:52:36 UTC).
...
DRYRUN: Removing `my-elm/rc-test/rclone-v1.69.1-osx-arm64/rclone.1` (versionId=ca0fc340-917f-44a5-8565-553b97c9d0dc) (modTime=2025-04-07 20:10:49 UTC).
Delete ALL files and ALL directories in your bucket (Perform with caution)#
mc rm --recursive --force --versions my-elm/rc-test
Removed `my-elm/rc-test/Logo on Left.png` (versionId=b89269c3-3775-4038-97c8-c52617df2f62).
Removed `my-elm/rc-test/Logo on Left.png` (versionId=24fe2527-ef3b-4c46-8a6d-0daae6fc915a).
...
Removed `my-elm/rc-test/rclone-v1.69.1-osx-arm64/rclone.1` (versionId=ca0fc340-917f-44a5-8565-553b97c9d0dc).
Perform a dry-run to delete a specific file version#
$ mc rm --version-id 74fbad21-3bce-45dc-a8dd-a36ecbbe7c2b my-elm/rc-test/background-SU-01.jpg --dry-run
DRYRUN: Removing `my-elm/rc-test/background-SU-01.jpg` (versionId=74fbad21-3bce-45dc-a8dd-a36ecbbe7c2b).
Delete the versioned file permanently#
$ mc rm --version-id 74fbad21-3bce-45dc-a8dd-a36ecbbe7c2b my-elm/rc-test/background-SU-01.jpg
Removed `my-elm/rc-test/background-SU-01.jpg` (versionId=74fbad21-3bce-45dc-a8dd-a36ecbbe7c2b).
Perform a dry-run to remove files that are not the latest version#
$ mc rm --non-current --versions --recursive --force my-elm/rc-test --dry-run
DRYRUN: Removing `my-elm/rc-test/background-SU-01.jpg` (versionId=73450eed-0c5d-488f-ab10-5b784e84eb28) (modTime=2025-03-17 20:48:21 UTC).
DRYRUN: Removing `my-elm/rc-test/background-SU-01.jpg` (versionId=33bc1629-a4ff-463b-8332-38ebeed2c372) (modTime=2025-03-17 18:52:07 UTC).
...
DRYRUN: Removing `my-elm/rc-test/background-SU-04.jpg` (versionId=f2cc7c7f-493f-41bf-b82f-1561ab9cd934) (modTime=2025-03-17 20:48:21 UTC).
DRYRUN: Removing `my-elm/rc-test/delete_me/background-SU-01.jpg` (versionId=413bdec3-0820-4644-809d-b5ba589c3645) (modTime=2025-03-18 19:38:05 UTC).
...
DRYRUN: Removing `my-elm/rc-test/delete_me/rclone-v1.69.1-osx-arm64.zip` (versionId=7e20ac42-69a7-4332-85cc-fd138e873163) (modTime=2025-03-17 20:48:21 UTC).
DRYRUN: Removing `my-elm/rc-test/rclone-v1.69.1-osx-arm64.zip` (versionId=b0e6de73-a60d-44d5-83e7-050b89bbb7ba) (modTime=2025-03-17 20:48:21 UTC).
Remove files that are not the latest version#
$ mc rm --non-current --versions --recursive --force my-elm/rc-test
Removed `my-elm/rc-test/background-SU-01.jpg` (versionId=73450eed-0c5d-488f-ab10-5b784e84eb28) (modTime=2025-03-17 20:48:21 UTC).
Removed `my-elm/rc-test/background-SU-01.jpg` (versionId=33bc1629-a4ff-463b-8332-38ebeed2c372) (modTime=2025-03-17 18:52:07 UTC).
...
Removed `my-elm/rc-test/background-SU-04.jpg` (versionId=f2cc7c7f-493f-41bf-b82f-1561ab9cd934) (modTime=2025-03-17 20:48:21 UTC).
Removed `my-elm/rc-test/delete_me/background-SU-01.jpg` (versionId=413bdec3-0820-4644-809d-b5ba589c3645) (modTime=2025-03-18 19:38:05 UTC).
...
Removed `my-elm/rc-test/delete_me/rclone-v1.69.1-osx-arm64.zip` (versionId=7e20ac42-69a7-4332-85cc-fd138e873163) (modTime=2025-03-17 20:48:21 UTC).
Removed `my-elm/rc-test/rclone-v1.69.1-osx-arm64.zip` (versionId=b0e6de73-a60d-44d5-83e7-050b89bbb7ba) (modTime=2025-03-17 20:48:21 UTC).
Perform a dry-run to remove files that are older than a specified age ([m]inutes, [h]ours, [d]ays, [w]eeks)#
$ mc rm --older-than 1d --versions --recursive --force my-elm/rc-test --dry-run
DRYRUN: Removing `my-elm/rc-test/background-SU-01.jpg` (versionId=1c294848-0d1d-4d33-bff1-62a645f8d6d4) (modTime=2025-03-17 21:48:18 UTC).
DRYRUN: Removing `my-elm/rc-test/background-SU-01.jpg` (versionId=73450eed-0c5d-488f-ab10-5b784e84eb28) (modTime=2025-03-17 20:48:21 UTC).
DRYRUN: Removing `my-elm/rc-test/background-SU-01.jpg` (versionId=33bc1629-a4ff-463b-8332-38ebeed2c372) (modTime=2025-03-17 18:52:07 UTC).
DRYRUN: Removing `my-elm/rc-test/background-SU-01.jpg` (versionId=b4fabd42-0a3d-4bf7-88bf-4c762db1c711) (modTime=2025-03-17 16:26:44 UTC).
...
DRYRUN: Removing `my-elm/rc-test/background-SU-04.jpg` (versionId=feea8850-3c39-4b09-8da0-6a6ca75b55d1) (modTime=2025-03-17 16:26:44 UTC).
DRYRUN: Removing `my-elm/rc-test/delete_me/background-SU-01.jpg` (versionId=1f47f195-bd55-4556-8fa8-e5c6e558e90a) (modTime=2025-03-18 19:48:10 UTC).
DRYRUN: Removing `my-elm/rc-test/delete_me/background-SU-01.jpg` (versionId=413bdec3-0820-4644-809d-b5ba589c3645) (modTime=2025-03-18 19:38:05 UTC).
...
DRYRUN: Removing `my-elm/rc-test/delete_me/background-SU-04.jpg` (versionId=8e8cd913-10e6-4e4b-a35d-350a8400da5b) (modTime=2025-03-18 19:38:05 UTC).
DRYRUN: Removing `my-elm/rc-test/delete_me/rclone-v1.69.1-osx-arm64.zip` (versionId=c41bf01f-60fa-4159-bb5d-43a7d2e1a83d) (modTime=2025-03-18 17:44:38 UTC).
...
DRYRUN: Removing `my-elm/rc-test/rclone-v1.69.1-osx-arm64.zip` (versionId=ff5d8092-929d-4804-bca7-c66e99ee420e) (modTime=2025-03-17 16:26:51 UTC).
Remove files that are older than a specified age ([m]inutes, [h]ours, [d]ays, [w]eeks)#
$ mc rm --older-than 1d --versions --recursive --force my-elm/rc-test
Removed `my-elm/rc-test/background-SU-01.jpg` (versionId=1c294848-0d1d-4d33-bff1-62a645f8d6d4) (modTime=2025-03-17 21:48:18 UTC).
Removed `my-elm/rc-test/background-SU-01.jpg` (versionId=73450eed-0c5d-488f-ab10-5b784e84eb28) (modTime=2025-03-17 20:48:21 UTC).
Removed `my-elm/rc-test/background-SU-01.jpg` (versionId=33bc1629-a4ff-463b-8332-38ebeed2c372) (modTime=2025-03-17 18:52:07 UTC).
Removed `my-elm/rc-test/background-SU-01.jpg` (versionId=b4fabd42-0a3d-4bf7-88bf-4c762db1c711) (modTime=2025-03-17 16:26:44 UTC).
...
Removed `my-elm/rc-test/background-SU-04.jpg` (versionId=feea8850-3c39-4b09-8da0-6a6ca75b55d1) (modTime=2025-03-17 16:26:44 UTC).
Removed `my-elm/rc-test/delete_me/background-SU-01.jpg` (versionId=1f47f195-bd55-4556-8fa8-e5c6e558e90a) (modTime=2025-03-18 19:48:10 UTC).
Removed `my-elm/rc-test/delete_me/background-SU-01.jpg` (versionId=413bdec3-0820-4644-809d-b5ba589c3645) (modTime=2025-03-18 19:38:05 UTC).
...
Removed `my-elm/rc-test/delete_me/background-SU-04.jpg` (versionId=8e8cd913-10e6-4e4b-a35d-350a8400da5b) (modTime=2025-03-18 19:38:05 UTC).
Removed `my-elm/rc-test/delete_me/rclone-v1.69.1-osx-arm64.zip` (versionId=c41bf01f-60fa-4159-bb5d-43a7d2e1a83d) (modTime=2025-03-18 17:44:38 UTC).
...
Removed `my-elm/rc-test/rclone-v1.69.1-osx-arm64.zip` (versionId=ff5d8092-929d-4804-bca7-c66e99ee420e) (modTime=2025-03-17 16:26:51 UTC).
Perform a dry-run to remove files that are newer than a specified age ([m]inutes, [h]ours, [d]ays, [w]eeks)#
$ mc rm --newer-than 5d --versions --recursive --force my-elm/rc-test --dry-run
DRYRUN: Removing `my-elm/rc-test/background-SU-01.jpg` (versionId=b6cee344-5248-4b8b-9e30-876f6ce70922) (modTime=2025-03-20 20:13:04 UTC).
DRYRUN: Removing `my-elm/rc-test/background-SU-02.jpg` (versionId=7dd1e3ae-0c92-479d-9100-253f682798c5) (modTime=2025-03-20 20:13:04 UTC).
DRYRUN: Removing `my-elm/rc-test/background-SU-03.jpg` (versionId=cc8a8781-9db4-41bf-a036-86717e4b3ef9) (modTime=2025-03-20 20:13:04 UTC).
DRYRUN: Removing `my-elm/rc-test/background-SU-04.jpg` (versionId=2cfad961-fd58-43d3-96f5-fcb56db32e20) (modTime=2025-03-20 20:13:04 UTC).
DRYRUN: Removing `my-elm/rc-test/delete_me/background-SU-01.jpg` (versionId=2f13585d-1524-47a4-b7df-e71b709a52fb) (modTime=2025-03-20 20:14:11 UTC).
DRYRUN: Removing `my-elm/rc-test/delete_me/background-SU-02.jpg` (versionId=ea0b8a70-2b19-478b-ba1c-a8289fd7c6a2) (modTime=2025-03-20 20:14:11 UTC).
DRYRUN: Removing `my-elm/rc-test/delete_me/background-SU-03.jpg` (versionId=68d761fd-83df-43a3-a26c-30dd0a627dcd) (modTime=2025-03-20 20:14:11 UTC).
DRYRUN: Removing `my-elm/rc-test/delete_me/background-SU-04.jpg` (versionId=f26ade6f-51b2-4f67-84ca-9c1e5999701d) (modTime=2025-03-20 20:14:11 UTC).
DRYRUN: Removing `my-elm/rc-test/rclone-v1.69.1-osx-arm64.zip` (versionId=4d5f2fd0-a0b5-4f17-8837-89d893bd309c) (modTime=2025-03-20 20:13:11 UTC).
Remove files that are newer than a specified age ([m]inutes, [h]ours, [d]ays, [w]eeks)#
mc rm --newer-than 5d --versions --recursive --force my-elm/rc-test
Removed `my-elm/rc-test/background-SU-01.jpg` (versionId=b6cee344-5248-4b8b-9e30-876f6ce70922) (modTime=2025-03-20 20:13:04 UTC).
Removed `my-elm/rc-test/background-SU-02.jpg` (versionId=7dd1e3ae-0c92-479d-9100-253f682798c5) (modTime=2025-03-20 20:13:04 UTC).
Removed `my-elm/rc-test/background-SU-03.jpg` (versionId=cc8a8781-9db4-41bf-a036-86717e4b3ef9) (modTime=2025-03-20 20:13:04 UTC).
Removed `my-elm/rc-test/background-SU-04.jpg` (versionId=2cfad961-fd58-43d3-96f5-fcb56db32e20) (modTime=2025-03-20 20:13:04 UTC).
Removed `my-elm/rc-test/delete_me/background-SU-01.jpg` (versionId=2f13585d-1524-47a4-b7df-e71b709a52fb) (modTime=2025-03-20 20:14:11 UTC).
Removed `my-elm/rc-test/delete_me/background-SU-02.jpg` (versionId=ea0b8a70-2b19-478b-ba1c-a8289fd7c6a2) (modTime=2025-03-20 20:14:11 UTC).
Removed `my-elm/rc-test/delete_me/background-SU-03.jpg` (versionId=68d761fd-83df-43a3-a26c-30dd0a627dcd) (modTime=2025-03-20 20:14:11 UTC).
Removed `my-elm/rc-test/delete_me/background-SU-04.jpg` (versionId=f26ade6f-51b2-4f67-84ca-9c1e5999701d) (modTime=2025-03-20 20:14:11 UTC).
Removed `my-elm/rc-test/rclone-v1.69.1-osx-arm64.zip` (versionId=4d5f2fd0-a0b5-4f17-8837-89d893bd309c) (modTime=2025-03-20 20:13:11 UTC).
Using rclone delete#
NOTE: Before running any commands, please visit the MinIO Client Setup page to ensure everything is configured correctly.
Rclone allows for bulk deletion and scripting, particularly useful when working with large sets of files.
List files and their versions#
$ rclone lsf --s3-versions my-elm:rc-test
background-SU-01-v2025-03-11-191407-850.jpg
background-SU-01.jpg
background-SU-02-v2025-03-11-190449-040.jpg
Perform a dry-run deletion of a single file#
$ rclone delete --s3-versions my-elm:rc-test/background-SU-01-v2025-03-11-191407-850.jpg --dry-run
2025/03/11 13:04:13 NOTICE: background-SU-01-v2025-03-11-191407-850.jpg: Skipped delete as --dry-run is set (size 1.273Mi)
Delete the versioned file permanently#
$ rclone delete --s3-versions my-elm:rc-test/background-SU-01-v2025-03-11-191407-850.jpg
Perform a dry-run deletion of a directory and all of its files#
$ rclone delete --s3-versions --rmdirs my-elm:rc-test/delete_me --dry-run
2025/03/18 11:18:12 NOTICE: background-SU-01.jpg: Skipped delete as --dry-run is set (size 1.273Mi)
2025/03/18 11:18:12 NOTICE: background-SU-04.jpg: Skipped delete as --dry-run is set (size 1.974Mi)
2025/03/18 11:18:12 NOTICE: rclone-v1.69.1-osx-arm64.zip: Skipped delete as --dry-run is set (size 23.675Mi)
2025/03/18 11:18:12 NOTICE: background-SU-02.jpg: Skipped delete as --dry-run is set (size 1.116Mi)
2025/03/18 11:18:12 NOTICE: background-SU-03.jpg: Skipped delete as --dry-run is set (size 1.633Mi)
Delete a directory and all of its files#
$ rclone delete --s3-versions --rmdirs my-elm:rc-test/delete_me
Using boto3#
For Python users, the boto3 SDK allows programmatic deletion, uploads, and downloads of objects in an S3-compatible storage system.
Delete a file:
#!/usr/bin/env python3
import boto3
import logging
import os
from botocore.exceptions import ClientError
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Load Elm MinIO credentials from environment variables (similar to AWS)
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID')
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
if not aws_access_key_id or not aws_secret_access_key:
logging.error("AWS credentials not found in environment variables.")
exit(1)
# Configure S3 resource
s3 = boto3.resource('s3',
endpoint_url='https://campus.elm.stanford.edu:9000',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key)
bucket_name = 'rc-test'
def delete_file_from_s3(bucket, file_key):
"""Delete a specific file from the specified S3 bucket."""
try:
obj = s3.Object(bucket, file_key)
obj.delete()
logging.info(f"Deleted file: {file_key} from bucket: {bucket}")
except ClientError as e:
logging.error(f"Failed to delete {file_key} from bucket {bucket}. Error: {e}")
except Exception as e:
logging.error(f"An unexpected error occurred: {e}")
# Specify the file to delete
file_to_delete = 'boto3_test/version_list.txt' # Replace with the actual file key
# Execute deletion
delete_file_from_s3(bucket_name, file_to_delete)
Moving Files - Upload to your bucket#
#!/usr/bin/env python3
import boto3
import logging
import os
from botocore.exceptions import ClientError
from botocore.client import Config
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Load Elm MinIO credentials from environment variables (similar to AWS)
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID')
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
if not aws_access_key_id or not aws_secret_access_key:
logging.error("AWS credentials not found in environment variables.")
exit(1)
# Configure S3 resource
config = Config(signature_version='s3v4',
s3={'chunk_size': 5 * 1024 * 1024 * 1024} # 5 GiB in bytes
)
s3 = boto3.resource('s3',
endpoint_url='https://campus.elm.stanford.edu:9000',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
config=config)
bucket_name = 'rc-test'
file_to_upload = 'MinIO.txt'
upload_location = 'boto3_test/MinIO.txt'
def upload_file_to_s3(file_name, bucket, object_name):
""" Upload a file to an S3 bucket. """
try:
s3.Bucket(bucket).upload_file(file_name, object_name)
logging.info(f"Uploaded: {file_name} to {bucket}/{object_name}")
except ClientError as e:
logging.error(f"Failed to upload {file_name} to {bucket}/{object_name}. Error: {e}")
# Execute upload
upload_file_to_s3(file_to_upload, bucket_name, upload_location)
Moving Files - Download files from your bucket#
#!/usr/bin/env python3
import boto3
import logging
import os
from pathlib import Path
from botocore.exceptions import ClientError
from botocore.client import Config
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Load Elm MinIO credentials from environment variables (similar to AWS)
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID')
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
if not aws_access_key_id or not aws_secret_access_key:
logging.error("AWS credentials not found in environment variables.")
exit(1)
# Configure S3 resource
config = Config(signature_version='s3v4')
s3 = boto3.resource('s3',
endpoint_url='https://campus.elm.stanford.edu:9000',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
config=config)
# Variables
bucket_name = 'rc-test'
file_to_download = 'vnwong.tar'
save_file_to_path = Path.home() / 'Documents/boto3_test' / 'test_vnwong.tar'
def download_file_from_s3(bucket, object_name, file_path):
"""Download a file from an S3 bucket."""
try:
# Ensure the directory exists
file_path.parent.mkdir(parents=True, exist_ok=True)
s3.Bucket(bucket).download_file(object_name, str(file_path))
logging.info(f"Downloaded: {object_name} to {file_path}")
except ClientError as e:
logging.error(f"Failed to download {object_name} from {bucket}. Error: {e}")
except Exception as e:
logging.error(f"An error occurred: {e}")
# Execute download
download_file_from_s3(bucket_name, file_to_download, save_file_to_path)