Artikulua

S3ko URL aurrez sinatuak: zer diren, nola dabiltzan, iraungitze-mugak eta kode-adibideak

Zer den S3ko URL aurrez sinatu bat, X-Amz parametroak, 7 eguneko muga, igoera- eta deskarga-kodea (CLI, boto3, JS) eta ohiko erroreak.

S3ko URL aurrez sinatu bat bucket pribatu bateko objektu baterako aldi baterako esteka bat da. Bere kontsulta-katean sinadura bat darama; beraz, esteka duenak objektu hori deskargatu (edo igo) dezake AWS kredentzialik gabe esteka iraungi arte, eta bucketa ez da inoiz publiko bihurtzen. Zure gakoekin sortzen duzu, zure kodean edo AWS CLItik, eta segundo 1etik 7 egunera arte iraun dezake. Gida honek azaltzen du nola dabilen, zer esan nahi duen X-Amz-* parametro bakoitzak, zenbat iraun dezakeen, deskargetarako eta igoeretarako kodea eta aurkitzeko aukera handiena duzun erroreak. Mugak AWSren eta Cloudflareren dokumentaziotik hartuta daude, 2026ko urrian.

S3ko URL aurrez sinatuak begirada batean

GalderaErantzuna
Zer ematen du?Eragiketa bat (GET, PUT, HEAD, DELETE…) objektu batean
Gehieneko iraungitzea7 egun (604.800 segundo) SigV4 eta IAM erabiltzaileen gakoekin
Iraungitzea aldi baterako gakoekinRol-saioa edo STS kredentzialak amaitzen direnean amaitzen da, lehenago gertatzen dena
S3 kontsolako tarteaMinutu 1etik 12 ordura
Iraungitze lehenetsia3.600 s AWS CLIn eta boto3n, 900 s JavaScript v3 presignerrean
Hainbat aldiz erabil daiteke?Bai, edonork nahi adina aldiz, iraungi arte
URL bakar bat baliogabetu daiteke?Ez, sinatzeko kredentzialak baliogabetuz edo politika batean ukatuz bakarrik
Bat sortzeak S3ri deitzen dio?Ez, sinadura lokalean kalkulatzen da

Nola dabilen URL aurrez sinatu bat

  1. Zure kodeak (edo CLIak) bucketa, objektuaren gakoa, HTTP metodoa eta iraungitze-denbora hartzen ditu.
  2. SDKak balio horiek zure secret access key-arekin sinatzen ditu AWS Signature Version 4 erabiliz. Une honetan ez zaio ezer bidaltzen S3ri.
  3. Sortutako URLa norbaiti ematen diozu: nabigatzaile bati, lankide bati, mugikorreko aplikazio bati.
  4. Erabiltzen dutenean, S3k sinadura berriro kalkulatzen du URLko access key-ari dagokion secret-arekin. Bat badator, URLa iraungi ez bada eta sinatzaileak eragiketa hori egiteko baimena badu, eskaera aurrera doa.

URLak sinatu zuenaren baimenak darama. AWS argia da honetan: URLa sortu zuen IAM erabiltzaileak edo rolak ezin badu objektua irakurri, URLak 403 itzultzen du, sinadura baliozkoa izan arren.

Zer esan nahi duten X-Amz parametroek

SigV4 URL aurrez sinatu batek itxura hau du (lerro-jauziak gehituta):

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
ParametroaEsanahia
X-Amz-AlgorithmSinatzeko algoritmoa: AWS4-HMAC-SHA256 SigV4rako
X-Amz-CredentialAccess key ID-a gehi esparrua: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request
X-Amz-DateURLa noiz sinatu zen, UTCn, yyyyMMddTHHmmssZ
X-Amz-ExpiresZenbat segundoz den baliozkoa URLa X-Amz-Date ondoren, 1etik 604800ra
X-Amz-SignedHeadersSinadurak hartzen dituen goiburuak, beti gutxienez host
X-Amz-SignatureSinadura, 64 karaktere hamaseitar
X-Amz-Security-TokenURLa aldi baterako kredentzialekin sinatu denean bakarrik (STS, rolak, EC2, ECS, SSO)

Aldatu sinatutako edozein zati (gakoa, metodoa, iraungitzea edo sinatutako goiburu bat) eta sinadura ez dator bat jada. Kontuan izan, gainera, URLak testu argian zer erakusten duen: bucketaren izena, objektuaren gako osoa eta zure access key ID-a. Gako sekretua ez dago inoiz URLan.

Zenbat irauten duen URL aurrez sinatu batek

Muga sinatzen duten kredentzialen araberakoa da:

Zerekin sinatutaGehieneko baliozkotasuna
IAM erabiltzaileen sarbide-gakoak (SigV4)7 egun, SigV4 sinatze-gakoa bera 7 egunez delako baliozkoa
IAM rol-saioa (STS AssumeRole)Saioa amaitu arte, ordubete berez
EC2 instantzia-profilaRolaren kredentzialak txandakatu arte, gehienez 6 ordu inguru
ECS zeregin-rolaZereginaren kredentzialak txandakatu arte, normalean 1etik 6 ordura behin
Baliogabetutako edo ezabatutako edozein kredentzialBerehala gelditzen da, X-Amz-Expires gorabehera
S3 kontsolaMinutu 1 eta 12 ordu artean aukeratzen duzu

Horrek azaltzen du ezustekorik ohikoena: Lambda funtzio batetik edo EC2 instantzia batetik 7 egun eskatzen dituzu eta esteka ordubete edo ordu gutxi batzuen ondoren hiltzen da. URLak atzean dituen kredentzialek adina bakarrik irauten du. Esteka luzeak behar badituzu, sinatu bucket horretarako irakurketa-sarbidea soilik duen IAM erabiltzaile berezitu batekin.

S3k iraungitzea egiaztatzen du eskaera bat hasten denean. Epea baino segundo bat lehenago hasten den deskarga handi bat normal amaitzen da, baina epearen ondorengo berriro saiakera batek huts egiten du AccessDenied errorearekin eta “Request has expired” mezuarekin. 604.800 segundo baino gehiago eskatzea zuzenean baztertzen da.

Nola sortu URL aurrez sinatu bat

AWS CLI

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

Komandoak deskarga-URL bat (GET) sinatzen du. Lehenetsia 3.600 segundo da eta gehienekoa 604.800. CLIaren azken bertsioek beti SigV4 erabiltzen dute; beraz, ziurtatu eskualde bat konfiguratuta dagoela. Igoera-URLetarako SDK bat behar duzu.

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

Ezarri signature_version='s3v4' esplizituki. Boto3 erreferentziak ohartarazten du, atzerako bateragarritasunagatik, bestela Signature Version 2 zaharrarekin sina dezakeela oraindik onartzen duten eskualdeetan, eta horrek isilean kentzen ditu parametro eta goiburu batzuk, Range adibidez. ResponseContentDisposition aukerakoa da: nabigatzaileak fitxategia izen garbi batekin gorde dezan egiten du, lerroan ireki beharrean.

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 kanpoan uzten baduzu, JavaScript presignerrak 900 segundo (15 minutu) erabiltzen ditu.

Aurrez sinatutako igoera-URLak (PUT)

Ideia berak beste norabidean funtzionatzen du. PutObject bat sinatzen duzu gako baterako, eta URLa duenak objektu hori idatz dezake. Fitxategia zuzenean doa haren gailutik bucketera, eta zure zerbitzariak ez ditu inoiz byteak kudeatzen. Gako hori duen objektu bat badago jada, ordezkatu egiten da.

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 aukerari gehitzeak URLa mota horri lotzen dio; beraz, beste Content-Type batekin egindako igoera bat baztertu egiten da. Boto3n baliokidea generate_presigned_url('put_object', Params={'Bucket': ..., 'Key': ..., 'ContentType': 'application/pdf'}) da, eta bezeroak goiburu bera bidali behar du.

Nabigatzailetik igo aurretik egiaztatu beharreko hiru gauza:

  • CORS. Bucketak zure jatorria eta PUT metodoa baimentzen dituen CORS arau bat behar du. Multipart igoeretarako ETag goiburua ere erakutsi behar du, nabigatzaileak zati bakoitzetik irakurri behar duelako.
  • Gako finkoa. Sortu gako bakar bat zerbitzarian (adibidez UUID aurrizki batekin), bisitari batek beste norbaiten fitxategia gainidatzi ez dezan.
  • Kontrol-baturak. AWSren egungo SDKek CRC kontrol-batura bat gehitzen diete igoerei berez. Aurrez sinatutako igoerek huts egiten badute S3rekin bateragarria den hornitzaile baten aurka sinadura- edo kontrol-batura-erroreekin, ezarri requestChecksumCalculation: 'WHEN_REQUIRED' bezeroan.

Aurrez sinatutako POST mekanismo bereizi bat da HTML inprimaki arruntetarako, tamaina eta eduki mota mugatu ditzakeen politika batekin. S3rekin bateragarriak diren hornitzaile guztiek ez dute onartzen (R2k ez), eta horregatik aurrez sinatutako PUT da aukera eramangarriagoa.

Fitxategi handiak: aurrez sinatutako multipart igoerak

S3rako PUT bakar bat 5 GBra mugatuta dago, eta AWSk multipart iradokitzen du 100 MB ingurutik aurrera. Multipartek fitxategia 10.000 zatitan banatzen du gehienez, bakoitza 5 MiBetik 5 GiBera azkena izan ezik, eta zatiak modu independentean igotzen dira, paraleloan eta zati bakoitzeko berriro saiakerekin. Aurrez sinatzea zatika egiten da: zerbitzariak igoera hasten du, UploadPart URL bat sinatzen du zati bakoitzeko, nabigatzaileak zati bakoitza bidaltzen du eta haren ETag itzultzen du, eta zerbitzariak igoera osatzen du.

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

Gehitu osatu gabeko multipart igoerak egun gutxiren buruan bertan behera uzten dituen bizi-zikloko arau bat; bestela, utzitako zatiek biltegiratze fakturagarria hartzen jarraituko dute.

URL aurrez sinatuak R2, B2, Spaces eta Wasabin

S3 APIa SigV4rekin inplementatzen duten hornitzaileek kode bera onartzen dute: endpoint-a, eskualdea eta gakoak bakarrik aldatzen dituzu. Xehetasunak desberdinak dira; beraz, begiratu hornitzailearen dokumentazioa:

  • Cloudflare R2k aurrez sinatutako GET, HEAD, PUT eta DELETE onartzen ditu, segundo 1etik 7 egunera arteko iraungitzearekin. Ez du aurrez sinatutako POST onartzen, eta URL aurrez sinatuek S3 APIaren domeinuan bakarrik funtzionatzen dute (<ACCOUNT_ID>.r2.cloudflarestorage.com), ez domeinu pertsonalizatuetan. Erabili region: 'auto'.
  • Backblaze B2k dio S3rekin bateragarria den bere APIak AWS CLIarekin edo SDKekin sortutako URL aurrez sinatuak onartzen dituela.
  • DigitalOcean Spacesek eta Wasabik SDK dei berberekin funtzionatzen dute, haien endpoint-etara bideratuta.

Hornitzaile bakoitzaren prezioetarako, ikusi S3, R2, Spaces, Wasabi eta B2ren konparazioa.

URL aurrez sinatuen errore ohikoak eta nola konpondu

ErroreaOhiko kausaKonponbidea
SignatureDoesNotMatchMetodoa, goiburuak edo kontsulta sinatutakoaz bestelakoak dira; erlojua sinkronizatu gabeBidali Content-Type eta goiburu berberak; sinkronizatu erlojua NTPrekin
AccessDenied “Request has expired”URLak X-Amz-Date + X-Amz-Expires gainditu duSortu URL berri bat; laburtu sinatzearen eta erabiltzearen arteko tartea
URLa eskatutakoa baino lehenago iraungitzen daAldi baterako kredentzialekin sinatuta (rola, EC2, ECS, Lambda)Sinatu estekak iraun behar duen adina bizi diren kredentzialekin
ExpiredTokenX-Amz-Security-Token atzeko STS saioa amaitu daFreskatu kredentzialak sinatu aurretik
403 AccessDenied URL berri bateanSinatzaileak ez du s3:GetObject edo s3:PutObject, edo politika batek ukatzen duEman baimena sinatzen duen identitateari; berrikusi bucket-politikak
AuthorizationQueryParametersError604.800 segundotik gorako iraungitzea edo gaizki osatutako kredentzial-esparruaMantendu X-Amz-Expires 7 egunean edo gutxiagoan; sinatu bucketaren eskualdean
Nabigatzailea CORSek blokeatutaBucketak ez du CORS araurik zure jatorrirako eta metodorakoGehitu CORS arau bat zure jatorriarekin, GET/PUT metodoekin eta ETag erakutsita
AccessDenied HeadersNotSigned errorearekinRange sinatu zen, baina If-Range sinatu gabe bidali zenGehitu If-Range sinatutako goiburuei

Goiburuak edo kontsulta-kateak berridazten dituzten enpresa-proxyek ere sinadurak hausten dituzte. URL batek sare batetik funtzionatzen badu eta beste batetik ez, probatu proxyrik gabe.

Segurtasun-jardunbide egokiak

AWSk bearer token deitzen die URL aurrez sinatuei eta babesteko gomendatzen du. Praktikan:

  • Mantendu laburrak. Minutuak igoeretarako eta fitxategi sentikorretarako, orduak deskarga arruntetarako. Sortu berri bat norbaitek fitxategia berriro behar duenean.
  • Sinatu identitate mugatu batekin. Aurrizki jakin bat irakurri (edo idatzi) bakarrik dezakeen IAM erabiltzaile edo rol berezitu batek mugatu egiten du kaltea esteka bat filtratzen bada.
  • Gehitu babesak bucket-politikan. s3:signatureAge baldintzak adin jakin bat baino zaharragoak diren sinadurak baztertzen ditu, eta aws:SourceIp baldintzak zer sarek erabil ditzaketen mugatzen du.
  • Ez erregistratu. Aplikazioen erregistroetan, analitiketan edo txat-historian dauden URL aurrez sinatu osoak kredentzial erabilgarriak dira iraungi arte.
  • Aurreikusi falta zaiena. Ez dute pasahitzik, deskarga-kontagailurik ez esteka bakoitzeko baliogabetzerik; beraz, jarri aplikazio bat aurrean horiek behar dituzunean.

Partekatzearen aldea sakonago aztertzeko, kontrol horiek gehitzen dituzten aukerekin, ikusi nola partekatu S3 fitxategiak bucketa publiko egin gabe.

Nola erabiltzen dituen Nubbok URL aurrez sinatuak

Nubbo eredu honen gainean eraikita dago. Arakatzailean igotzen duzunean, zerbitzariak PUT bat sinatzen du (edo, 100 MBtik aurrera, hiru zati paraleloan dituen multipart igoera bat) eta zure nabigatzaileak byteak zuzenean bidaltzen ditu zure bucketera. Fitxategi bakarreko deskargek ordubetez baliozkoak diren aurrez sinatutako GET URLak erabiltzen dituzte. Zure sarbide-gakoak AES-256-GCM bidez enkriptatuta gordetzen dira, eta zerbitzarian sinatzeko bakarrik erabiltzen dira.

Partekatzeko estekek URL aurrez sinatu hutsei falta zaiena gehitzen dute: aukerako pasahitz, iraungitze-data eta deskarga-muga bat, Nubbok iraupen laburreko URL bat eman aurretik egiaztatzen dituenak, eta esteka bat edozein unetan desaktiba dezakezu. Fitxategi anitzeko ZIP deskargak zure nabigatzailean muntatzen dira, fitxategi bakoitza zuzenean zure bucketetik deskargatuz: Nubbok ez du inoiz edukia ikusten. Salbuespen zintzo bakarra: miniaturak zure bucketean bertan idazten dira .nubbo-thumbs/ karpetan. Berdin funtzionatzen du Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 eta S3rekin bateragarriak diren endpoint publikoetan.

Ohiko galderak

Zer da S3ko URL aurrez sinatu bat?

Bucket pribatu bateko objektu baterako HTTPS esteka arrunt bat da, kontsulta-katean sinadura bat gehituta. Esteka duenak sinatu zen eragiketa bakarra egin dezake, normalean deskarga bat (GET) edo igoera bat (PUT), iraungi arte. Bucketa pribatu geratzen da, eta esteka erabiltzen duen pertsonak ez du AWS kredentzialik behar.

Zein da S3ko URL aurrez sinatu baten gehieneko iraupena?

Zazpi egun (604.800 segundo) Signature Version 4 eta IAM erabiltzaileen epe luzeko gakoekin sinatzen duzunean. Aldi baterako kredentzialekin sinatutako URL batek, hartutako rol batekin edo EC2 instantzia-profil batekin adibidez, funtzionatzeari uzten dio kredentzial horiek iraungitzen direnean, gehiago eskatu arren. S3 kontsolan minutu 1 eta 12 ordu artean aukera dezakezu.

Zer esan nahi dute X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders eta X-Amz-Signature parametroek?

SigV4 autentifikazio-parametroak dira. Algorithm sinatzeko metodoa da (AWS4-HMAC-SHA256), Credential zure access key ID-a gehi data, eskualdea eta zerbitzuaren esparrua, Date URLa noiz sinatu zen, Expires zenbat segundoz den baliozkoa, SignedHeaders sinadurak hartzen dituen goiburuen zerrenda eta Signature sinadura bera. X-Amz-Security-Token URLa aldi baterako kredentzialekin sinatu denean bakarrik agertzen da.

S3ko URL aurrez sinatu bat baliogabetu dezaket iraungi aurretik?

Ez banan-banan. URL aurrez sinatu batek lehenago funtzionatzeari uzten dio sinatu zuten kredentzialak baliogabetzen, ezabatzen edo desaktibatzen direnean bakarrik, edo bucket-politika batek eskaera ukatzen duenean. Esteka bakoitza bertan behera utzi behar baduzu, jarri aplikazio bat aurrean, bere egiaztapenen ondoren bakarrik iraupen laburreko URLak ematen dituena.

Seguruak dira S3ko URL aurrez sinatuak?

Sinadura ezin da faltsutu ez aldatu, eta bucketa pribatu geratzen da. Baina AWSk bearer token gisa deskribatzen ditu URL aurrez sinatuak: esteka lortzen duen edonork erabil dezake, nahi adina aldiz, iraungi arte. Mantendu iraungitze-denbora laburrak, erabili HTTPS eta saihestu estekak kopia daitezkeen lekuetan argitaratzea.

URL aurrez sinatuek funtzionatzen dute Cloudflare R2, Backblaze B2 edo Wasabirekin?

S3 APIa Signature Version 4rekin inplementatzen duten hornitzaileek orokorrean onartzen dituzte, eta SDK dei berberak erabiltzen dituzu hornitzailearen endpoint-arekin. Cloudflare R2k, adibidez, aurrez sinatutako GET, HEAD, PUT eta DELETE onartzen ditu, segundo 1etik 7 egunera arteko iraungitzearekin, baina ez POST inprimaki-igoerak ez domeinu pertsonalizatuak.

Zergatik itzultzen du nire URL aurrez sinatuak SignatureDoesNotMatch?

AWSk hiru kausa ohiko zerrendatzen ditu: sinkronizatu gabe dagoen ordenagailu-erloju bat, goiburuak edo kontsulta-katea aldatzen dituen proxy bat, eta metodoa, goiburuak edo parametroak sinatutakoetatik desberdinak dituen eskaera bat. Igoeretan, ohiko errudunak URLa sortzean erabilitakoaz bestelako Content-Type bat bidaltzea da.

Iturriak

Prezioak eta mugak beheko orri ofizialetatik datoz. Hornitzaileek aldatu egiten dituzte; beraz, egiaztatu erabaki aurretik.