How to Mount S3 bucket on EC2 Linux Instance

A S3 bucket can be mounted in a AWS instance as a file system known as S3fs. S3fs is a FUSE file-system that allows you to mount an Amazon S3 bucket as a local file-system. It behaves like a network attached drive, as it does not store anything on the Amazon EC2, but user can access the data on S3 from EC2 instance.

Filesystem in Userspace (FUSE) is a simple interface for userspace programs to export a virtual file-system to the Linux kernel. It also aims to provide a secure method for non privileged users to create and mount their own file-system implementations.

S3fs-fuse project is written in python backed by Amazons Simple Storage Service. Amazon offers an open API to build applications on top of this service, which several companies have done, using a variety of interfaces (web, rsync, fuse, etc).

Follow the below steps to mount your S3 bucket to your Linux Instance.

This Tutorial assumes that you have a running Linux EC2 instance on AWS with root access and a bucket created in S3 which is to be mounted on your Linux Instance. You will also require Access and Secret key pair with sufficient permissions of S3 or else an IAM access to generate or Create it.

We will perform the steps as a root user. You can also use sudo command if you are a normal user with sudo access. So lets get started.

 

Step-1:- If you are using a new centos or ubuntu instance. Update the system.

-> For CentOS or Red Hat

-> For Ubuntu

 

Step-2:- Install the dependencies.

-> In CentOS or Red Hat

 

In Ubuntu or Debian

 

Step-3:- Clone s3fs source code from git.

 

Step-4:- Now change to source code  directory, and compile and install the code with the following commands:

 

Step-5:- Use below command to check where s3fs command is placed in O.S. It will also tell you the installation is ok.

 

Step-6:- Getting the access key and secret key.

You will need AWS Access key and Secret key with appropriate permissions in order to access your s3 bucket from your EC2 instance. You can easily manage your user permissions from IAM (Identity and Access Management) Service provided by AWS. Create an IAM user with S3 full access(or with a role with sufficient permissions) or use root credentials of your Account. Here we will use the root credentials for simplicity.

Go to AWS Menu -> Your AWS Account Name -> My Security Credentials. Here your IAM console will appear. You have to go to Users > Your Account name and under permissions Tab, check whether you have sufficient access on S3 bucket. If not, you can manually assign an existing  “S3 Full-Access” policy or create a new policy with sufficient permissions.

Now go to Security Credentials Tab and Create Access Key. A new Access Key and Secret Key pair will be generated. Here you can see access key and secret key (secret key is visible when you click on show tab) which you can also download. Copy these both keys separately.

Note that you can always use an existing access and secret key pair. Alternatively, you can also create a new IAM user and assign it sufficient permissions to generate the access and secret key.

 

Step-7 :- Create a new file in /etc with the name passwd-s3fs and Paste the access key and secret key in the below format .

 

Step-8:- change the permission of file

 

Step-9:- Now create a directory or provide the path of an existing directory and mount S3bucket in it.

If you have a simple bucket without dot(.) in the bucket name, use the commands used in point “a” or else for bucket with dot(.) in bucket name, follow step “b”:

a) Bucket name without dot(.):

where, “your_bucketname” = the name of your S3 bucket that you have created on AWS S3, use_cache = to use a directory for its cache purpose, allow_other= to allow other users to write to the mount-point, uid= uid of the user/owner of the mountpoint (can also add “-o gid=1001” for group), mp_umask= to remove other users permission. multireq_max= parameter to send request to s3 bucket, /mys3bucket= mountpoint where the bucket will be mounted.

You can make an entry in /etc/rc.local to automatically remount after reboot.  Find the s3fs binary file by “which” command and make the entry before the “exit 0” line as below.

 

b) Bucket name with dot(.):

where, “your_bucketname” = the name of your S3 bucket that you have created on AWS S3, use_cache = to use a directory for its cache purpose, allow_other= to allow other users to write to the mount-point, uid= uid of the user/owner of the mountpoint (can also add “-o gid=1001” for group), mp_umask= to remove other users permission. multireq_max= parameter to send request to s3 bucket, /mys3bucket= mountpoint where the bucket will be mounted .

Remember to replace “{{aws_region}}” with your bucket region (example: eu-west-1).

You can make an entry in /etc/rc.local to automatically remount after reboot.  Find the s3fs binary file by “which” command and make the entry before the “exit 0” line as below.

 

To debug at any point, add  “-o dbglevel=info -f -o curldbg” in the s3fs mount command.

 

Step-10:- Check mounted s3 bucket. Output will be similar as shown below but Used size may differ.

“or”

If it shows the mounted file system, you have successfully mounted the S3 bucket on your EC2 Instance. You can also test it further by creating a test file.

This change should also reflect on S3 bucket. So Login to your S3 bucket to verify if the test file is present or not.

Note : If you already had some data in s3bucket and it is not visible, then you have to set permission in ACL at the S3 AWS management console for that s3 bucket.

Also, If you get any s3fs error such as “transport end point is not connected”, you have to unmount and remount the file-system. You can also do so through a custom script to detect and perform remount automatically.

 

Congrats!! You have successfully mounted your S3 bucket to your EC2 instance. Any files written to /mys3bucket will be replicated to your Amazon S3 bucket.

 

In case of any help or query, please contact us.

. . .

Comments (62)

Add Your Comment

  • Rakesh
    [[email protected] ~]$ touch /etc/passwd-s3fs
    touch: cannot touch ‘/etc/passwd-s3fs’: Permission denied
    • Kamal Verma
      Please use sudo before the command.
      eg: sudo touch /etc/passwd-s3fs
  • Egbert Frankenberg
    when I enter the command as listed above (considering the necessary adjustments for my bucket name and directory) I get this response:
    s3fs: could not determine how to establish security credentials
    • Kamal Verma
      This seems like some credentials issue possibly due to misconfiguration. Please follow the step 7 & 8 properly.
  • Nick
    Thanks for this post! I’m having a problem that maybe someone can can help with? It almost looks like a DNS issue, but I am not having any other DNS issues on this server. Anyone know what I’m doing wrong?

    [CRT] s3fs.cpp:set_s3fs_log_level(257): change debug level from [CRT] to [INF]
    [INF] s3fs.cpp:set_mountpoint_attribute(4193): PROC(uid=0, gid=0) – MountPoint(uid=0, gid=0, mode=40755)
    [CRT] s3fs.cpp:s3fs_init(3378): init v1.82(commit:unknown) with GnuTLS(gcrypt)
    [INF] s3fs.cpp:s3fs_check_service(3754): check services.
    [INF] curl.cpp:CheckBucket(2914): check a bucket.
    [INF] curl.cpp:prepare_url(4205): URL is https://s3-us-east-1.amazonaws.com/{{bucketNameWithDots}}/
    [INF] curl.cpp:prepare_url(4237): URL changed is https://s3-us-east-1.amazonaws.com/{{bucketNameWithDots}}/
    [INF] curl.cpp:insertV4Headers(2267): computing signature [GET] [/] [] []
    [INF] curl.cpp:url_to_host(100): url is https://s3-us-east-1.amazonaws.com
    * Could not resolve host: s3-us-east-1.amazonaws.com
    * Closing connection 0
    [ERR] curl.cpp:RequestPerform(1984): ### CURLE_COULDNT_RESOLVE_HOST
    [INF] curl.cpp:RequestPerform(2082): ### retrying…

    • Kamal Verma
      I think you have not provided bucket name in URL properly.

      [INF] curl.cpp:prepare_url(4205): URL is https://s3-us-east-1.amazonaws.com/{{bucketNameWithDots}}/
      [INF] curl.cpp:prepare_url(4237): URL changed is https://s3-us-east-1.amazonaws.com/{{bucketNameWithDots}}/

      You should replace {{bucketNameWithDots}} with your bucket name.
      Thanks

  • Karthik Nagadevara
    Thank you so much for writing this article. It was very helpful.
  • Aziz
    Hello,

    Is this method useful for saving Magento 2 media files in S3? or which is the best way to save Magento 2 media other than the EC2?

    Thank you,

  • css.php