YAS3FS (Yet Another S3-backed File System) is a Filesystem in Userspace (FUSE) interface to Amazon S3. It was inspired by s3fs but rewritten from scratch to implement a distributed cache synchronized by Amazon SNS notifications. A web console is provided to easily monitor the nodes of a cluster through the YAS3FS Console project.
If you use YAS3FS please share your experience on the wiki, thanks!
This is a personal project. No relation whatsoever exists between this project and my employer.
Copyright (c) 2012-2014 Danilo Poccia, http://danilop.net
This code is licensed under the The MIT License (MIT). Please see the LICENSE file that accompanies this project for the terms of use.
This is the logical architecture of yas3fs:

I strongly suggest to start yas3fs for the first time with the -df (debug + foreground) options, to see if there is any error.
When everything works it can be interrupted (with ^C) and restarted to run in background
(it's the default with no -f options).
To mount an S3 bucket without using SNS (i.e. for a single node):
yas3fs s3://bucket/path /path/to/mount
To persist file system metadata such as attr/xattr yas3fs is using S3 User Metadata.
To mount an S3 bucket without actually writing metadata in it,
e.g. because it is a bucket you mainly use as a repository and not as a file system,
you can use the --no-metadata option.
To mount an S3 bucket using SNS and listening to an SQS endpoint:
yas3fs s3://bucket/path /path/to/mount --topic TOPIC-ARN --new-queue
To mount an S3 bucket using SNS and listening to an HTTP endpoint (on EC2):
yas3fs s3://bucket/path /path/to/mount --topic TOPIC-ARN --ec2-hostname --port N
On EC2 the security group must allow inbound traffic from SNS on the selected port.
On EC2 the command line doesn't need any information on the actual server and can easily be used within an Auto Scaling group.
Requires Python 2.6 or higher. Install using pip.
pip install yas3fs
If you want to do a quick test here's the installation procedure depending on the OS flavor (Linux or Mac):
--no-metadata option to not use user metadata to persist file system attr/xattr.-h).On Amazon Linux
sudo yum -y install fuse fuse-libs
sudo easy_install pip
sudo pip install yas3fs # assume root installation
sudo sed -i'' 's/^# *user_allow_other/user_allow_other/' /etc/fuse.conf # uncomment user_allow_other
yas3fs -h # See the usage
mkdir LOCAL-PATH
# For single host mount
yas3fs s3://BUCKET/PATH LOCAL-PATH
# For multiple hosts mount
yas3fs s3://BUCKET/PATH LOCAL-PATH --topic TOPIC-ARN --new-queue
On Ubuntu Linux
sudo apt-get update
sudo apt-get -y install fuse python-pip
sudo pip install yas3fs # assume root installation
sudo sed -i'' 's/^# *user_allow_other/user_allow_other/' /etc/fuse.conf # uncomment user_allow_other
sudo chmod a+r /etc/fuse.conf # make it readable by anybody, it is not the default on Ubuntu
yas3fs -h # See the usage
mkdir LOCAL-PATH
# For single host mount
yas3fs s3://BUCKET/PATH LOCAL-PATH
# For multiple hosts mount
yas3fs s3://BUCKET/PATH LOCAL-PATH --topic TOPIC-ARN --new-queue
On a Mac with OS X
Install FUSE for OS X from http://osxfuse.github.com.
sudo pip install yas3fs # assume root installation
mkdir LOCAL-PATH
# For single host mount
yas3fs s3://BUCKET/PATH LOCAL-PATH
# For multiple hosts mount
yas3fs s3://BUCKET/PATH LOCAL-PATH --topic TOPIC-ARN --new-queue
To listen to SNS HTTP notifications (I usually suggest to use SQS instead) with a Mac you need to install the Python M2Crypto module, download the most suitable "egg" from http://chandlerproject.org/Projects/MeTooCrypto#Downloads.
sudo easy_install M2Crypto-*.egg
If something does not work as expected you can use the -df options to run in foreground and in debug mode.
Unmount
To unmount the file system on Linux:
fusermount -u LOCAL-PATH
To unmount the file system on a Mac you can use umount.
yas3fs -h
usage: yas3fs [-h] [--region REGION] [--topic ARN] [--new-queue]
[--new-queue-with-hostname] [--queue NAME]
[--queue-wait N] [--queue-polling N] [--nonempty]
[--hostname HOSTNAME] [--use-ec2-hostname] [--port N]
[--cache-entries N] [--cache-mem-size N] [--cache-disk-size N]
[--cache-path PATH] [--recheck-s3] [--cache-on-disk N] [--cache-check N]
[--s3-num N] [--download-num N] [--prefetch-num N] [--st-blksize N]
[--buffer-size N] [--buffer-prefetch N] [--no-metadata]
[--prefetch] [--mp-size N] [--mp-num N] [--mp-retries N]
[--s3-retries N] [--s3-retries-sleep N]
[--aws-managed-encryption]
[--no-allow-other]
[--download-retries-num N] [--download-retries-sleep N]
[--read-retries-num N] [--read-retries-sleep N]
[--id ID] [--mkdir] [--uid N] [--gid N] [--umask MASK]
[--read-only] [--expiration N] [--requester-pays]
[--with-plugin-file FILE] [--with-plugin-class CLASS]
[-l FILE]
[--log-mb-size N] [--log-backup-count N] [--log-backup-gzip]
[-f] [-d] [-V]
S3Path LocalPath
YAS3FS (Yet Another S3-backed File System) is a Filesystem in Userspace (FUSE)
interface to Amazon S3. It allows to mount an S3 bucket (or a part of it, if
you specify a path) as a local folder. It works on Linux and Mac OS X. For
maximum speed all data read from S3 is cached locally on the node, in memory
or on disk, depending of the file size. Parallel multi-part downloads are used
if there are reads in the middle of the file (e.g. for streaming). Parallel
multi-part uploads are used for files larger than a specified size. With
buffering enabled (the default) files can be accessed during the download from
S3 (e.g. for streaming). It can be used on more than one node to create a
"shared" file system (i.e. a yas3fs "cluster"). SNS notifications are used to
update other nodes in the cluster that something has changed on S3 and they
need to invalidate their cache. Notifications can be delivered to HTTP or SQS
endpoints. If the cache grows to its maximum size, the less recently accessed
files are removed. Signed URLs are provided through Extended file attributes
(xattr). AWS credentials can be passed using AWS_ACCESS_KEY_ID and
AWS_SECRET_ACCESS_KEY environment variables. In an EC2 instance a IAM role can
be used to give access to S3/SNS/SQS resources. AWS_DEFAULT_REGION environment
variable can be used to set the default AWS region.
positional arguments:
S3Path the S3 path to mount in s3://BUCKET/PATH format, PATH
can be empty, can contain subfolders and is created on
first mount if not found in the BUCKET
LocalPath the local mount point
optional arguments:
-h, --help show this help message and exit
--region REGION AWS region to use for SNS and SQS (default is eu-
west-1)
--topic ARN SNS topic ARN
--new-queue create a new SQS queue that is deleted on unmount to
listen to SNS notifications, overrides --queue, queue
name is BUCKET-PATH-ID with alphanumeric characters
only
--new-queue-with-hostname
create a new SQS queue with hostname in queuename,
overrides --queue, queue name is BUCKET-PATH-ID with
alphanumeric characters only
--queue NAME SQS queue name to listen to SNS notifications, a new
queue is created if it doesn't exist
--queue-wait N SQS queue wait time in seconds (using long polling, 0
to disable, default is 20 seconds)
--queue-polling N SQS queue polling interval in seconds (default is 0
seconds)
--hostname HOSTNAME public hostname to listen to SNS HTTP notifications
--use-ec2-hostname get public hostname to listen to SNS HTTP notifications
from EC2 instance metadata (overrides --hostname)
--port N TCP port to listen to SNS HTTP notifications
--cache-entries N max number of entries to cache (default is 100000
entries)
--cache-mem-size N max size of the memory cache in MB (default is 128 MB)
--cache-disk-size N max size of the disk cache in MB (default is 1024 MB)
--cache-path PATH local path to use for disk cache (default is
/tmp/yas3fs/BUCKET/PATH)
--recheck-s3 Cache ENOENT results in forced recheck of S3 for new file/directory
--cache-on-disk N use disk (instead of memory) cache for files greater
than the given size in bytes (default is 0 bytes)
--cache-check N interval between cache size checks in seconds (default
is 5 seconds)
--s3-num N number of parallel S3 calls (0 to disable writeback,
default is 32)
--s3-retries N number of retries for s3 write operations (default 3)
--s3-retries-sleep N number of seconds between retries for s3 write operations (default 1)
--download-num N number of parallel downloads (default is 4)
--download-retries-num N max number of retries when downloading (default is 60)
--download-retries-sleep N how long to sleep in seconds between download retries (default is 1)
--read-retries-num N max number of retries when read() is invoked (default is 10)
--read-retries-sleep N how long to sleep in seconds between read() retries (default is 1)
--prefetch-num N number of parallel prefetching downloads (default is 2)
--st-blksize N st_blksize to return to getattr() callers in bytes, optional
--nonempty allows mounts over a non-empty file or directory
--buffer-size N download buffer size in KB (0 to disable buffering,
default is 10240 KB)
--buffer-prefetch N number of buffers to prefetch (default is 0)
--no-metadata don't write user metadata on S3 to persist file system
attr/xattr
--prefetch download file/directory content as soon as it is
discovered (doesn't download file content if download
buffers are used)
--mp-size N size of parts to use for multipart upload in MB
(default value is 100 MB, the minimum allowed by S3 is
5 MB)
--mp-num N max number of
$ claude mcp add yas3fs \
-- python -m otcore.mcp_server <graph>