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üsimus | Vastus |
|---|---|
| Mida see lubab? | Ühe toimingu (GET, PUT, HEAD, DELETE…) ühel objektil |
| Maksimaalne aegumisaeg | 7 päeva (604 800 sekundit) SigV4 ja IAM-kasutaja võtmetega |
| Aegumine ajutiste võtmetega | Lõpeb rollisessiooni või STS-mandaatide lõppedes, olenevalt sellest, kumb on varem |
| S3 konsooli vahemik | 1 minutist 12 tunnini |
| Vaikimisi aegumisaeg | 3600 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
- Sinu kood (või CLI) võtab bucketi, objekti võtme, HTTP-meetodi ja aegumisaja.
- SDK allkirjastab need väärtused sinu salajase ligipääsuvõtmega, kasutades AWS Signature Version 4. Selles etapis S3-le midagi ei saadeta.
- Annad saadud URL-i kellelegi: brauserile, kolleegile, mobiilirakendusele.
- 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
| Parameeter | Tähendus |
|---|---|
X-Amz-Algorithm | Allkirjastamisalgoritm: SigV4 puhul AWS4-HMAC-SHA256 |
X-Amz-Credential | Ligipääsuvõtme ID koos ulatusega: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request |
X-Amz-Date | URL-i allkirjastamise aeg UTC-s, yyyyMMddTHHmmssZ |
X-Amz-Expires | Mitu sekundit URL kehtib pärast X-Amz-Date väärtust, 1 kuni 604800 |
X-Amz-SignedHeaders | Allkirjaga kaetud päised, alati vähemalt host |
X-Amz-Signature | Allkiri, 64 kuueteistkümnendmärki |
X-Amz-Security-Token | Olemas 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:
| Allkirjastatud | Maksimaalne 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’iga | Kuni rolli mandaatide vahetumiseni, kõige rohkem umbes 6 tundi |
| ECS task role’iga | Kuni ülesande mandaatide vahetumiseni, tavaliselt iga 1 kuni 6 tunni järel |
| Mis tahes tühistatud või kustutatud mandaadid | Lakkab kohe, olenemata sellest, mida X-Amz-Expires ütleb |
| S3 konsoolis | Valid 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äiseETag, 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- jaDELETE-päringuid aegumisajaga 1 sekundist 7 päevani. See ei toeta presignedPOST-i ja presigned URL-id töötavad ainult S3 API domeenil (<ACCOUNT_ID>.r2.cloudflarestorage.com), mitte kohandatud domeenidel. Kasutaregion: '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
| Viga | Tavaline põhjus | Lahendus |
|---|---|---|
SignatureDoesNotMatch | Meetod, päised või päring erinevad allkirjastatust; kell pole sünkroonis | Saada 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-Expires | Genereeri uus URL; lühenda aega allkirjastamise ja kasutamise vahel |
| URL aegub varem kui küsitud | Allkirjastatud ajutiste mandaatidega (roll, EC2, ECS, Lambda) | Allkirjasta mandaatidega, mis elavad nii kaua, kui link peab kestma |
ExpiredToken | X-Amz-Security-Token taga olev STS-sessioon on lõppenud | Värskenda mandaate enne allkirjastamist |
403 AccessDenied värske URL-i puhul | Allkirjastajal puudub s3:GetObject või s3:PutObject või poliitika keelab selle | Anna õigus allkirjastavale identiteedile; kontrolli bucketi poliitikaid |
AuthorizationQueryParametersError | Aegumisaeg üle 604 800 sekundi või vigane mandaadi ulatus | Hoia X-Amz-Expires 7 päeva või vähem; allkirjasta bucketi piirkonnas |
| Brauser blokeerib CORS-i tõttu | Bucketil pole CORS-reeglit sinu päritolu ja meetodi jaoks | Lisa CORS-reegel oma päritolu, GET/PUT ja avaldatud ETag’iga |
AccessDenied koos HeadersNotSigned | Range allkirjastati, kuid If-Range saadeti allkirjastamata | Lisa 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:signatureAgelükkab tagasi määratud vanusest vanemad allkirjad jaaws:SourceIppiirab, 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.
- Amazon S3: objektide alla- ja üleslaadimine presigned URL-idega
- AWS IAM: autentimismeetodid (SigV4 päringuparameetrid)
- Amazon S3 API: päringute autentimine päringuparameetritega (SigV4)
- AWS CLI viide: s3 presign
- Boto3 viide: generate_presigned_url
- AWS SDK for JavaScript v3: @aws-sdk/s3-request-presigner
- Amazon S3: multipart-üleslaadimise piirangud
- AWS SDKs and Tools: Amazon S3 andmete terviklikkuse kaitse
- Cloudflare R2: presigned URL-id
- Backblaze: kas B2 S3-ühilduv API toetab presigned URL-e?