Skip to main content
Blob Storage parle l’API S3 à l’adresse https://s3-blob.squarecloud.app. Tout outil qui permet de définir un endpoint personnalisé fonctionne : aws-cli, boto3, le SDK AWS pour JavaScript, rclone, Cyberduck et la plupart des outils de sauvegarde.

Identifiants

Les outils S3 signent les requêtes avec une paire de clés d’accès. Obtenez-la via Identifiants S3 :
La paire est dérivée de votre clé API. Elle ne nécessite aucune gestion séparée : révoquer ou régénérer la clé fait de même pour la paire, et la paire reçoit les mêmes scopes. Une clé avec uniquement blob:read donne une paire en lecture seule. La paire ne change pas tant que la clé API ne change pas : récupérez-la donc une fois et conservez-la dans votre gestionnaire de secrets ou dans une variable d’environnement. N’appelez pas la route à chaque démarrage : elle accepte 10 requêtes par heure.

Buckets

Votre compte voit trois buckets fixes. Vous ne pouvez pas créer ni supprimer de buckets. Une clé dans le bucket public ou private est le chemin de l’objet sans votre id utilisateur : images/logo.png dans le bucket public correspond à l’objet pub/<user_id>/images/logo.png sur l’API REST. Les fichiers écrits via S3 apparaissent sur l’API REST et dans le tableau de bord, et inversement.

Configuration

boto3 a besoin de signature_version="s3v4" pour les URL présignées : sans cela, generate_presigned_url signe avec l’ancien SigV2, que la passerelle n’accepte pas. Les URL présignées durent jusqu’à 7 jours (604800 secondes).
Les réponses de la passerelle ne sont jamais mises en cache en périphérie. Une URL présignée cesse de fonctionner exactement à son expiration, lorsque la clé API est révoquée ou lorsque l’objet est supprimé.

Opérations prises en charge

Les politiques de bucket, CORS, lifecycle, website, le chiffrement, object lock, les versions, la journalisation, les notifications, la réplication, les écritures d’ACL et de tags, le GET par partNumber et les envois par formulaire POST depuis le navigateur répondent 501 NotImplemented. Utilisez les paramètres du compte pour les règles de cycle de vie.

Clés

  • Les clés sont des chemins littéraux. Une clé peut faire jusqu’à environ 1000 octets : la limite de 1024 octets compte aussi le préfixe du compte. Une clé plus longue répond KeyTooLongError, et son message indique le nombre exact d’octets dont vous disposez. Les segments ne peuvent pas être vides, . ou ...
  • Une clé de 0 octet se terminant par / est un marqueur de dossier, à la manière dont la console AWS crée les dossiers.
  • Le Content-Type servi est dérivé de l’extension, comme sur l’API REST. Les exécutables sont refusés avec InvalidArgument et .html, .svg et .xml sont servis en tant que téléchargements.

Métadonnées, cache et expiration

  • Les en-têtes x-amz-meta-* sont conservés sur Pro et Enterprise (jusqu’à 5 clés et 512 octets, sinon MetadataTooLarge). Sur les autres plans, ils sont ignorés.
  • Cache-Control et Content-Disposition sont conservés. Un Cache-Control sans cache (no-cache, no-store ou max-age=0) en dehors d’Enterprise est refusé avec AccessDenied.
  • Les règles par préfixe s’appliquent aux objets écrits via S3, y compris la suppression automatique. Les champs max_size et extensions d’une règle ne s’appliquent qu’aux envois REST.

Limites

Au-delà d’une limite, la passerelle répond SlowDown (HTTP 503), et les SDK AWS patientent puis réessaient d’eux-mêmes. Les requêtes S3 ne comptent pas dans la limite de requêtes API de votre plan. Vérifiez la paire de clés avant de réessayer en boucle : une IP qui envoie trop d’identifiants invalides est bloquée pendant quelques minutes.

Taille des parties

Les outils multipart découpent eux-mêmes les gros fichiers ; gardez chaque partie à 80 Mo ou moins. Les valeurs par défaut de l’AWS CLI (8 Mo) et de rclone (5 Mo) conviennent déjà.
L’écriture nécessite un plan payant. Sans plan, et sur le bucket legacy en lecture seule, les écritures répondent AccessDenied. Le quota de stockage s’applique comme sur l’API REST.

Erreurs

La passerelle répond avec les erreurs XML S3 standard, afin que les SDK les gèrent nativement :