AWS: s3fs-fuse — монтирование S3 локальным диском на Linux && macOS

Автор: | 11/19/2018
 

Задача — смонтировать AWS S3 корзину к локальной системе, отдельным диском.

Используем s3fs. Документация — тут>>>.

На Arch Linux устанавливаем из репозитория:

sudo pacman -S s3fs-fuse

На macOS — через homebrew:

brew cask install osxfuse
brew install s3fs

osxfuse сообщил:

==> Caveats
To install and/or use osxfuse you may need to enable their kernel extension in

System Preferences → Security & Privacy → General

А brew после установки выдал предупреждение:

Be aware that s3fs has some caveats concerning S3 «directories»
that have been created by other tools. See the following issue for
details:

https://code.google.com/p/s3fs/issues/detail?id=73

Надо будет проверить что там.

Для Windows — есть пакет wins3fs, но его не проверял.

IAM и авторизация

Создаём IAM-пользователя с Programmatic access:

Выбираем Attach existing policies directly и жмём Create policy:

Переключаемся в JSON-вид, добавляем политику:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::s3fs-testing"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::s3fs-testing",
                "arn:aws:s3:::s3fs-testing/*"
            ]
        }
    ]
}

Если пользователю нужен будет доступ через веб-админку — то политика будет выглядеть так:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::s3fs-testing"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::s3fs-testing",
                "arn:aws:s3:::s3fs-testing/*"
            ]
        }
    ]
}

Сохраняем её:

Возвращаемся во вкладку с созданием пользователя, обновляем списки политик, находим добавленную:

Сохраняем ключи:

Монтирование S3

Создаём каталог для монтирования корзины:

sudo mkdir /mnt/s3fs-test
sudo chown setevoy:setevoy /mnt/s3fs-test/

Задаём переменные:

export AWSACCESSKEYID=AKI***DDQ
export AWSSECRETACCESSKEY=O1f***MN/

Либо — через файл ~/.passwd-s3fs:

echo AKI***DDQ:O1f***MN/ > ~/.passwd-s3fs

В виде ACCESSKEY:SECRETKEY без пробела.

Если корзин несколько — то указываем их в виде:

echo имя-корзины:access-key:secret-key > ~/.passwd-s3fs

Задаём права доступа только владельцу:

chmod 600 ~/.passwd-s3fs

Монтирование на Linux

Монтируем раздел:

s3fs s3fs-testing /mnt/s3fs-test

Проверяем монтирование:

findmnt /mnt/s3fs-test/
TARGET         SOURCE FSTYPE    OPTIONS
/mnt/s3fs-test s3fs   fuse.s3fs rw,nosuid,nodev,relatime,user_id=1000,group_id=1000

Проверяем каталог:

ls -l /mnt/s3fs-test/
total 51
---------- 1 root root 52174 Nov 19 13:43 2adbz0.jpg

ОК — тестовый файлик в корзине на месте.

При необходимости передать дополнительные опции — используем -o optionname.

Монтирование на macOS

Повторяем на macOS.

Выполняем монтирование:

mkdir s3test
export AWSACCESSKEYID=AKI***DDQ
export AWSSECRETACCESSKEY=O1f***MN/
s3fs -d s3fs-testing /Users/jenkins/s3test/

Тут после первой попытки смонтировать раздел — macOS выводит на экране сообщение, что ему необходимо разрешить загрузку модуля.

Открываем General Settings, внизу в App — разрешаем загрузку модуля.

Повторяем s3fs -d s3fs-testing /Users/jenkins/s3test/, проверяем:

Mobiles-Mac-mini:~ jenkins$ ls -l /Users/jenkins/s3test/
total 104
----------  1 root  wheel  52174 Nov 19  2018 2adbz0.jpg

Окей.

И пробуем копирование файлов с локальной файловой системы в S3:

14:29:08 [setevoy@setevoy-arch-work ~]  $ touch /tmp/testfile
14:29:15 [setevoy@setevoy-arch-work ~]  $ cp /tmp/testfile /mnt/s3fs-test/

Проверяем:

14:29:43 [setevoy@setevoy-arch-work ~]  $ ll /mnt/s3fs-test/
total 52
---------- 1 root    root    52174 Nov 19 13:43 2adbz0.jpg
-rw-r--r-- 1 setevoy setevoy     0 Nov 19 14:29 testfile

Готово.