Перейти к содержимому

Объектные хранилища

Бакет объектного хранилища можно подключить к песочнице через FUSE. После этого файлы доступны командам и приложениям в обычном каталоге.

В примере используется s3fs. Добавьте его в шаблон через aptInstall("s3fs"): так песочница запускается быстрее и ей не приходится устанавливать системные пакеты во время работы.

Подключение S3-совместимого бакета

Сначала создайте песочницу, затем передайте функции имя бакета, endpoint и учётные данные:

mjs
async function mountS3Bucket(
  sandbox,
  { bucket, endpoint, accessKey, secretKey, mountPoint = "/home/user/bucket" },
) {
  const result = await sandbox.commands.run(
    `set -eu
credentials="$HOME/.passwd-s3fs"
trap 'rm -f "$credentials"' EXIT
mkdir -p "$S3_MOUNT_POINT"
umask 077
printf '%s:%s' "$S3_ACCESS_KEY" "$S3_SECRET_KEY" > "$credentials"
s3fs "$S3_BUCKET" "$S3_MOUNT_POINT" \
  -o passwd_file="$credentials" \
  -o url="$S3_ENDPOINT" \
  -o use_path_request_style
printf 'Mounted %s at %s\n' "$S3_BUCKET" "$S3_MOUNT_POINT"`,
    {
      envs: {
        S3_BUCKET: bucket,
        S3_ENDPOINT: endpoint,
        S3_ACCESS_KEY: accessKey,
        S3_SECRET_KEY: secretKey,
        S3_MOUNT_POINT: mountPoint,
      },
    },
  );
  console.log(result.stdout);
}

После подключения программы могут читать и записывать файлы в /home/user/bucket. Если бакет больше не нужен в долгоживущей песочнице, отключите его командой fusermount -u /home/user/bucket.

Используйте endpoint своего провайдера объектного хранилища. Selectel S3 и другие S3-совместимые сервисы работают с адресацией path-style, которую пример включает через use_path_request_style.

Учётные данные

Не сохраняйте ключи доступа в шаблоне. Передавайте их песочнице во время запуска или получайте временные ключи из своего хранилища секретов. Функция создаёт файл с ключами только для владельца и удаляет его сразу после запуска s3fs.

FUSE показывает объектное хранилище как файловую систему, но не добавляет ему семантику POSIX. Не рассчитывайте на атомарное переименование, блокировки файлов и большое число мелких случайных записей, если провайдер явно не гарантирует такое поведение.