Raksts

S3 presigned URL: kas tie ir, kā tie darbojas, derīguma ierobežojumi un koda piemēri

Kas ir S3 presigned URL, ko nozīmē katrs X-Amz parametrs, 7 dienu derīguma robeža, augšupielādes un lejupielādes kods (CLI, boto3, JS) un kļūdu labojumi.

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ājumsAtbilde
Ko tas atļauj?Vienu darbību (GET, PUT, HEAD, DELETE…) ar vienu objektu
Maksimālais derīgums7 dienas (604 800 sekundes) ar SigV4 un IAM lietotāja atslēgām
Derīgums ar pagaidu atslēgāmBeidzas, kad beidzas lomas sesija vai STS akreditācijas dati, atkarībā no tā, kas notiek ātrāk
S3 konsoles diapazonsNo 1 minūtes līdz 12 stundām
Noklusējuma derīgums3600 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

  1. Jūsu kods (vai CLI) ņem bucket, objekta atslēgu, HTTP metodi un derīguma laiku.
  2. 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.
  3. Iegūto URL jūs kādam iedodat: pārlūkam, kolēģim, mobilajai lietotnei.
  4. 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
ParametrsNozīme
X-Amz-AlgorithmParakstīšanas algoritms: AWS4-HMAC-SHA256 SigV4 gadījumā
X-Amz-CredentialPiekļuves atslēgas ID kopā ar tvērumu: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request
X-Amz-DateKad URL tika parakstīts, UTC laikā, yyyyMMddTHHmmssZ
X-Amz-ExpiresCik sekundes URL ir derīgs pēc X-Amz-Date, no 1 līdz 604800
X-Amz-SignedHeadersParaksta aptvertās galvenes, vienmēr vismaz host
X-Amz-SignatureParaksts, 64 heksadecimālas rakstzīmes
X-Amz-Security-TokenIr 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 arMaksimā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 profiluLīdz lomas akreditācijas datu rotācijai, ne ilgāk par aptuveni 6 stundām
ECS uzdevuma lomuLīdz uzdevuma akreditācijas datu rotācijai, parasti ik pēc 1 līdz 6 stundām
Jebkuriem atsauktiem vai dzēstiem akreditācijas datiemBeidzas nekavējoties, lai ko teiktu X-Amz-Expires
S3 konsoliJū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ī galvene ETag, 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, PUT un DELETE ar derīgumu no 1 sekundes līdz 7 dienām. Tas neatbalsta presigned POST, un presigned URL darbojas tikai S3 API domēnā (<ACCOUNT_ID>.r2.cloudflarestorage.com), nevis pielāgotos domēnos. Izmantojiet region: '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ļūdaParastais iemeslsLabojums
SignatureDoesNotMatchMetode, galvenes vai vaicājums atšķiras no parakstītā; pulkstenis nav sinhronizētsSū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ītsParakstīts ar pagaidu akreditācijas datiem (loma, EC2, ECS, Lambda)Parakstiet ar akreditācijas datiem, kas dzīvo tik ilgi, cik jādarbojas saitei
ExpiredTokenSTS sesija aiz X-Amz-Security-Token ir beigusiesAtsvaidziniet akreditācijas datus pirms parakstīšanas
403 AccessDenied jaunam URLParakstītājam trūkst s3:GetObject vai s3:PutObject, vai politika to aizliedzPiešķiriet atļauju parakstītājam; pārbaudiet bucket politikas
AuthorizationQueryParametersErrorDerīgums virs 604 800 sekundēm vai nepareizs akreditācijas tvērumsTuriet X-Amz-Expires līdz 7 dienām; parakstiet bucket reģionā
Pārlūku bloķē CORSBucket nav CORS noteikuma jūsu izcelsmei un metodeiPievienojiet CORS noteikumu ar savu izcelsmi, GET/PUT un atklātu ETag
AccessDenied ar HeadersNotSignedRange tika parakstīts, bet If-Range nosūtīts neparakstītsPievienojiet 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:signatureAge noraida parakstus, kas vecāki par noteiktu vecumu, un aws:SourceIp ierobež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.