Artikkel

S3 presigned URL-id: mis need on, kuidas töötavad, aegumise piirangud ja koodinäited

Mis on S3 presigned URL, mida iga X-Amz parameeter tähendab, 7-päevane aegumispiirang, üles- ja allalaadimise kood (CLI, boto3, JS) ja levinud vead.

S3 presigned URL on ajutine link ühele privaatse bucketi objektile. Selle päringustringis on allkiri, nii et selle omanik saab objekti alla (või üles) laadida ilma AWS-i mandaatideta, kuni link aegub, ja bucket ei muutu kunagi avalikuks. Lood selle oma võtmetega, oma koodis või AWS CLI-st, ja see võib kesta 1 sekundist kuni 7 päevani. See juhend selgitab, kuidas see töötab, mida iga X-Amz-* parameeter tähendab, kui kaua see võib kesta, annab koodi alla- ja üleslaadimiseks ning kirjeldab vigu, millega kõige tõenäolisemalt kokku puutud. Piirangud on võetud AWS-i ja Cloudflare’i dokumentatsioonist 2026. aasta oktoobri seisuga.

S3 presigned URL-id lühidalt

KüsimusVastus
Mida see lubab?Ühe toimingu (GET, PUT, HEAD, DELETE…) ühel objektil
Maksimaalne aegumisaeg7 päeva (604 800 sekundit) SigV4 ja IAM-kasutaja võtmetega
Aegumine ajutiste võtmetegaLõpeb rollisessiooni või STS-mandaatide lõppedes, olenevalt sellest, kumb on varem
S3 konsooli vahemik1 minutist 12 tunnini
Vaikimisi aegumisaeg3600 s AWS CLI-s ja boto3-s, 900 s JavaScript v3 presigneris
Kas seda saab kasutada mitu korda?Jah, nii tihti, kui keegi soovib, kuni see aegub
Kas üht URL-i saab tühistada?Ei, ainult allkirjastavate mandaatide tühistamise või poliitikas keelamisega
Kas selle loomine pöördub S3 poole?Ei, allkiri arvutatakse kohapeal

Kuidas presigned URL töötab

  1. Sinu kood (või CLI) võtab bucketi, objekti võtme, HTTP-meetodi ja aegumisaja.
  2. SDK allkirjastab need väärtused sinu salajase ligipääsuvõtmega, kasutades AWS Signature Version 4. Selles etapis S3-le midagi ei saadeta.
  3. Annad saadud URL-i kellelegi: brauserile, kolleegile, mobiilirakendusele.
  4. Kui nad seda kasutavad, arvutab S3 allkirja uuesti salajase võtmega, mis kuulub URL-is olevale ligipääsuvõtmele. Kui see klapib, URL pole aegunud ja allkirjastajal on lubatud seda toimingut teha, läheb päring läbi.

URL kannab endas selle allkirjastaja õigusi. AWS ütleb seda selgelt: kui URL-i genereerinud IAM-kasutaja või roll ei saa objekti lugeda, tagastab URL 403, ükskõik kui kehtiv allkiri on.

Mida X-Amz parameetrid tähendavad

SigV4 presigned URL näeb välja selline (reavahetused lisatud):

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
ParameeterTähendus
X-Amz-AlgorithmAllkirjastamisalgoritm: SigV4 puhul AWS4-HMAC-SHA256
X-Amz-CredentialLigipääsuvõtme ID koos ulatusega: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request
X-Amz-DateURL-i allkirjastamise aeg UTC-s, yyyyMMddTHHmmssZ
X-Amz-ExpiresMitu sekundit URL kehtib pärast X-Amz-Date väärtust, 1 kuni 604800
X-Amz-SignedHeadersAllkirjaga kaetud päised, alati vähemalt host
X-Amz-SignatureAllkiri, 64 kuueteistkümnendmärki
X-Amz-Security-TokenOlemas ainult siis, kui URL allkirjastati ajutiste mandaatidega (STS, rollid, EC2, ECS, SSO)

Muuda ükskõik millist allkirjastatud osa (võtit, meetodit, aegumisaega või allkirjastatud päist) ja allkiri enam ei klapi. Pane tähele ka seda, mida URL avatekstina paljastab: bucketi nime, objekti täieliku võtme ja sinu ligipääsuvõtme ID. Salajast võtit URL-is kunagi pole.

Kui kaua presigned URL kestab

Piirang sõltub mandaatidest, millega see allkirjastatakse:

AllkirjastatudMaksimaalne kehtivus
IAM-kasutaja ligipääsuvõtmetega (SigV4)7 päeva, sest SigV4 allkirjastamisvõti ise kehtib 7 päeva
IAM-rolli sessiooniga (STS AssumeRole)Kuni sessiooni lõpuni, vaikimisi 1 tund
EC2 instance profile’igaKuni rolli mandaatide vahetumiseni, kõige rohkem umbes 6 tundi
ECS task role’igaKuni ülesande mandaatide vahetumiseni, tavaliselt iga 1 kuni 6 tunni järel
Mis tahes tühistatud või kustutatud mandaadidLakkab kohe, olenemata sellest, mida X-Amz-Expires ütleb
S3 konsoolisValid 1 minuti ja 12 tunni vahel

See selgitab kõige levinumat üllatust: küsid Lambda funktsioonist või EC2 instantsist 7 päeva ja link sureb tunni või mõne tunni pärast. URL elab vaid nii kaua kui selle taga olevad mandaadid. Kui vajad pikki linke, allkirjasta spetsiaalse IAM-kasutajaga, kellel on lugemisõigus ainult sellele bucketile.

S3 kontrollib aegumist päringu alguses. Suur allalaadimine, mis algab sekund enne tähtaega, lõpeb tavapäraselt, kuid uus katse pärast tähtaega ebaõnnestub veaga AccessDenied ja teatega „Request has expired“. Üle 604 800 sekundi küsimine lükatakse kohe tagasi.

Kuidas presigned URL-i genereerida

AWS CLI

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

Käsk allkirjastab allalaadimise (GET) URL-i. Vaikimisi on 3600 sekundit ja maksimum 604 800. Uuemad CLI versioonid kasutavad alati SigV4, seega veendu, et piirkond on seadistatud. Üleslaadimise URL-ide jaoks vajad SDK-d.

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,
)

Määra signature_version='s3v4' selgesõnaliselt. Boto3 viide hoiatab, et tagasiühilduvuse huvides võib see muidu allkirjastada vanema Signature Version 2-ga piirkondades, mis seda veel aktsepteerivad, mis jätab vaikselt välja mõned parameetrid ja päised, näiteks Range. ResponseContentDisposition on valikuline: see paneb brauseri faili puhta nimega salvestama, selle asemel et seda brauseris avada.

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 }
)

Kui jätad expiresIn välja, kasutab JavaScripti presigner 900 sekundit (15 minutit).

Presigned üleslaadimise URL-id (PUT)

Sama idee töötab ka teises suunas. Allkirjastad ühe võtme jaoks PutObject toimingu ja URL-i omanik saab selle objekti kirjutada. Fail liigub otse tema seadmest bucketisse ja sinu server ei käsitle baite kunagi. Kui selle võtmega objekt on juba olemas, asendatakse see.

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 lisamine väljale signableHeaders seob URL-i selle tüübiga, nii et teistsuguse Content-Type’iga üleslaadimine lükatakse tagasi. Boto3-s on vaste generate_presigned_url('put_object', Params={'Bucket': ..., 'Key': ..., 'ContentType': 'application/pdf'}) ja klient peab saatma sama päise.

Kolm asja, mida enne brauserist üleslaadimist kontrollida:

  • CORS. Bucket vajab CORS-reeglit, mis lubab sinu päritolu ja meetodit PUT. Multipart-üleslaadimiste jaoks peab see ka avaldama päise ETag, sest brauser peab selle igast osast lugema.
  • Kindel võti. Genereeri serveris unikaalne võti (näiteks UUID-eesliitega), et külastaja ei saaks kellegi teise faili üle kirjutada.
  • Kontrollsummad. Praegused AWS SDK-d lisavad üleslaadimistele vaikimisi CRC-kontrollsumma. Kui presigned üleslaadimised ebaõnnestuvad S3-ühilduva teenusepakkuja juures allkirja- või kontrollsummavigadega, määra kliendile requestChecksumCalculation: 'WHEN_REQUIRED'.

Presigned POST on eraldi mehhanism tavaliste HTML-vormide jaoks, poliitikaga, mis võib piirata suurust ja sisutüüpi. Kõik S3-ühilduvad teenusepakkujad seda ei toeta (R2 ei toeta), seega on presigned PUT paremini ülekantav valik.

Suured failid: presigned multipart-üleslaadimised

Üksik PUT S3-sse on piiratud 5 GB-ga ja AWS soovitab multipart-meetodit alates umbes 100 MB-st. Multipart jagab faili kuni 10 000 osaks, igaüks 5 MiB kuni 5 GiB, välja arvatud viimane, ning need laaditakse üles iseseisvalt, paralleelselt ja osapõhiste kordustega. Presigned allkirjastamine toimib osade kaupa: server alustab üleslaadimist, allkirjastab iga osa jaoks ühe UploadPart URL-i, brauser saadab iga tüki ja teatab tagasi selle ETag’i ning server lõpetab üleslaadimise.

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 }] },
  })
)

Lisa elutsükli reegel, mis katkestab lõpetamata multipart-üleslaadimised mõne päeva pärast, muidu võtavad hüljatud osad jätkuvalt arveldatavat salvestusruumi.

Presigned URL-id R2-s, B2-s, Spacesis ja Wasabis

Teenusepakkujad, kes rakendavad S3 API-t koos SigV4-ga, aktsepteerivad sama koodi: muudad ainult lõpp-punkti, piirkonda ja võtmeid. Üksikasjad erinevad, seega kontrolli teenusepakkuja dokumentatsiooni:

  • Cloudflare R2 toetab presigned GET-, HEAD-, PUT- ja DELETE-päringuid aegumisajaga 1 sekundist 7 päevani. See ei toeta presigned POST-i ja presigned URL-id töötavad ainult S3 API domeenil (<ACCOUNT_ID>.r2.cloudflarestorage.com), mitte kohandatud domeenidel. Kasuta region: 'auto'.
  • Backblaze B2 teatab, et selle S3-ühilduv API toetab AWS CLI või SDK-dega genereeritud presigned URL-e.
  • DigitalOcean Spaces ja Wasabi töötavad samade SDK päringutega, mis on suunatud nende lõpp-punktidele.

Iga teenusepakkuja hindade kohta vaata S3, R2, Spacesi, Wasabi ja B2 võrdlust.

Levinud presigned URL-i vead ja nende parandamine

VigaTavaline põhjusLahendus
SignatureDoesNotMatchMeetod, päised või päring erinevad allkirjastatust; kell pole sünkroonisSaada sama Content-Type ja päised; sünkrooni kell NTP-ga
AccessDenied “Request has expired”URL on möödas ajast X-Amz-Date + X-Amz-ExpiresGenereeri uus URL; lühenda aega allkirjastamise ja kasutamise vahel
URL aegub varem kui küsitudAllkirjastatud ajutiste mandaatidega (roll, EC2, ECS, Lambda)Allkirjasta mandaatidega, mis elavad nii kaua, kui link peab kestma
ExpiredTokenX-Amz-Security-Token taga olev STS-sessioon on lõppenudVärskenda mandaate enne allkirjastamist
403 AccessDenied värske URL-i puhulAllkirjastajal puudub s3:GetObject või s3:PutObject või poliitika keelab selleAnna õigus allkirjastavale identiteedile; kontrolli bucketi poliitikaid
AuthorizationQueryParametersErrorAegumisaeg üle 604 800 sekundi või vigane mandaadi ulatusHoia X-Amz-Expires 7 päeva või vähem; allkirjasta bucketi piirkonnas
Brauser blokeerib CORS-i tõttuBucketil pole CORS-reeglit sinu päritolu ja meetodi jaoksLisa CORS-reegel oma päritolu, GET/PUT ja avaldatud ETag’iga
AccessDenied koos HeadersNotSignedRange allkirjastati, kuid If-Range saadeti allkirjastamataLisa If-Range allkirjastatud päiste hulka

Ettevõtete proksid, mis kirjutavad päiseid või päringustringe ümber, rikuvad samuti allkirju. Kui URL töötab ühest võrgust ja teisest mitte, testi ilma proksita.

Turvalisuse head tavad

AWS nimetab presigned URL-e kandjatõenditeks ja soovitab neid kaitsta. Praktikas:

  • Hoia need lühikesed. Üleslaadimiste ja tundlike failide jaoks minutid, tavaliste allalaadimiste jaoks tunnid. Genereeri uus, kui keegi vajab faili uuesti.
  • Allkirjasta kitsa identiteediga. Spetsiaalne IAM-kasutaja või roll, mis saab vaid lugeda (või vaid kirjutada) asjaomast prefiksit, piirab kahju, kui link lekib.
  • Lisa bucketi poliitikasse kaitsepiirded. Tingimus s3:signatureAge lükkab tagasi määratud vanusest vanemad allkirjad ja aws:SourceIp piirab, millised võrgud saavad neid kasutada.
  • Ära logi neid. Täielikud presigned URL-id rakenduse logides, analüütikas või vestlusajaloos on toimivad mandaadid, kuni need aeguvad.
  • Arvesta sellega, mis neil puudub. Pole parooli, allalaadimiste loendurit ega lingipõhist tühistamist, seega pane ette rakendus, kui neid vajad.

Jagamise poole põhjalikumaks käsitluseks, koos valikutega, mis need kontrollid lisavad, vaata kuidas jagada S3 faile ilma bucketit avalikuks tegemata.

Kuidas Nubbo presigned URL-e kasutab

Nubbo on üles ehitatud sellele mustrile. Kui laadid failihalduris üles, allkirjastab server PUT-päringu (või alates 100 MB-st multipart-üleslaadimise kolme paralleelse osaga) ja sinu brauser saadab baidid otse sinu bucketisse. Üksikfailide allalaadimised kasutavad presigned GET URL-e, mis kehtivad ühe tunni. Sinu ligipääsuvõtmed salvestatakse AES-256-GCM-iga krüpteeritult ja neid kasutatakse ainult serveris allkirjastamiseks.

Jagamislingid lisavad selle, mis toorestest presigned URL-idest puudub: valikulise parooli, aegumiskuupäeva ja allalaadimiste piirangu, mida Nubbo kontrollib enne lühiajalise URL-i väljastamist, ning lingi saad igal ajal deaktiveerida. Mitme faili ZIP-allalaadimised koostatakse sinu brauseris, mis laadib iga faili otse sinu bucketist alla: Nubbo ei näe kunagi sisu. Üks aus erand: pisipildid kirjutatakse sinu enda bucketisse kausta .nubbo-thumbs/. See töötab samamoodi Amazon S3, Cloudflare R2, DigitalOcean Spacesi, Wasabi, Backblaze B2 ja avalike S3-ühilduvate lõpp-punktidega.

Korduma kippuvad küsimused

Mis on presigned URL S3-s?

See on tavaline HTTPS-link ühele privaatse bucketi objektile, mille päringustringile on lisatud allkiri. Kellel link on, saab teha selle ühe toimingu, mille jaoks see allkirjastati, tavaliselt allalaadimise (GET) või üleslaadimise (PUT), kuni see aegub. Bucket jääb privaatseks ja lingi kasutaja ei vaja AWS-i mandaate.

Mis on S3 presigned URL-i maksimaalne aegumisaeg?

Seitse päeva (604 800 sekundit), kui allkirjastad Signature Version 4-ga ja pikaajaliste IAM-kasutaja võtmetega. Ajutiste mandaatidega, näiteks võetud rolli või EC2 instance profile’iga allkirjastatud URL lakkab töötamast, kui need mandaadid aeguvad, isegi kui küsisid pikemat aega. S3 konsoolis saad valida 1 minuti ja 12 tunni vahel.

Mida tähendavad X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders ja X-Amz-Signature?

Need on SigV4 autentimisparameetrid. Algorithm on allkirjastamismeetod (AWS4-HMAC-SHA256), Credential on sinu ligipääsuvõtme ID koos kuupäeva, piirkonna ja teenuse ulatusega, Date on URL-i allkirjastamise aeg, Expires on see, mitu sekundit see kehtib, SignedHeaders loetleb allkirjaga kaetud päised ja Signature on allkiri ise. X-Amz-Security-Token ilmub ainult siis, kui URL allkirjastati ajutiste mandaatidega.

Kas saan S3 presigned URL-i enne aegumist tühistada?

Mitte ükshaaval. Presigned URL lakkab varem töötamast ainult siis, kui selle allkirjastanud mandaadid tühistatakse, kustutatakse või deaktiveeritakse või kui bucketi poliitika päringu keelab. Kui pead üksikuid linke tühistama, pane ette rakendus, mis annab lühiajalisi URL-e välja alles pärast oma kontrolle.

Kas S3 presigned URL-id on turvalised?

Allkirja ei saa võltsida ega muuta ning bucket jääb privaatseks. Kuid AWS kirjeldab presigned URL-e kui kandjatõendeid (bearer tokens): igaüks, kes lingi saab, võib seda kasutada nii mitu korda, kui soovib, kuni see aegub. Hoia aegumisajad lühikesed, kasuta HTTPS-i ja väldi linkide postitamist kohtadesse, kust neid saab kopeerida.

Kas presigned URL-id töötavad Cloudflare R2, Backblaze B2 või Wasabiga?

Teenusepakkujad, kes rakendavad S3 API-t Signature Version 4-ga, toetavad neid üldiselt ja kasutad samu SDK päringuid teenusepakkuja lõpp-punktiga. Näiteks Cloudflare R2 toetab presigned GET-, HEAD-, PUT- ja DELETE-päringuid aegumisajaga 1 sekundist 7 päevani, kuid mitte POST-vormi üleslaadimisi ega kohandatud domeene.

Miks mu presigned URL tagastab SignatureDoesNotMatch?

AWS loetleb kolm levinud põhjust: arvuti kell, mis pole sünkroonis, proksi, mis muudab päiseid või päringustringi, ning päring, mille meetod, päised või parameetrid erinevad allkirjastatutest. Üleslaadimiste puhul on tavaline süüdlane teistsuguse Content-Type’i saatmine kui see, mida kasutati URL-i genereerimisel.

Allikad

Hinnad ja piirangud pärinevad allpool toodud ametlikelt lehtedelt. Teenusepakkujad muudavad neid, seega kontrolli enne otsustamist.