base on FUSE-based file system backed by Amazon S3 # s3fs s3fs allows Linux, macOS, and FreeBSD to mount an S3 bucket via [FUSE(Filesystem in Userspace)](https://github.com/libfuse/libfuse). s3fs makes you operate files and directories in S3 bucket like a local file system. s3fs preserves the native object format for files, allowing use of other tools like [AWS CLI](https://github.com/aws/aws-cli). [![s3fs-fuse CI](https://github.com/s3fs-fuse/s3fs-fuse/actions/workflows/ci.yml/badge.svg)](https://github.com/s3fs-fuse/s3fs-fuse/actions/workflows/ci.yml) [![Twitter Follow](https://img.shields.io/twitter/follow/s3fsfuse.svg?style=social&label=Follow)](https://twitter.com/s3fsfuse) ![s3fs-fuse](https://github.com/ggtakec/s3fs-fuse-images/blob/master/images/s3fslogo.png) ## Features * large subset of POSIX including reading/writing files, directories, symlinks, mode, uid/gid, and extended attributes * compatible with Amazon S3, and other [S3-based object stores](https://github.com/s3fs-fuse/s3fs-fuse/wiki/Non-Amazon-S3) * allows random writes and appends * large files via multi-part upload * renames via server-side copy * optional server-side encryption * data integrity via MD5 hashes * in-memory metadata caching * local disk data caching * user-specified regions, including Amazon GovCloud * authenticate via v2 or v4 signatures ## Installation Many systems provide pre-built packages: * Amazon Linux via EPEL: ``` sudo amazon-linux-extras install epel sudo yum install s3fs-fuse ``` * Arch Linux: ``` sudo pacman -S s3fs-fuse ``` * Debian 9 and Ubuntu 16.04 or newer: ``` sudo apt install s3fs ``` * Fedora 27 or newer: ``` sudo dnf install s3fs-fuse ``` * Gentoo: ``` sudo emerge net-fs/s3fs ``` * RHEL and CentOS 7 or newer via EPEL: ``` sudo yum install epel-release sudo yum install s3fs-fuse ``` * SUSE 12 and openSUSE 42.1 or newer: ``` sudo zypper install s3fs ``` * macOS 10.12 and newer via [Homebrew](https://brew.sh/): ``` brew install --cask macfuse brew install gromgit/fuse/s3fs-mac ``` * FreeBSD: ``` pkg install fusefs-s3fs ``` * Windows: Windows has its own install, seening in [this link](COMPILATION.md) Otherwise consult the [compilation instructions](COMPILATION.md). ## Examples s3fs supports the standard [AWS credentials file](https://docs.aws.amazon.com/cli/latest/userguide/cli-config-files.html) stored in `${HOME}/.aws/credentials`. Alternatively, s3fs supports a custom passwd file. Finally s3fs recognizes the `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_SESSION_TOKEN` environment variables. The default location for the s3fs password file can be created: * using a `.passwd-s3fs` file in the users home directory (i.e. `${HOME}/.passwd-s3fs`) * using the system-wide `/etc/passwd-s3fs` file Enter your credentials in a file `${HOME}/.passwd-s3fs` and set owner-only permissions: ``` echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3fs chmod 600 ${HOME}/.passwd-s3fs ``` Run s3fs with an existing bucket `mybucket` and directory `/path/to/mountpoint`: ``` s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs ``` If you encounter any errors, enable debug output: ``` s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs -o dbglevel=info -f -o curldbg ``` You can also mount on boot by entering the following line to `/etc/fstab`: ``` mybucket /path/to/mountpoint fuse.s3fs _netdev,allow_other 0 0 ``` If you use s3fs with a non-Amazon S3 implementation, specify the URL and path-style requests: ``` s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs -o url=https://url.to.s3/ -o use_path_request_style ``` or(fstab) ``` mybucket /path/to/mountpoint fuse.s3fs _netdev,allow_other,use_path_request_style,url=https://url.to.s3/ 0 0 ``` Note: You may also want to create the global credential file first ``` echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > /etc/passwd-s3fs chmod 600 /etc/passwd-s3fs ``` Note2: You may also need to make sure `netfs` service is start on boot ## Limitations Generally S3 cannot offer the same performance or semantics as a local file system. More specifically: * random writes or appends to files require rewriting the entire object, optimized with multi-part upload copy * metadata operations such as listing directories have poor performance due to network latency * non-AWS providers may have [eventual consistency](https://en.wikipedia.org/wiki/Eventual_consistency) so reads can temporarily yield stale data (AWS offers read-after-write consistency [since Dec 2020](https://aws.amazon.com/about-aws/whats-new/2020/12/amazon-s3-now-delivers-strong-read-after-write-consistency-automatically-for-all-applications/)) * no atomic renames of files or directories * no coordination between multiple clients mounting the same bucket * no hard links * inotify detects only local modifications, not external ones by other clients or tools ## References * [CSI for S3](https://github.com/ctrox/csi-s3) - Kubernetes CSI driver * [docker-s3fs-client](https://github.com/efrecon/docker-s3fs-client) - Docker image containing s3fs * [goofys](https://github.com/kahing/goofys) - similar to s3fs but has better performance and less POSIX compatibility * [s3backer](https://github.com/archiecobbs/s3backer) - mount an S3 bucket as a single file * [S3Proxy](https://github.com/gaul/s3proxy) - combine with s3fs to mount Backblaze B2, EMC Atmos, Microsoft Azure, and OpenStack Swift buckets * [s3ql](https://github.com/s3ql/s3ql/) - similar to s3fs but uses its own object format * [YAS3FS](https://github.com/danilop/yas3fs) - similar to s3fs but uses SNS to allow multiple clients to mount a bucket ## Frequently Asked Questions * [FAQ wiki page](https://github.com/s3fs-fuse/s3fs-fuse/wiki/FAQ) * [s3fs on Stack Overflow](https://stackoverflow.com/questions/tagged/s3fs) * [s3fs on Server Fault](https://serverfault.com/questions/tagged/s3fs) ## License Copyright (C) 2010 Randy Rizun <[email protected]> Licensed under the GNU GPL version 2 ", Assign "at most 3 tags" to the expected json: {"id":"10713","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"