S3 presigned URL ir pagaidu saite uz vienu objektu privātā bucket. Tā vaicājuma virknē nes parakstu, tāpēc ikviens, kam tā ir, var lejupielādēt (vai augšupielādēt) šo objektu bez AWS akreditācijas datiem, līdz saitei beidzas derīgums, un bucket nekad nekļūst publisks. Jūs to izveidojat ar savām atslēgām, savā kodā vai no AWS CLI, un tā var būt derīga no 1 sekundes līdz 7 dienām. Šis ceļvedis aptver, kā tas darbojas, ko nozīmē katrs X-Amz-* parametrs, cik ilgi tas var būt derīgs, kodu lejupielādēm un augšupielādēm un kļūdas, ar kurām visticamāk saskarsieties. Ierobežojumi ņemti no AWS un Cloudflare dokumentācijas 2026. gada oktobrī.
S3 presigned URL īsumā
| Jautājums | Atbilde |
|---|---|
| Ko tas atļauj? | Vienu darbību (GET, PUT, HEAD, DELETE…) ar vienu objektu |
| Maksimālais derīgums | 7 dienas (604 800 sekundes) ar SigV4 un IAM lietotāja atslēgām |
| Derīgums ar pagaidu atslēgām | Beidzas, kad beidzas lomas sesija vai STS akreditācijas dati, atkarībā no tā, kas notiek ātrāk |
| S3 konsoles diapazons | No 1 minūtes līdz 12 stundām |
| Noklusējuma derīgums | 3600 s AWS CLI un boto3, 900 s JavaScript v3 presigner |
| Vai to var izmantot vairākas reizes? | Jā, cik bieži vien kāds vēlas, līdz derīguma beigām |
| Vai vienu URL var atsaukt? | Nē, tikai atsaucot parakstīšanas akreditācijas datus vai aizliedzot to politikā |
| Vai izveide izsauc S3? | Nē, paraksts tiek aprēķināts lokāli |
Kā darbojas presigned URL
- Jūsu kods (vai CLI) ņem bucket, objekta atslēgu, HTTP metodi un derīguma laiku.
- SDK paraksta šīs vērtības ar jūsu slepeno piekļuves atslēgu, izmantojot AWS Signature Version 4. Šajā brīdī uz S3 nekas netiek sūtīts.
- Iegūto URL jūs kādam iedodat: pārlūkam, kolēģim, mobilajai lietotnei.
- Kad viņi to izmanto, S3 pārrēķina parakstu ar slepeno atslēgu, kas pieder URL norādītajai piekļuves atslēgai. Ja tas sakrīt, URL derīgums nav beidzies un parakstītājam ir atļauts veikt šo darbību, pieprasījums tiek izpildīts.
URL nes tā parakstītāja atļaujas. AWS par to runā skaidri: ja IAM lietotājs vai loma, kas ģenerēja URL, nevar lasīt objektu, URL atgriež 403, lai cik derīgs būtu paraksts.
Ko nozīmē X-Amz parametri
SigV4 presigned URL izskatās šādi (pievienoti rindu pārnesumi):
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
| Parametrs | Nozīme |
|---|---|
X-Amz-Algorithm | Parakstīšanas algoritms: AWS4-HMAC-SHA256 SigV4 gadījumā |
X-Amz-Credential | Piekļuves atslēgas ID kopā ar tvērumu: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request |
X-Amz-Date | Kad URL tika parakstīts, UTC laikā, yyyyMMddTHHmmssZ |
X-Amz-Expires | Cik sekundes URL ir derīgs pēc X-Amz-Date, no 1 līdz 604800 |
X-Amz-SignedHeaders | Paraksta aptvertās galvenes, vienmēr vismaz host |
X-Amz-Signature | Paraksts, 64 heksadecimālas rakstzīmes |
X-Amz-Security-Token | Ir tikai tad, ja URL parakstīts ar pagaidu akreditācijas datiem (STS, lomas, EC2, ECS, SSO) |
Mainiet jebkuru parakstīto daļu (atslēgu, metodi, derīgumu vai parakstītu galveni), un paraksts vairs nesakrīt. Ievērojiet arī, ko URL atklāj vienkāršā tekstā: bucket nosaukumu, pilnu objekta atslēgu un jūsu piekļuves atslēgas ID. Slepenā atslēga nekad nav URL.
Cik ilgi presigned URL ir derīgs
Robeža ir atkarīga no akreditācijas datiem, ar kuriem tas parakstīts:
| Parakstīts ar | Maksimālais derīgums |
|---|---|
| IAM lietotāja piekļuves atslēgām (SigV4) | 7 dienas, jo pati SigV4 parakstīšanas atslēga ir derīga 7 dienas |
| IAM lomas sesiju (STS AssumeRole) | Līdz sesijas beigām, pēc noklusējuma 1 stunda |
| EC2 instances profilu | Līdz lomas akreditācijas datu rotācijai, ne ilgāk par aptuveni 6 stundām |
| ECS uzdevuma lomu | Līdz uzdevuma akreditācijas datu rotācijai, parasti ik pēc 1 līdz 6 stundām |
| Jebkuriem atsauktiem vai dzēstiem akreditācijas datiem | Beidzas nekavējoties, lai ko teiktu X-Amz-Expires |
| S3 konsoli | Jūs izvēlaties no 1 minūtes līdz 12 stundām |
Tas izskaidro biežāko pārsteigumu: jūs prasāt 7 dienas no Lambda funkcijas vai EC2 instances, un saite pārstāj darboties pēc stundas vai dažām stundām. URL ir tik ilgdzīvojošs, cik akreditācijas dati aiz tā. Ja jums vajag ilgas saites, parakstiet ar atsevišķu IAM lietotāju, kuram ir lasīšanas piekļuve tikai šim bucket.
S3 pārbauda derīgumu, kad pieprasījums sākas. Liela lejupielāde, kas sākas sekundi pirms termiņa, pabeidzas normāli, bet atkārtojums pēc termiņa neizdodas ar AccessDenied un ziņojumu “Request has expired”. Pieprasījums pēc vairāk nekā 604 800 sekundēm tiek uzreiz noraidīts.
Kā ģenerēt presigned URL
AWS CLI
aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 3600
Komanda paraksta lejupielādes (GET) URL. Noklusējums ir 3600 sekundes, un maksimums 604 800. Jaunākās CLI versijas vienmēr izmanto SigV4, tāpēc pārliecinieties, ka reģions ir konfigurēts. Augšupielādes URL vajag 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,
)
Iestatiet signature_version='s3v4' skaidri. Boto3 atsaucē brīdināts, ka atpakaļsaderības dēļ tas citādi var parakstīt ar veco Signature Version 2 reģionos, kas to vēl pieņem, un tas klusi izmet dažus parametrus un galvenes, piemēram, Range. ResponseContentDisposition nav obligāts: tas liek pārlūkam saglabāt failu ar tīru nosaukumu, nevis atvērt to tieši.
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 }
)
Ja izlaižat expiresIn, JavaScript presigner izmanto 900 sekundes (15 minūtes).
Presigned augšupielādes URL (PUT)
Tā pati ideja darbojas pretējā virzienā. Jūs parakstāt PutObject vienai atslēgai, un ikviens, kam ir URL, var ierakstīt šo objektu. Fails nonāk tieši no viņu ierīces bucket, un jūsu serveris nekad neapstrādā baitus. Ja objekts ar šo atslēgu jau eksistē, tas tiek aizstāts.
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,
})
Pievienojot content-type laukam signableHeaders, URL tiek piesaistīts šim tipam, tāpēc augšupielāde ar citu Content-Type tiek noraidīta. Boto3 ekvivalents ir generate_presigned_url('put_object', Params={'Bucket': ..., 'Key': ..., 'ContentType': 'application/pdf'}), un klientam jāsūta tā pati galvene.
Trīs lietas, ko pārbaudīt pirms augšupielādes no pārlūka:
- CORS. Bucket vajag CORS noteikumu, kas atļauj jūsu izcelsmi un metodi
PUT. Multipart augšupielādēm tam jāatklāj arī galveneETag, jo pārlūkam tā jānolasa no katras daļas. - Fiksēta atslēga. Ģenerējiet unikālu atslēgu serverī (piemēram, ar UUID prefiksu), lai apmeklētājs nevarētu pārrakstīt kāda cita failu.
- Kontrolsummas. Pašreizējie AWS SDK pēc noklusējuma augšupielādēm pievieno CRC kontrolsummu. Ja presigned augšupielādes pie ar S3 saderīga pakalpojumu sniedzēja neizdodas ar paraksta vai kontrolsummas kļūdām, iestatiet klientā
requestChecksumCalculation: 'WHEN_REQUIRED'.
Presigned POST ir atsevišķs mehānisms vienkāršām HTML formām, ar politiku, kas var ierobežot izmēru un satura tipu. Ne visi ar S3 saderīgie pakalpojumu sniedzēji to atbalsta (R2 neatbalsta), tāpēc presigned PUT ir pārnesamāka izvēle.
Lieli faili: presigned multipart augšupielādes
Viens PUT uz S3 ir ierobežots ar 5 GB, un AWS iesaka multipart no aptuveni 100 MB. Multipart sadala failu līdz 10 000 daļām, katrā no 5 MiB līdz 5 GiB, izņemot pēdējo, un tās tiek augšupielādētas neatkarīgi, paralēli un ar atkārtojumiem katrai daļai. Parakstīšana notiek katrai daļai: serveris sāk augšupielādi, paraksta vienu UploadPart URL katrai daļai, pārlūks nosūta katru gabalu un paziņo tā ETag, un serveris pabeidz augšupielādi.
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 }] },
})
)
Pievienojiet dzīves cikla noteikumu, kas pēc dažām dienām pārtrauc nepabeigtas multipart augšupielādes, citādi pamestās daļas turpina aizņemt apmaksājamu krātuvi.
Presigned URL R2, B2, Spaces un Wasabi
Pakalpojumu sniedzēji, kas īsteno S3 API ar SigV4, pieņem to pašu kodu: jūs maināt tikai galapunktu, reģionu un atslēgas. Detaļas atšķiras, tāpēc pārbaudiet pakalpojumu sniedzēja dokumentāciju:
- Cloudflare R2 atbalsta presigned
GET,HEAD,PUTunDELETEar derīgumu no 1 sekundes līdz 7 dienām. Tas neatbalsta presignedPOST, un presigned URL darbojas tikai S3 API domēnā (<ACCOUNT_ID>.r2.cloudflarestorage.com), nevis pielāgotos domēnos. Izmantojietregion: 'auto'. - Backblaze B2 norāda, ka tā ar S3 saderīgais API atbalsta presigned URL, kas ģenerēti ar AWS CLI vai SDK.
- DigitalOcean Spaces un Wasabi darbojas ar tiem pašiem SDK izsaukumiem, kas norādīti uz to galapunktiem.
Katra pakalpojumu sniedzēja cenas skatiet S3, R2, Spaces, Wasabi un B2 salīdzinājumā.
Biežākās presigned URL kļūdas un to labojumi
| Kļūda | Parastais iemesls | Labojums |
|---|---|---|
SignatureDoesNotMatch | Metode, galvenes vai vaicājums atšķiras no parakstītā; pulkstenis nav sinhronizēts | Sūtiet to pašu Content-Type un galvenes; sinhronizējiet pulksteni ar NTP |
AccessDenied “Request has expired” | URL ir pāri X-Amz-Date + X-Amz-Expires | Ģenerējiet jaunu URL; saīsiniet laiku starp parakstīšanu un izmantošanu |
| URL derīgums beidzas agrāk nekā prasīts | Parakstīts ar pagaidu akreditācijas datiem (loma, EC2, ECS, Lambda) | Parakstiet ar akreditācijas datiem, kas dzīvo tik ilgi, cik jādarbojas saitei |
ExpiredToken | STS sesija aiz X-Amz-Security-Token ir beigusies | Atsvaidziniet akreditācijas datus pirms parakstīšanas |
403 AccessDenied jaunam URL | Parakstītājam trūkst s3:GetObject vai s3:PutObject, vai politika to aizliedz | Piešķiriet atļauju parakstītājam; pārbaudiet bucket politikas |
AuthorizationQueryParametersError | Derīgums virs 604 800 sekundēm vai nepareizs akreditācijas tvērums | Turiet X-Amz-Expires līdz 7 dienām; parakstiet bucket reģionā |
| Pārlūku bloķē CORS | Bucket nav CORS noteikuma jūsu izcelsmei un metodei | Pievienojiet CORS noteikumu ar savu izcelsmi, GET/PUT un atklātu ETag |
AccessDenied ar HeadersNotSigned | Range tika parakstīts, bet If-Range nosūtīts neparakstīts | Pievienojiet If-Range parakstītajām galvenēm |
Arī korporatīvie starpniekserveri, kas pārraksta galvenes vai vaicājuma virknes, sabojā parakstus. Ja URL darbojas no viena tīkla, bet ne no cita, testējiet bez starpniekservera.
Drošības labā prakse
AWS sauc presigned URL par bearer tokeniem un iesaka tos aizsargāt. Praksē:
- Turiet tos īsus. Minūtes augšupielādēm un sensitīviem failiem, stundas parastām lejupielādēm. Ģenerējiet jaunu, kad kādam fails atkal vajadzīgs.
- Parakstiet ar šauru identitāti. Atsevišķs IAM lietotājs vai loma, kas var tikai lasīt (vai tikai rakstīt) attiecīgo prefiksu, ierobežo kaitējumu, ja saite noplūst.
- Pievienojiet aizsargus bucket politikā. Nosacījums
s3:signatureAgenoraida parakstus, kas vecāki par noteiktu vecumu, unaws:SourceIpierobežo, kuri tīkli tos var izmantot. - Nereģistrējiet tos žurnālos. Pilni presigned URL lietotņu žurnālos, analītikā vai tērzēšanas vēsturē ir strādājoši akreditācijas dati līdz derīguma beigām.
- Plānojiet to, kā tiem trūkst. Nav paroles, nav lejupielāžu skaita un nav atsaukšanas katrai saitei, tāpēc novietojiet priekšā lietotni, ja jums tas vajadzīgs.
Par kopīgošanu padziļināti, ar iespējām, kas pievieno šīs kontroles, skatiet kā kopīgot S3 failus, nepadarot bucket publisku.
Kā Nubbo izmanto presigned URL
Nubbo ir veidots uz šī modeļa. Kad augšupielādējat pārlūkā, serveris paraksta PUT (vai, no 100 MB, multipart augšupielādi ar trim paralēlām daļām), un jūsu pārlūks nosūta baitus tieši uz jūsu bucket. Viena faila lejupielādes izmanto presigned GET URL, kas derīgi vienu stundu. Jūsu piekļuves atslēgas tiek glabātas šifrētas ar AES-256-GCM un tiek izmantotas tikai serverī parakstīšanai.
Kopīgošanas saites pievieno to, kā trūkst tīriem presigned URL: paroli, derīguma termiņu un lejupielāžu ierobežojumu pēc izvēles, ko Nubbo pārbauda, pirms izsniedz īslaicīgu URL, un saiti varat deaktivizēt jebkurā laikā. Vairāku failu ZIP lejupielādes tiek saliktas jūsu pārlūkā, kas katru failu lejupielādē tieši no jūsu bucket: Nubbo nekad neredz saturu. Viens godīgs izņēmums: sīktēli tiek ierakstīti jūsu paša bucket mapē .nubbo-thumbs/. Tas darbojas vienādi ar Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 un publiskiem ar S3 saderīgiem galapunktiem.
Biežāk uzdotie jautājumi
Kas ir presigned URL S3?
Tā ir parasta HTTPS saite uz vienu objektu privātā bucket ar parakstu, kas pievienots vaicājuma virknei. Ikviens, kam ir saite, var veikt vienu darbību, kurai tā parakstīta, parasti lejupielādi (GET) vai augšupielādi (PUT), līdz tai beidzas derīgums. Bucket paliek privāts, un saites lietotājam nevajag AWS akreditācijas datus.
Kāds ir S3 presigned URL maksimālais derīgums?
Septiņas dienas (604 800 sekundes), ja parakstāt ar Signature Version 4 un ilgtermiņa IAM lietotāja atslēgām. URL, kas parakstīts ar pagaidu akreditācijas datiem, piemēram, pieņemtu lomu vai EC2 instances profilu, pārstāj darboties, kad šiem datiem beidzas derīgums, pat ja prasījāt ilgāku laiku. S3 konsolē varat izvēlēties no 1 minūtes līdz 12 stundām.
Ko nozīmē X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders un X-Amz-Signature?
Tie ir SigV4 autentifikācijas parametri. Algorithm ir parakstīšanas metode (AWS4-HMAC-SHA256), Credential ir jūsu piekļuves atslēgas ID kopā ar datuma, reģiona un pakalpojuma tvērumu, Date ir URL parakstīšanas laiks, Expires ir sekunžu skaits, cik ilgi tas ir derīgs, SignedHeaders uzskaita paraksta aptvertās galvenes, un Signature ir pats paraksts. X-Amz-Security-Token parādās tikai tad, ja URL parakstīts ar pagaidu akreditācijas datiem.
Vai varu atsaukt S3 presigned URL pirms derīguma beigām?
Ne katru atsevišķi. Presigned URL pārstāj darboties agrāk tikai tad, ja akreditācijas dati, ar kuriem tas parakstīts, tiek atsaukti, dzēsti vai deaktivizēti, vai ja bucket politika pieprasījumu aizliedz. Ja jums jāatceļ atsevišķas saites, novietojiet priekšā lietotni, kas izsniedz īslaicīgus URL tikai pēc savām pārbaudēm.
Vai S3 presigned URL ir droši?
Parakstu nevar viltot vai mainīt, un bucket paliek privāts. Taču AWS apraksta presigned URL kā bearer tokenus: ikviens, kas iegūst saiti, var to izmantot tik reižu, cik vēlas, līdz tai beidzas derīgums. Turiet derīguma laiku īsu, izmantojiet HTTPS un nepublicējiet saites vietās, kur tās var nokopēt.
Vai presigned URL darbojas ar Cloudflare R2, Backblaze B2 vai Wasabi?
Pakalpojumu sniedzēji, kas īsteno S3 API ar Signature Version 4, tos parasti atbalsta, un jūs izmantojat tos pašus SDK izsaukumus ar pakalpojumu sniedzēja galapunktu. Cloudflare R2, piemēram, atbalsta presigned GET, HEAD, PUT un DELETE ar derīgumu no 1 sekundes līdz 7 dienām, bet ne POST formu augšupielādes un ne pielāgotus domēnus.
Kāpēc mans presigned URL atgriež SignatureDoesNotMatch?
AWS min trīs biežākos iemeslus: datora pulkstenis nav sinhronizēts, starpniekserveris maina galvenes vai vaicājuma virkni, un pieprasījuma metode, galvenes vai parametri atšķiras no parakstītajiem. Augšupielādēs parastais vaininieks ir cita Content-Type sūtīšana nekā tā, kas izmantota, ģenerējot URL.
Avoti
Cenas un ierobežojumi ņemti no tālāk norādītajām oficiālajām lapām. Pakalpojumu sniedzēji tos maina, tāpēc pārbaudiet pirms izvēles.
- Amazon S3: objektu lejupielāde un augšupielāde ar presigned URL
- AWS IAM: autentifikācijas metodes (SigV4 vaicājuma parametri)
- Amazon S3 API: pieprasījumu autentifikācija ar vaicājuma parametriem (SigV4)
- AWS CLI atsauce: s3 presign
- Boto3 atsauce: generate_presigned_url
- AWS SDK for JavaScript v3: @aws-sdk/s3-request-presigner
- Amazon S3: multipart augšupielādes ierobežojumi
- AWS SDKs and Tools: datu integritātes aizsardzība Amazon S3
- Cloudflare R2: presigned URL
- Backblaze: vai B2 ar S3 saderīgais API atbalsta presigned URL?