В рамках прохождения курса по Cloud.ru есть задача по подключению S3-бакета при помощи программы CyberDuck которая доступна только под Windows и MacOS. Линукс там конечно же не поддеживается и придется как-то выкручиваться.
Для этого нам понадобится настроеный бакет и системный пользователь для доступа к S3 хранилищу, а подключаться мы будем при помощи утилиты s3fs которую собственно сейчас и установим.
# aptitude install s3fs
Создаем файлик с параметрами авторизации системного пользователя (в домашнем каталоге пользователя).
$ echo "<accessKeyId>:<secretAccessKey>" > .passwd-s3fs
$ chmod 600 ~/.passwd-s3fs
Создаем для теста каталог в /tmp.
$ mkdir /tmp/s3fs
Монтируем каталог хитрым заклинанием (пример взят из selectel, но вполне к любому s3-образному хранилищу применим) вида.
s3fs <наименование_контейнера> <путь_к_каталогу монтирования> -o allow_other -o passwd_file=<путь_файлу_с_данными_авторизации> -o use_path_request_style -o endpoint=<регион> -o url=https://s3.ru-1.storage.selcloud.ru
Естественно, что ничерта с ходу не получилось и будем дебажить (ну как обычно). А заклинание для дебага и ошибки выглядят так.
$ s3fs bucket-5f8cdd /tmp/s3fs -d -f -o passwd_file=/home/chernousov/.passwd-s3fs -o use_path_request_style -o endpoint=ru-central-1 -o url=https://s3.cloud.ru
2025-01-16T03:27:50.999Z [INF] s3fs version 1.93(unknown) : s3fs -d -f -o passwd_file=/home/chernousov/.passwd-s3fs -o use_path_request_style -o endpoint=ru-central-1 -o url=https://s3.cloud.ru bucket-5f8cdd /tmp/s3fs
2025-01-16T03:27:50.999Z [CRT] s3fs_logger.cpp:LowSetLogLevel(239): change debug level from [CRT] to [INF]
2025-01-16T03:27:50.999Z [INF] s3fs.cpp:set_mountpoint_attribute(4563): PROC(uid=1000, gid=1000) - MountPoint(uid=1000, gid=1000, mode=40775)
2025-01-16T03:27:51.000Z [INF] curl.cpp:InitMimeType(431): Loaded mime information from /etc/mime.types
2025-01-16T03:27:51.000Z [INF] fdcache_stat.cpp:CheckCacheFileStatTopDir(78): The path to cache top dir is empty, thus not need to check permission.
2025-01-16T03:27:51.001Z [INF] s3fs.cpp:s3fs_init(4287): init v1.93(commit:unknown) with GnuTLS(gcrypt), credential-library(built-in)
2025-01-16T03:27:51.001Z [INF] s3fs.cpp:s3fs_check_service(4431): check services.
2025-01-16T03:27:51.001Z [INF] curl.cpp:CheckBucket(3673): check a bucket path(/).
2025-01-16T03:27:51.001Z [INF] curl_util.cpp:prepare_url(257): URL is https://s3.cloud.ru/bucket-5f8cdd/
2025-01-16T03:27:51.001Z [INF] curl_util.cpp:prepare_url(290): URL changed is https://s3.cloud.ru/bucket-5f8cdd/
2025-01-16T03:27:51.001Z [INF] curl.cpp:insertV4Headers(2892): computing signature [GET] [/] [] []
2025-01-16T03:27:51.001Z [INF] curl_util.cpp:url_to_host(334): url is https://s3.cloud.ru
2025-01-16T03:27:51.301Z [ERR] curl.cpp:RequestPerform(2567): HTTP response code 403, returning EPERM. Body Text: <Error><Code>InvalidAccessKeyId</Code><Message>Invalid or unknown access key id</Message></Error>
2025-01-16T03:27:51.301Z [ERR] curl.cpp:CheckBucket(3742): Check bucket failed, S3 response: <Error><Code>InvalidAccessKeyId</Code><Message>Invalid or unknown access key id</Message></Error>
2025-01-16T03:27:51.301Z [CRT] s3fs.cpp:s3fs_check_service(4508): Failed to connect by sigv4, so retry to connect by signature version 2. But you should to review url and endpoint option.
2025-01-16T03:27:51.301Z [INF] curl.cpp:CheckBucket(3673): check a bucket path(/).
2025-01-16T03:27:51.301Z [INF] curl_util.cpp:prepare_url(257): URL is https://s3.cloud.ru/bucket-5f8cdd/
2025-01-16T03:27:51.301Z [INF] curl_util.cpp:prepare_url(290): URL changed is https://s3.cloud.ru/bucket-5f8cdd/
2025-01-16T03:27:51.355Z [INF] curl.cpp:RequestPerform(2583): HTTP response code 501 was returned, returning ENOTSUP
2025-01-16T03:27:51.355Z [ERR] curl.cpp:CheckBucket(3742): Check bucket failed, S3 response: <Error><Code>NotImplemented</Code><Message>AWS signature V2 not supported</Message></Error>
2025-01-16T03:27:51.355Z [CRT] s3fs.cpp:s3fs_check_service(4530): Failed to check bucket and directory for mount point : Unable to connect(host=https://s3.cloud.ru)
2025-01-16T03:27:51.355Z [ERR] s3fs.cpp:s3fs_exit_fuseloop(4277): Exiting FUSE event loop due to errors
2025-01-16T03:27:51.361Z [INF] s3fs.cpp:s3fs_destroy(4336): destroy
Итого, пошли читать документацию (причем она у них адекватно написана только применительно к AWS и подключению из Python https://cloud.ru/docs/s3e/ug/topics/tools__sdk-python.html). И как я понимаю от селектела нам инструкция подойдет лишь частично и придется информацию дербанить из разных источников.
В итоге, на курсах задал вопрос и мне ответили (о, магия), оказывается надо вот так делать.
Антон, добрый день!
Благодарим за отзыв.
Для s3fs необходимо:
1. сохранить credentials в файле (.passwd-s3fs) в формате: tenant.access_key:secret_key;
2. прописать команду подключения:
3fs bucket-name /path/to/mnt/dir -o passwd_file=/path/to/.passwd-s3fs -o url=https://s3.cloud.ru -o use_path_request_style -o endpoint=ru-central-1
Если будут вопросы — обращайтесь!
И вот тут я в документации не нашел за каким там чертом точка ставится и почему у того же селектела все наоборот и что это за магия, но оно работает.
tenant.access_key:secret_key
Ура!!!