Άρθρο

S3 presigned URLs: τι είναι, πώς λειτουργούν, όρια λήξης και παραδείγματα κώδικα

Τι είναι το S3 presigned URL, τι σημαίνει κάθε παράμετρος X-Amz, η λήξη 7 ημερών, κώδικας ανεβάσματος και λήψης (CLI, boto3, JS) και λύσεις σε σφάλματα.

Ένα S3 presigned URL είναι ένας προσωρινός σύνδεσμος προς ένα αντικείμενο σε ιδιωτικό bucket. Φέρει μια υπογραφή στο query string του, οπότε όποιος τον έχει μπορεί να κατεβάσει (ή να ανεβάσει) αυτό το αντικείμενο χωρίς διαπιστευτήρια AWS μέχρι να λήξει ο σύνδεσμος, και το bucket δεν γίνεται ποτέ δημόσιο. Το δημιουργείς με τα δικά σου κλειδιά, στον κώδικά σου ή από το AWS CLI, και μπορεί να διαρκεί από 1 δευτερόλεπτο έως 7 ημέρες. Αυτός ο οδηγός καλύπτει πώς λειτουργεί, τι σημαίνει κάθε παράμετρος X-Amz-*, πόσο μπορεί να διαρκέσει, κώδικα για λήψεις και ανεβάσματα και τα σφάλματα που είναι πιο πιθανό να συναντήσεις. Τα όρια προέρχονται από την τεκμηρίωση του AWS και του Cloudflare τον Οκτώβριο του 2026.

Τα S3 presigned URLs με μια ματιά

ΕρώτησηΑπάντηση
Τι επιτρέπει;Μία λειτουργία (GET, PUT, HEAD, DELETE…) σε ένα αντικείμενο
Μέγιστη λήξη7 ημέρες (604.800 δευτερόλεπτα) με SigV4 και κλειδιά χρήστη IAM
Λήξη με προσωρινά κλειδιάΤελειώνει όταν τελειώσει το session του role ή τα διαπιστευτήρια STS, όποιο έρθει πρώτο
Εύρος στην κονσόλα S31 λεπτό έως 12 ώρες
Προεπιλεγμένη λήξη3.600 s στο AWS CLI και στο boto3, 900 s στον presigner του JavaScript v3
Μπορεί να χρησιμοποιηθεί πολλές φορές;Ναι, όσο συχνά θέλει οποιοσδήποτε μέχρι να λήξει
Μπορεί να ανακληθεί ένα URL;Όχι, μόνο με ανάκληση των διαπιστευτηρίων υπογραφής ή άρνηση σε ένα policy
Καλεί το S3 η δημιουργία του;Όχι, η υπογραφή υπολογίζεται τοπικά

Πώς λειτουργεί ένα presigned URL

  1. Ο κώδικάς σου (ή το CLI) παίρνει το bucket, το κλειδί του αντικειμένου, τη μέθοδο HTTP και έναν χρόνο λήξης.
  2. Το SDK υπογράφει αυτές τις τιμές με το secret access key σου χρησιμοποιώντας το AWS Signature Version 4. Τίποτα δεν στέλνεται στο S3 σε αυτό το σημείο.
  3. Δίνεις το URL που προκύπτει σε κάποιον: έναν browser, έναν συνάδελφο, μια εφαρμογή κινητού.
  4. Όταν το χρησιμοποιούν, το S3 υπολογίζει ξανά την υπογραφή με το secret που ανήκει στο access key του URL. Αν ταιριάζει, το URL δεν έχει λήξει και αυτός που υπέγραψε έχει δικαίωμα να εκτελέσει αυτή τη λειτουργία, το αίτημα περνά.

Το URL φέρει τα δικαιώματα αυτού που το υπέγραψε. Το AWS είναι σαφές σε αυτό: αν ο χρήστης ή ο role IAM που δημιούργησε το URL δεν μπορεί να διαβάσει το αντικείμενο, το URL επιστρέφει 403 όσο έγκυρη κι αν είναι η υπογραφή.

Τι σημαίνουν οι παράμετροι X-Amz

Ένα presigned URL με SigV4 μοιάζει έτσι (με αλλαγές γραμμής για ευκολία):

https://my-bucket.s3.eu-west-1.amazonaws.com/reports/q3.pdf
  ?X-Amz-Algorithm=AWS4-HMAC-SHA256
  &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20261017%2Feu-west-1%2Fs3%2Faws4_request
  &X-Amz-Date=20261017T093000Z
  &X-Amz-Expires=3600
  &X-Amz-SignedHeaders=host
  &X-Amz-Signature=5f2c...e91a
ΠαράμετροςΣημασία
X-Amz-AlgorithmΟ αλγόριθμος υπογραφής: AWS4-HMAC-SHA256 για το SigV4
X-Amz-CredentialAccess key ID μαζί με το scope: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request
X-Amz-DateΠότε υπογράφηκε το URL, σε UTC, yyyyMMddTHHmmssZ
X-Amz-ExpiresΠόσα δευτερόλεπτα είναι έγκυρο το URL μετά το X-Amz-Date, από 1 έως 604800
X-Amz-SignedHeadersΤα headers που καλύπτει η υπογραφή, πάντα τουλάχιστον το host
X-Amz-SignatureΗ υπογραφή, 64 δεκαεξαδικοί χαρακτήρες
X-Amz-Security-TokenΥπάρχει μόνο όταν το URL υπογράφηκε με προσωρινά διαπιστευτήρια (STS, roles, EC2, ECS, SSO)

Άλλαξε οποιοδήποτε υπογεγραμμένο μέρος (το κλειδί, τη μέθοδο, τη λήξη ή ένα υπογεγραμμένο header) και η υπογραφή δεν ταιριάζει πια. Πρόσεξε επίσης τι αποκαλύπτει το URL σε απλό κείμενο: το όνομα του bucket, το πλήρες κλειδί του αντικειμένου και το access key ID σου. Το secret key δεν βρίσκεται ποτέ στο URL.

Πόσο διαρκεί ένα presigned URL

Το όριο εξαρτάται από τα διαπιστευτήρια που το υπογράφουν:

Υπογεγραμμένο μεΜέγιστη ισχύς
Access keys χρήστη IAM (SigV4)7 ημέρες, γιατί το ίδιο το κλειδί υπογραφής του SigV4 ισχύει για 7 ημέρες
Session role IAM (STS AssumeRole)Μέχρι να τελειώσει το session, 1 ώρα από προεπιλογή
Instance profile του EC2Μέχρι να ανανεωθούν τα διαπιστευτήρια του role, το πολύ περίπου 6 ώρες
Task role του ECSΜέχρι να ανανεωθούν τα διαπιστευτήρια του task, συνήθως κάθε 1 έως 6 ώρες
Οποιαδήποτε διαπιστευτήρια ανακληθούν ή διαγραφούνΣταματά αμέσως, ό,τι κι αν λέει το X-Amz-Expires
Κονσόλα S3Επιλέγεις από 1 λεπτό έως 12 ώρες

Αυτό εξηγεί την πιο συχνή έκπληξη: ζητάς 7 ημέρες από μια συνάρτηση Lambda ή ένα instance EC2 και ο σύνδεσμος πεθαίνει μετά από μία ή λίγες ώρες. Το URL ζει μόνο όσο τα διαπιστευτήρια πίσω του. Αν χρειάζεσαι συνδέσμους μεγάλης διάρκειας, υπέγραφε με έναν αποκλειστικό χρήστη IAM που έχει πρόσβαση ανάγνωσης μόνο σε αυτό το bucket.

Το S3 ελέγχει τη λήξη όταν ξεκινά ένα αίτημα. Μια μεγάλη λήψη που ξεκινά ένα δευτερόλεπτο πριν από την προθεσμία ολοκληρώνεται κανονικά, αλλά μια νέα προσπάθεια μετά την προθεσμία αποτυγχάνει με AccessDenied και το μήνυμα “Request has expired”. Αν ζητήσεις περισσότερα από 604.800 δευτερόλεπτα, το αίτημα απορρίπτεται κατευθείαν.

Πώς να δημιουργήσεις ένα presigned URL

AWS CLI

aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 3600

Η εντολή υπογράφει ένα URL λήψης (GET). Η προεπιλογή είναι 3.600 δευτερόλεπτα και το μέγιστο 604.800. Οι πρόσφατες εκδόσεις του CLI χρησιμοποιούν πάντα SigV4, οπότε βεβαιώσου ότι έχεις ρυθμίσει περιοχή. Για URLs ανεβάσματος χρειάζεσαι SDK.

Python (boto3)

import boto3
from botocore.config import Config

s3 = boto3.client('s3', region_name='eu-west-1', config=Config(signature_version='s3v4'))

url = s3.generate_presigned_url(
    ClientMethod='get_object',
    Params={
        'Bucket': 'my-bucket',
        'Key': 'reports/q3.pdf',
        'ResponseContentDisposition': 'attachment; filename="q3.pdf"',
    },
    ExpiresIn=3600,
)

Όρισε ρητά signature_version='s3v4'. Η αναφορά του boto3 προειδοποιεί ότι, για λόγους συμβατότητας, διαφορετικά μπορεί να υπογράψει με το παλαιότερο Signature Version 2 σε περιοχές που ακόμα το δέχονται, κάτι που αφαιρεί σιωπηλά ορισμένες παραμέτρους και headers όπως το Range. Το ResponseContentDisposition είναι προαιρετικό: κάνει τον browser να αποθηκεύσει το αρχείο με καθαρό όνομα αντί να το ανοίξει μέσα στη σελίδα.

JavaScript (AWS SDK v3)

import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'

const client = new S3Client({ region: 'eu-west-1' })

const url = await getSignedUrl(
  client,
  new GetObjectCommand({ Bucket: 'my-bucket', Key: 'reports/q3.pdf' }),
  { expiresIn: 3600 }
)

Αν παραλείψεις το expiresIn, ο presigner του JavaScript χρησιμοποιεί 900 δευτερόλεπτα (15 λεπτά).

Presigned URLs ανεβάσματος (PUT)

Η ίδια ιδέα λειτουργεί και προς την άλλη κατεύθυνση. Υπογράφεις ένα PutObject για ένα κλειδί και όποιος έχει το URL μπορεί να γράψει αυτό το αντικείμενο. Το αρχείο πηγαίνει κατευθείαν από τη συσκευή του στο bucket και ο server σου δεν αγγίζει ποτέ τα bytes. Αν υπάρχει ήδη αντικείμενο με αυτό το κλειδί, αντικαθίσταται.

import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'

const client = new S3Client({ region: 'eu-west-1' })

const url = await getSignedUrl(
  client,
  new PutObjectCommand({
    Bucket: 'my-bucket',
    Key: 'incoming/brief.pdf',
    ContentType: 'application/pdf',
  }),
  { expiresIn: 900, signableHeaders: new Set(['content-type']) }
)

await fetch(url, {
  method: 'PUT',
  headers: { 'Content-Type': 'application/pdf' },
  body: file,
})

Αν προσθέσεις το content-type στα signableHeaders, το URL δένεται σε αυτόν τον τύπο, οπότε ένα ανέβασμα με διαφορετικό Content-Type απορρίπτεται. Στο boto3 το αντίστοιχο είναι generate_presigned_url('put_object', Params={'Bucket': ..., 'Key': ..., 'ContentType': 'application/pdf'}) και ο client πρέπει να στείλει το ίδιο header.

Τρία πράγματα να ελέγξεις πριν ανεβάσεις από browser:

  • CORS. Το bucket χρειάζεται έναν κανόνα CORS που επιτρέπει το origin σου και τη μέθοδο PUT. Για multipart uploads πρέπει επίσης να εκθέτει το header ETag, γιατί ο browser πρέπει να το διαβάσει από κάθε τμήμα.
  • Σταθερό κλειδί. Δημιούργησε ένα μοναδικό κλειδί στον server (για παράδειγμα με πρόθεμα UUID) ώστε ένας επισκέπτης να μην μπορεί να αντικαταστήσει το αρχείο κάποιου άλλου.
  • Checksums. Τα τρέχοντα SDKs του AWS προσθέτουν από προεπιλογή ένα checksum CRC στα ανεβάσματα. Αν τα presigned ανεβάσματα αποτυγχάνουν σε έναν S3-συμβατό πάροχο με σφάλματα υπογραφής ή checksum, όρισε requestChecksumCalculation: 'WHEN_REQUIRED' στον client.

Το presigned POST είναι ξεχωριστός μηχανισμός για απλές φόρμες HTML, με ένα policy που μπορεί να περιορίσει μέγεθος και τύπο περιεχομένου. Δεν το υποστηρίζει κάθε S3-συμβατός πάροχος (το R2 όχι), οπότε το presigned PUT είναι η πιο φορητή επιλογή.

Μεγάλα αρχεία: presigned multipart uploads

Ένα μεμονωμένο PUT στο S3 περιορίζεται στα 5 GB και το AWS προτείνει multipart από περίπου 100 MB. Το multipart χωρίζει το αρχείο σε έως 10.000 τμήματα, το καθένα από 5 MiB έως 5 GiB εκτός από το τελευταίο, που ανεβαίνουν ανεξάρτητα, παράλληλα και με επαναλήψεις ανά τμήμα. Η προϋπογραφή γίνεται ανά τμήμα: ο server ξεκινά το ανέβασμα, υπογράφει ένα URL UploadPart ανά τμήμα, ο browser στέλνει κάθε κομμάτι και επιστρέφει το ETag του, και ο server ολοκληρώνει το ανέβασμα.

import {
  CreateMultipartUploadCommand,
  UploadPartCommand,
  CompleteMultipartUploadCommand,
} from '@aws-sdk/client-s3'

const { UploadId } = await client.send(
  new CreateMultipartUploadCommand({ Bucket: 'my-bucket', Key: 'video/raw.mov' })
)

const partUrl = await getSignedUrl(
  client,
  new UploadPartCommand({ Bucket: 'my-bucket', Key: 'video/raw.mov', UploadId, PartNumber: 1 }),
  { expiresIn: 3600 }
)

await client.send(
  new CompleteMultipartUploadCommand({
    Bucket: 'my-bucket',
    Key: 'video/raw.mov',
    UploadId,
    MultipartUpload: { Parts: [{ PartNumber: 1, ETag: etagFromPartResponse }] },
  })
)

Πρόσθεσε έναν κανόνα κύκλου ζωής που ακυρώνει τα μισοτελειωμένα multipart uploads μετά από λίγες ημέρες, αλλιώς τα εγκαταλελειμμένα τμήματα συνεχίζουν να πιάνουν χρεώσιμη αποθήκευση.

Presigned URLs σε R2, B2, Spaces και Wasabi

Οι πάροχοι που υλοποιούν το S3 API με SigV4 δέχονται τον ίδιο κώδικα: αλλάζεις μόνο το endpoint, την περιοχή και τα κλειδιά. Οι λεπτομέρειες διαφέρουν, οπότε έλεγξε την τεκμηρίωση του παρόχου:

  • Το Cloudflare R2 υποστηρίζει presigned GET, HEAD, PUT και DELETE, με λήξη από 1 δευτερόλεπτο έως 7 ημέρες. Δεν υποστηρίζει presigned POST και τα presigned URLs λειτουργούν μόνο στο domain του S3 API (<ACCOUNT_ID>.r2.cloudflarestorage.com), όχι σε custom domains. Χρησιμοποίησε region: 'auto'.
  • Το Backblaze B2 δηλώνει ότι το S3-συμβατό API του υποστηρίζει presigned URLs που δημιουργούνται με το AWS CLI ή τα SDKs.
  • Το DigitalOcean Spaces και το Wasabi λειτουργούν με τις ίδιες κλήσεις SDK στραμμένες στα endpoints τους.

Για τις τιμές κάθε παρόχου, δες τη σύγκριση των S3, R2, Spaces, Wasabi και B2.

Συνήθη σφάλματα presigned URL και πώς διορθώνονται

ΣφάλμαΣυνήθης αιτίαΛύση
SignatureDoesNotMatchΜέθοδος, headers ή query διαφέρουν από αυτά που υπογράφηκαν. Ρολόι εκτός συγχρονισμούΣτείλε το ίδιο Content-Type και τα ίδια headers. Συγχρόνισε το ρολόι με NTP
AccessDenied “Request has expired”Το URL έχει περάσει το X-Amz-Date + X-Amz-ExpiresΔημιούργησε νέο URL. Μείωσε το διάστημα μεταξύ υπογραφής και χρήσης
Το URL λήγει νωρίτερα από ό,τι ζητήθηκεΥπογράφηκε με προσωρινά διαπιστευτήρια (role, EC2, ECS, Lambda)Υπέγραφε με διαπιστευτήρια που ζουν όσο πρέπει να ζει ο σύνδεσμος
ExpiredTokenΤο session STS πίσω από το X-Amz-Security-Token έχει τελειώσειΑνανέωσε τα διαπιστευτήρια πριν υπογράψεις
403 AccessDenied σε φρέσκο URLΑυτός που υπογράφει δεν έχει s3:GetObject ή s3:PutObject, ή ένα policy το αρνείταιΔώσε το δικαίωμα στον principal που υπογράφει. Έλεγξε τα bucket policies
AuthorizationQueryParametersErrorΛήξη πάνω από 604.800 δευτερόλεπτα ή λανθασμένο scope διαπιστευτηρίωνΚράτα το X-Amz-Expires στις 7 ημέρες ή λιγότερο. Υπέγραφε στην περιοχή του bucket
Ο browser μπλοκάρεται από το CORSΔεν υπάρχει κανόνας CORS για το origin και τη μέθοδό σου στο bucketΠρόσθεσε κανόνα CORS με το origin σου, GET/PUT και εκτεθειμένο ETag
AccessDenied με HeadersNotSignedΤο Range υπογράφηκε αλλά το If-Range στάλθηκε χωρίς υπογραφήΠρόσθεσε το If-Range στα υπογεγραμμένα headers

Οι εταιρικοί proxies που ξαναγράφουν headers ή query strings χαλάνε επίσης τις υπογραφές. Αν ένα URL λειτουργεί από ένα δίκτυο και όχι από άλλο, δοκίμασε χωρίς τον proxy.

Καλές πρακτικές ασφαλείας

Το AWS αποκαλεί τα presigned URLs bearer tokens και συνιστά να τα προστατεύεις. Στην πράξη:

  • Κράτα τα σύντομα. Λεπτά για ανεβάσματα και ευαίσθητα αρχεία, ώρες για συνηθισμένες λήψεις. Δημιούργησε νέο όταν κάποιος χρειαστεί ξανά το αρχείο.
  • Υπέγραφε με στενή ταυτότητα. Ένας αποκλειστικός χρήστης ή role IAM που μπορεί μόνο να διαβάζει (ή μόνο να γράφει) το συγκεκριμένο πρόθεμα περιορίζει τη ζημιά αν διαρρεύσει ένας σύνδεσμος.
  • Πρόσθεσε δικλείδες στο bucket policy. Η συνθήκη s3:signatureAge απορρίπτει υπογραφές παλαιότερες από μια ορισμένη ηλικία και το aws:SourceIp περιορίζει ποια δίκτυα μπορούν να τις χρησιμοποιήσουν.
  • Μην τα καταγράφεις. Πλήρη presigned URLs σε logs εφαρμογών, analytics ή ιστορικό chat είναι λειτουργικά διαπιστευτήρια μέχρι να λήξουν.
  • Σχεδίασε για ό,τι τους λείπει. Δεν υπάρχει κωδικός, μετρητής λήψεων ούτε ανάκληση ανά σύνδεσμο, οπότε βάλε μια εφαρμογή μπροστά όταν τα χρειάζεσαι.

Για την πλευρά της κοινοποίησης σε βάθος, με επιλογές που προσθέτουν αυτούς τους ελέγχους, δες πώς να μοιράζεσαι αρχεία S3 χωρίς να κάνεις το bucket δημόσιο.

Πώς χρησιμοποιεί το Nubbo τα presigned URLs

Το Nubbo είναι χτισμένο πάνω σε αυτό το μοτίβο. Όταν ανεβάζεις στον εξερευνητή, ο server υπογράφει ένα PUT (ή, από 100 MB και πάνω, ένα multipart upload με τρία τμήματα παράλληλα) και ο browser σου στέλνει τα bytes απευθείας στο bucket σου. Οι λήψεις μεμονωμένων αρχείων χρησιμοποιούν presigned URLs GET που ισχύουν για μία ώρα. Τα access keys σου αποθηκεύονται κρυπτογραφημένα με AES-256-GCM και χρησιμοποιούνται μόνο στον server για την υπογραφή.

Οι σύνδεσμοι κοινοποίησης προσθέτουν ό,τι λείπει από τα σκέτα presigned URLs: προαιρετικό κωδικό, ημερομηνία λήξης και όριο λήψεων που το Nubbo ελέγχει πριν δώσει ένα URL σύντομης διάρκειας, και μπορείς να απενεργοποιήσεις έναν σύνδεσμο όποτε θέλεις. Οι λήψεις ZIP με πολλά αρχεία συναρμολογούνται στον browser σου, που κατεβάζει κάθε αρχείο απευθείας από το bucket σου: το Nubbo δεν βλέπει το περιεχόμενο. Μία ειλικρινής εξαίρεση: οι μικρογραφίες γράφονται στο δικό σου bucket στο .nubbo-thumbs/. Λειτουργεί το ίδιο σε Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 και δημόσια S3-συμβατά endpoints.

Συχνές ερωτήσεις

Τι είναι ένα presigned URL στο S3;

Είναι ένας κανονικός σύνδεσμος HTTPS προς ένα αντικείμενο σε ιδιωτικό bucket, με μια υπογραφή προστιθέμενη στο query string. Όποιος έχει τον σύνδεσμο μπορεί να εκτελέσει τη μία λειτουργία για την οποία υπογράφηκε, συνήθως μια λήψη (GET) ή ένα ανέβασμα (PUT), μέχρι να λήξει. Το bucket μένει ιδιωτικό και όποιος χρησιμοποιεί τον σύνδεσμο δεν χρειάζεται διαπιστευτήρια AWS.

Ποια είναι η μέγιστη διάρκεια ενός S3 presigned URL;

Επτά ημέρες (604.800 δευτερόλεπτα) όταν υπογράφεις με Signature Version 4 και μακροχρόνια κλειδιά χρήστη IAM. Ένα URL υπογεγραμμένο με προσωρινά διαπιστευτήρια, όπως ένας assumed role ή ένα instance profile του EC2, σταματά να λειτουργεί όταν λήξουν αυτά τα διαπιστευτήρια, ακόμα κι αν ζήτησες περισσότερο. Στην κονσόλα του S3 μπορείς να επιλέξεις από 1 λεπτό έως 12 ώρες.

Τι σημαίνουν τα X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders και X-Amz-Signature;

Είναι οι παράμετροι αυθεντικοποίησης του SigV4. Το Algorithm είναι η μέθοδος υπογραφής (AWS4-HMAC-SHA256), το Credential είναι το access key ID σου μαζί με το scope ημερομηνίας, περιοχής και υπηρεσίας, το Date είναι πότε υπογράφηκε το URL, το Expires είναι πόσα δευτερόλεπτα παραμένει έγκυρο, το SignedHeaders αναφέρει τα headers που καλύπτει η υπογραφή και το Signature είναι η ίδια η υπογραφή. Το X-Amz-Security-Token εμφανίζεται μόνο όταν το URL υπογράφηκε με προσωρινά διαπιστευτήρια.

Μπορώ να ανακαλέσω ένα S3 presigned URL πριν λήξει;

Όχι ένα προς ένα. Ένα presigned URL σταματά νωρίτερα μόνο όταν τα διαπιστευτήρια που το υπέγραψαν ανακληθούν, διαγραφούν ή απενεργοποιηθούν, ή όταν ένα bucket policy αρνηθεί το αίτημα. Αν χρειάζεται να ακυρώνεις μεμονωμένους συνδέσμους, βάλε μπροστά μια εφαρμογή που δίνει URLs σύντομης διάρκειας μόνο μετά από δικούς της ελέγχους.

Είναι ασφαλή τα S3 presigned URLs;

Η υπογραφή δεν μπορεί να πλαστογραφηθεί ή να αλλοιωθεί και το bucket μένει ιδιωτικό. Όμως το AWS περιγράφει τα presigned URLs ως bearer tokens: όποιος πάρει τον σύνδεσμο μπορεί να τον χρησιμοποιήσει, όσες φορές θέλει, μέχρι να λήξει. Κράτα σύντομους τους χρόνους λήξης, χρησιμοποίησε HTTPS και απόφυγε να δημοσιεύεις τους συνδέσμους εκεί όπου μπορούν να αντιγραφούν.

Λειτουργούν τα presigned URLs με Cloudflare R2, Backblaze B2 ή Wasabi;

Οι πάροχοι που υλοποιούν το S3 API με Signature Version 4 γενικά τα υποστηρίζουν, και χρησιμοποιείς τις ίδιες κλήσεις SDK με το endpoint του παρόχου. Το Cloudflare R2, για παράδειγμα, υποστηρίζει presigned GET, HEAD, PUT και DELETE με λήξη από 1 δευτερόλεπτο έως 7 ημέρες, αλλά όχι ανεβάσματα με φόρμα POST ούτε custom domains.

Γιατί το presigned URL μου επιστρέφει SignatureDoesNotMatch;

Το AWS αναφέρει τρεις συνήθεις αιτίες: ένα ρολόι υπολογιστή εκτός συγχρονισμού, ένας proxy που αλλάζει headers ή το query string, και ένα αίτημα του οποίου η μέθοδος, τα headers ή οι παράμετροι διαφέρουν από αυτά που υπογράφηκαν. Στα ανεβάσματα ο συνήθης ένοχος είναι η αποστολή διαφορετικού Content-Type από αυτό που χρησιμοποιήθηκε όταν δημιουργήθηκε το URL.

Πηγές

Οι τιμές και τα όρια προέρχονται από τις επίσημες σελίδες παρακάτω. Οι πάροχοι τα αλλάζουν, γι' αυτό έλεγξέ τα πριν δεσμευτείς.