Объектные хранилища
Бакет объектного хранилища можно подключить к песочнице через FUSE. После этого файлы доступны командам и приложениям в обычном каталоге.
В примере используется s3fs. Добавьте его в шаблон через aptInstall("s3fs"): так песочница запускается быстрее и ей не приходится устанавливать системные пакеты во время работы.
Подключение S3-совместимого бакета
Сначала создайте песочницу, затем передайте функции имя бакета, endpoint и учётные данные:
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. Не рассчитывайте на атомарное переименование, блокировки файлов и большое число мелких случайных записей, если провайдер явно не гарантирует такое поведение.