La lliçó anterior va acabar amb una decisió pendent. EFS resolia el problema que les quatre
instàncies del divendres compartissin /var/www/fotos, però al preu equivocat: unes tretze vegades
més car que l'alternativa, amb tot el trànsit d'imatges passant per les instàncies i sense
aprofitar l'escala global d'AWS. Aquesta alternativa és Amazon S3 (Simple Storage Service), i
en aquesta lliçó MercadoFresco pren la decisió definitiva sobre les seves fotos de producte.
S3 és probablement el servei més important d'AWS. Va ser el primer que es va llançar, el 2006, i avui és el lloc on acaben les dades de gairebé qualsevol arquitectura: fitxers estàtics, còpies de seguretat, registres, llacs de dades, artefactes de desplegament. Entendre'l bé —no només «és on es pugen fitxers»— canvia la manera de dissenyar sistemes, perquè S3 no és un disc: és un magatzem d'objectes amb una API, i aquesta diferència té conseqüències en tot.
Contingut
- Emmagatzematge d'objectes: bucket, objecte, clau i prefix
- Per què S3 no és un sistema de fitxers
- Noms de bucket, regions i espai de noms global
- Durabilitat i disponibilitat: els onze nous
- Classes d'emmagatzematge i com triar
- Regles de cicle de vida per a les fotos antigues del catàleg
- Versionatge i protecció davant d'esborraments accidentals
- Migrar
/var/www/fotosambaws s3 sync aws s3davant d'aws s3api- Permisos: Block Public Access, polítiques de bucket i ACL
- URL signades prèviament: els informes de la Sara sense credencials
- Xifratge en repòs i en trànsit
- Allotjament d'un lloc estàtic
- Esdeveniments d'S3: el disparador de les miniatures
- Multipart upload i Transfer Acceleration
- Costos d'S3 i com no endur-se sorpreses
Emmagatzematge d'objectes: bucket, objecte, clau i prefix
El model d'S3 té només tres peces, i convé anomenar-les amb precisió perquè tota la documentació les fa servir així.
| Concepte | Què és | Exemple a MercadoFresco |
|---|---|---|
| Bucket | El contenidor. Viu en una regió i té nom únic a tot el món | mercadofresco-catalogo-fotos |
| Objecte | La dada desada: contingut + metadades + identificador | La foto naranjas-valencia-1kg.jpg |
| Clau (key) | El nom complet de l'objecte dins del bucket | productos/frutas/naranjas-valencia-1kg.jpg |
| Prefix | La part inicial de la clau, feta servir per filtrar i organitzar | productos/frutas/ |
| Metadades | Parells clau/valor: tipus de contingut, xifratge, etiquetes | Content-Type: image/jpeg |
Un objecte pot pesar des de 0 bytes fins a 5 TiB. Un bucket pot contenir un nombre il·limitat d'objectes i créixer sense que ningú provisioni res.
Per què S3 no és un sistema de fitxers
Aquesta és la idea que cal interioritzar, perquè d'ella se'n deriven gairebé totes les sorpreses dels principiants.
A S3 no existeixen les carpetes. La consola les dibuixa, aws s3 ls les llista, però no hi són.
L'única cosa que existeix és una llista plana de claus, i la barra / és un caràcter més dins del
nom.
El que veus a la consola: El que hi ha realment:
productos/ productos/frutas/naranjas.jpg
├── frutas/ productos/frutas/manzanas.jpg
│ ├── naranjas.jpg productos/verduras/tomates.jpg
│ └── manzanas.jpg informes/2026-07-ventas.csv
└── verduras/
└── tomates.jpg
informes/
└── 2026-07-ventas.csvLes conseqüències pràctiques d'això són concretes:
| En un sistema de fitxers | A S3 |
|---|---|
| Canviar el nom d'una carpeta és instantani | Cal copiar i esborrar cada objecte: amb 40.000 fotos, 80.000 operacions |
| Es pot modificar un byte al mig d'un fitxer | Els objectes són immutables: es reemplaça l'objecte sencer |
| Existeixen carpetes buides | Una «carpeta buida» no existeix (llevat d'un objecte de 0 bytes acabat en /) |
mv mou |
No hi ha mv real: és copy + delete |
Un open() retorna un descriptor i llegeixes per parts |
Cada lectura és una petició HTTPS (encara que admet rangs de bytes) |
| La latència és de microsegons | Desenes de mil·lisegons per petició |
I una conseqüència positiva enorme: com que no hi ha estructura jeràrquica real, no hi ha límit d'escala. Un bucket amb mil milions d'objectes funciona igual de bé que un amb deu, i S3 admet com a mínim 3.500 escriptures i 5.500 lectures per segon i per prefix, amb paral·lelització pràcticament il·limitada fent servir diversos prefixos.
Per això el disseny de claus importa. Per a MercadoFresco:
productos/frutas/naranjas-valencia-1kg.jpg # original productos/frutas/naranjas-valencia-1kg_thumb.jpg # miniatura (la generarà Lambda, 02-05) informes/2026/07/ventas-julio.csv # informes de la Sara, particionats per data copias/base-datos/2026-08-02-pedidos.dump # còpies
Noms de bucket, regions i espai de noms global
El nom d'un bucket és únic a tot AWS, a tots els comptes i totes les regions del
món. Si algú a Austràlia té fotos, tu no el pots tenir. És l'únic recurs d'AWS amb
espai de noms veritablement global.
Regles del nom:
- Entre 3 i 63 caràcters.
- Només minúscules, xifres, guions i punts.
- Ha de començar i acabar amb lletra o xifra.
- No pot semblar-se a una adreça IP.
- Evita els punts: trenquen la validació del certificat TLS amb noms d'estil virtual i causen errors difícils de diagnosticar.
Convenció de MercadoFresco, que aplicarem sempre:
mercadofresco-<componente>-<proposito>[-<entorno>] mercadofresco-catalogo-fotos mercadofresco-informes-analitica mercadofresco-copias-basedatos mercadofresco-tienda-web-desarrollo
Encara que el nom sigui global, les dades resideixen en una regió concreta i no en surten mai
llevat que ho demanis explícitament. Per a MercadoFresco això no és un detall: les fotos i els
informes es queden a eu-west-1, dins de la UE, cosa que sosté l'argument de l'RGPD que vam veure
a 01-03.
aws s3api create-bucket \
--bucket mercadofresco-catalogo-fotos \
--region eu-west-1 \
--create-bucket-configuration LocationConstraint=eu-west-1 \
--profile mercadofresco-dev
# Etiquetatge obligatori del projecte
aws s3api put-bucket-tagging \
--bucket mercadofresco-catalogo-fotos \
--tagging 'TagSet=[
{Key=Proyecto,Value=mercadofresco},
{Key=Entorno,Value=produccion},
{Key=Componente,Value=catalogo},
{Key=Propietario,Value=luis},
{Key=CentroCoste,Value=marketing}]' \
--profile mercadofresco-dev --region eu-west-1El parany de
LocationConstraint. Aus-east-1(i només allà) no s'ha de passar aquest paràmetre: la comanda falla si l'hi inclous. A qualsevol altra regió és obligatori. És una herència històrica del fet que S3 va néixer a Virgínia.
Durabilitat i disponibilitat: els onze nous
S3 Standard promet 99,999999999 % de durabilitat anual: els famosos onze nous. La xifra sona a màrqueting, però té un significat operatiu precís.
Si hi deses 10 milions d'objectes, l'expectativa estadística és perdre'n un cada 10.000 anys. Dit d'una altra manera: és moltíssim més probable que perdis les dades per un esborrament accidental o una política mal escrita que per una fallada d'S3.
Com s'aconsegueix: cada objecte es replica automàticament en almenys tres zones de disponibilitat de la regió, amb verificació contínua d'integritat i reparació automàtica. Tu no configures res.
No s'han de confondre dues mètriques diferents:
| Mètrica | Què mesura | S3 Standard | Conseqüència si falla |
|---|---|---|---|
| Durabilitat | Que la dada no es perdi | 99,999999999 % | Pèrdua permanent |
| Disponibilitat | Que hi puguis accedir ara | 99,99 % (≈53 min/any) | Errors temporals; es reintenta |
Un matís que importa molt per a MercadoFresco: la durabilitat d'S3 no et protegeix de tu mateix.
Si el Luis executa un aws s3 rm --recursive sobre el bucket equivocat, S3 l'esborrarà amb onze nous
de fiabilitat. La protecció contra això és el versionatge, que veurem més avall.
Classes d'emmagatzematge i com triar
No totes les dades s'hi accedeix igual. Les fotos dels tomàquets de temporada es demanen mil vegades al dia el juny i cap el gener. S3 ofereix classes amb un equilibri diferent entre cost d'emmagatzematge i cost/latència d'accés.
| Classe | Cost GB-mes (eu-west-1, aprox.) |
Latència de recuperació | Cost de recuperació | AZ | Mínim de permanència | Cas d'ús |
|---|---|---|---|---|---|---|
| Standard | 0,023 USD | Mil·lisegons | No | ≥3 | Cap | Dades actives: fotos del catàleg actual |
| Intelligent-Tiering | 0,023 → 0,0025 USD | Mil·lisegons | No (petita quota de monitoratge) | ≥3 | Cap | Patró d'accés desconegut o canviant |
| Standard-IA | 0,0125 USD | Mil·lisegons | Sí, per GB | ≥3 | 30 dies | Accés mensual, es necessita ràpid |
| One Zone-IA | 0,01 USD | Mil·lisegons | Sí, per GB | 1 | 30 dies | Còpies reproduïbles, miniatures regenerables |
| Glacier Instant Retrieval | 0,004 USD | Mil·lisegons | Sí, més gran | ≥3 | 90 dies | Arxiu consultat un parell de vegades l'any |
| Glacier Flexible Retrieval | 0,0036 USD | Minuts a 12 hores | Sí | ≥3 | 90 dies | Còpies de seguretat de compliment |
| Glacier Deep Archive | 0,00099 USD | 12 a 48 hores | Sí, el més gran | ≥3 | 180 dies | Retenció legal de 7 o 10 anys |
Entre Standard i Deep Archive hi ha un factor de 23 vegades en el cost d'emmagatzematge. Aquest és el premi per classificar bé les dades.
Tres criteris de decisió:
- Si no saps el patró d'accés, fes servir Intelligent-Tiering. Mou els objectes entre nivells automàticament, sense cost de recuperació, cobrant una petita quota de monitoratge per objecte. És l'opció segura per defecte per a dades heterogènies.
- Compte amb el mínim de permanència. Si puges un objecte a Standard-IA i l'esborres al cap de 10 dies, te'n cobren 30. Per a dades de vida curta, aquesta classe surt més cara que Standard.
- One Zone-IA només per a dades reproduïbles. Viu en una sola AZ: si aquesta AZ es perd, la dada es perd. És perfecte per a les miniatures de MercadoFresco, perquè sempre es poden regenerar a partir de l'original.
Regles de cicle de vida per a les fotos antigues del catàleg
Una regla de cicle de vida aplica transicions i caducitats automàticament segons l'edat dels objectes. És la manera que l'estalvi anterior passi sense que ningú hi intervingui.
L'anàlisi de MercadoFresco: les fotos de producte es consulten intensament els primers mesos
després de publicar-se, després l'interès cau, i les de productes descatalogats només es necessiten per
motius comptables. Traduït a política, a ciclo-vida-fotos.json:
{
"Rules": [
{
"ID": "fotos-productos-enfriamiento",
"Filter": {"Prefix": "productos/"},
"Status": "Enabled",
"Transitions": [
{"Days": 90, "StorageClass": "STANDARD_IA"},
{"Days": 365, "StorageClass": "GLACIER_IR"},
{"Days": 1095,"StorageClass": "DEEP_ARCHIVE"}
]
},
{
"ID": "miniaturas-una-sola-az",
"Filter": {"Prefix": "miniaturas/"},
"Status": "Enabled",
"Transitions": [
{"Days": 30, "StorageClass": "ONEZONE_IA"}
]
},
{
"ID": "informes-analitica-caducan-a-2-anos",
"Filter": {"Prefix": "informes/"},
"Status": "Enabled",
"Transitions": [
{"Days": 60, "StorageClass": "STANDARD_IA"}
],
"Expiration": {"Days": 730}
},
{
"ID": "limpiar-cargas-multiparte-incompletas",
"Filter": {},
"Status": "Enabled",
"AbortIncompleteMultipartUpload": {"DaysAfterInitiation": 7}
},
{
"ID": "versiones-antiguas-caducan-a-90-dias",
"Filter": {},
"Status": "Enabled",
"NoncurrentVersionExpiration": {"NoncurrentDays": 90}
}
]
}aws s3api put-bucket-lifecycle-configuration \
--bucket mercadofresco-catalogo-fotos \
--lifecycle-configuration file://ciclo-vida-fotos.json \
--profile mercadofresco-dev --region eu-west-1Comentari regla per regla:
fotos-productos-enfriamiento: escala de tres salts. Als 3 mesos baixa a IA, a l'any a Glacier Instant (que continua retornant en mil·lisegons), als 3 anys a Deep Archive.miniaturas-una-sola-az: aprofita que són regenerables. Estalvi sense risc real.informes-analitica-caducan-a-2-anos: a més de moure, esborra. Els informes de la Sara no tenen valor passats dos anys i esborrar és l'estalvi definitiu.limpiar-cargas-multiparte-incompletas: la més oblidada i la que més diners silenciosos estalvia. Una pujada gran interrompuda deixa fragments que es facturen i no apareixen en llistar el bucket. Aquesta regla hauria de ser en absolutament tots els teus buckets.versiones-antiguas-caducan-a-90-dias: sense això, el versionatge fa créixer el bucket per sempre.
Estimació de l'estalvi per a 40.000 fotos de 500 KB (uns 20 GB) amb una distribució d'edats típica:
| Escenari | Cost mensual |
|---|---|
| Tot a Standard | 20 GB × 0,023 = 0,46 USD |
| Amb cicle de vida (5 GB Standard, 8 GB IA, 7 GB Glacier IR) | 0,115 + 0,10 + 0,028 = 0,24 USD |
Amb 20 GB la diferència és xavalla. Amb els 20 TB que MercadoFresco tindrà després d'obrir a tres ciutats més (problema 3), són més de 250 USD al mes de diferència. Les regles es posen ara, quan costen un minut, no quan fan mal.
Versionatge i protecció davant d'esborraments accidentals
Amb el versionatge activat, S3 no sobreescriu ni esborra mai de debò:
- En pujar un objecte amb una clau existent, es crea una versió nova i l'anterior es conserva.
- En esborrar, s'hi col·loca un marcador d'esborrament (delete marker): l'objecte desapareix dels llistats però totes les seves versions hi continuen sent.
- Per recuperar-lo n'hi ha prou d'esborrar el marcador d'esborrament.
aws s3api put-bucket-versioning \
--bucket mercadofresco-catalogo-fotos \
--versioning-configuration Status=Enabled \
--profile mercadofresco-dev --region eu-west-1Recuperació d'un esborrament accidental, l'escenari real:
# 1. El Luis esborra una foto per error
aws s3 rm s3://mercadofresco-catalogo-fotos/productos/frutas/naranjas.jpg \
--profile mercadofresco-dev
# 2. Ja no apareix en llistar... però continua existint
aws s3api list-object-versions \
--bucket mercadofresco-catalogo-fotos \
--prefix productos/frutas/naranjas.jpg \
--query '{Versions:Versions[].[VersionId,LastModified],Marcadors:DeleteMarkers[].[VersionId]}' \
--profile mercadofresco-dev --region eu-west-1
# 3. S'esborra el MARCADOR D'ESBORRAMENT (no la versio) i la foto reapareix
aws s3api delete-object \
--bucket mercadofresco-catalogo-fotos \
--key productos/frutas/naranjas.jpg \
--version-id "3HL4kqCxf3vjVBH40Nrjfkd" \
--profile mercadofresco-dev --region eu-west-1Un cop activat, el versionatge no es pot desactivar, només suspendre (les versions ja creades
es conserven). I compte amb el cost: cada versió es factura per separat, d'aquí la regla de cicle
de vida NoncurrentVersionExpiration de l'apartat anterior.
Dues proteccions addicionals, esmentades breument perquè són de casos concrets:
- MFA Delete: exigeix un codi d'autenticació multifactor de l'usuari root per esborrar versions o canviar l'estat del versionatge. Molt fort, però només s'activa amb les credencials de root i no es pot gestionar des de la consola, cosa que el fa incòmode per al dia a dia.
- Object Lock (WORM: write once, read many): impedeix esborrar o modificar un objecte durant un període fixat, fins i tot a l'administrador del compte. Té dos modes, Governance (un rol amb permís especial se'l pot saltar) i Compliance (ningú no pot, ni el root). És per a retenció legal. Només es pot activar en crear el bucket. Per a les còpies de la base de dades de MercadoFresco tindria sentit; per a les fotos, no.
Migrar /var/www/fotos amb aws s3 sync
Arriba el moment. Les 40.000 fotos del servidor de l'oficina se'n van a S3.
# Assaig en sec: mostra què faria SENSE fer res. Fes-ho sempre primer.
aws s3 sync /var/www/fotos s3://mercadofresco-catalogo-fotos/productos/ \
--dryrun \
--profile mercadofresco-dev
# Migració real
aws s3 sync /var/www/fotos s3://mercadofresco-catalogo-fotos/productos/ \
--storage-class STANDARD \
--exclude "*" \
--include "*.jpg" --include "*.jpeg" --include "*.png" --include "*.webp" \
--metadata-directive REPLACE \
--cache-control "public, max-age=86400" \
--profile mercadofresco-devQuè fa cada opció:
syncés incremental: compara mida i data de modificació, i només puja el que ha canviat. Es pot interrompre i rellançar sense duplicar feina, que és justament el que cal per migrar 40.000 fitxers per una connexió d'oficina.--dryrun: imprescindible abans de qualsevolsyncamb destinació nova.--exclude "*"seguit de diversos--include: l'ordre importa. Primer s'exclou tot i després es readmeten les extensions desitjades. Així no s'hi colen.DS_Store,Thumbs.dbni còpies.bak.--cache-control: es desa com a metadada i el respectaran els navegadors i, més endavant, CloudFront (03-04). Un dia de memòria cau per a fotos que gairebé no canvien mai.
Verificació després de la migració:
# Nombre de fitxers a l'origen
find /var/www/fotos -type f \( -name "*.jpg" -o -name "*.png" -o -name "*.webp" \) | wc -l
# Nombre d'objectes i mida total a la destinació
aws s3 ls s3://mercadofresco-catalogo-fotos/productos/ --recursive --summarize \
--human-readable --profile mercadofresco-dev | tail -3Per a volums molt grans hi ha opcions específiques que convé conèixer encara que no les fem servir:
AWS DataSync per a transferències massives i recurrents per xarxa, i la família AWS Snowball
per quan moure les dades per internet trigaria més que enviar-les físicament en un dispositiu.
Per als 20 GB de MercadoFresco, sync fa de sobres.
aws s3 davant d'aws s3api
La CLI ofereix dues interfícies diferents per a S3, i confondre-les provoca molta frustració.
aws s3 |
aws s3api |
|
|---|---|---|
| Què és | Comandes d'alt nivell, estil Unix | Correspondència 1:1 amb les operacions de l'API |
| Comandes | ls, cp, mv, rm, sync, mb, rb, presign |
put-object, get-object, list-object-versions, put-bucket-policy… |
| Multipart automàtic | Sí, per a fitxers grans | No, s'ha d'orquestrar a mà |
| Recursivitat | --recursive |
Cal paginar |
| Control fi | Limitat | Total: qualsevol paràmetre de l'API |
| Quan fer-lo servir | Dia a dia: copiar, sincronitzar, llistar | Configurar el bucket, versions, polítiques, ACL |
Regla pràctica: mou dades amb aws s3, configura amb aws s3api.
# Alt nivell: còmode i suficient el 90 % del temps
aws s3 cp informe.csv s3://mercadofresco-informes-analitica/informes/2026/07/ \
--profile mercadofresco-dev
aws s3 ls s3://mercadofresco-catalogo-fotos/productos/frutas/ --profile mercadofresco-dev
# Baix nivell: quan cal un paràmetre que l'alt nivell no exposa
aws s3api put-object \
--bucket mercadofresco-informes-analitica \
--key informes/2026/07/ventas.csv \
--body informe.csv \
--server-side-encryption aws:kms \
--content-type text/csv \
--tagging "Proyecto=mercadofresco&Componente=analitica&Propietario=sara" \
--profile mercadofresco-dev --region eu-west-1Permisos: Block Public Access, polítiques de bucket i ACL
Les filtracions de dades per buckets S3 mal configurats han estat titular de premsa moltes vegades. AWS hi va respondre canviant els valors per defecte: avui tot bucket nou neix completament privat i amb Block Public Access activat a escala de compte i de bucket.
# Verificar l'estat (ha de donar true a les quatre opcions)
aws s3api get-public-access-block \
--bucket mercadofresco-catalogo-fotos \
--profile mercadofresco-dev --region eu-west-1{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}Els quatre interruptors, que molta gent activa o desactiva sense saber què fa cadascun:
| Opció | Què impedeix |
|---|---|
BlockPublicAcls |
Que es creïn ACL públiques noves |
IgnorePublicAcls |
Que les ACL públiques existents facin efecte |
BlockPublicPolicy |
Que s'afegeixi una política de bucket que concedeixi accés públic |
RestrictPublicBuckets |
Que una política pública ja existent funcioni per a usuaris anònims |
La postura de MercadoFresco és deixar Block Public Access activat a tots els buckets, sense excepció. Les fotos es serviran públicament a través de CloudFront amb un control d'accés d'origen, no obrint el bucket. Això es munta a la lliçó 03-04.
Polítiques de bucket
Una política de bucket és un document JSON d'IAM adjunt al bucket que diu qui pot fer què. Exemple real de MercadoFresco: permetre que només el rol de les instàncies de la botiga llegeixi les fotos, i obligar que tot el trànsit faci servir HTTPS.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PermitirLecturaAlRolDeLaTienda",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:role/rol-mercadofresco-tienda"
},
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::mercadofresco-catalogo-fotos",
"arn:aws:s3:::mercadofresco-catalogo-fotos/*"
]
},
{
"Sid": "DenegarTodoLoQueNoSeaHTTPS",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mercadofresco-catalogo-fotos",
"arn:aws:s3:::mercadofresco-catalogo-fotos/*"
],
"Condition": {
"Bool": {"aws:SecureTransport": "false"}
}
}
]
}aws s3api put-bucket-policy \
--bucket mercadofresco-catalogo-fotos \
--policy file://politica-bucket-fotos.json \
--profile mercadofresco-dev --region eu-west-1Dos detalls fonamentals:
s3:ListBucketes concedeix sobre el bucket (arn:aws:s3:::bucket), mentre ques3:GetObjectes concedeix sobre els objectes (arn:aws:s3:::bucket/*). Són ARN diferents i confondre'ls és l'error de política més freqüent.- Un
Denyexplícit guanya sempre sobre qualsevolAllow, vingui d'on vingui. Per això la segona instrucció és una defensa sòlida: ningú, ni l'administrador, no pot accedir per HTTP sense xifrar. La lògica completa d'avaluació de permisos és la lliçó 04-01.
ACL: llegat
Les ACL (Access Control Lists) són el mecanisme original del 2006, anterior a IAM. Concedeixen permisos objecte a objecte a comptes o grups predefinits.
AWS recomana no fer-les servir. Des del 2023, els buckets nous neixen amb Object Ownership a
«Bucket owner enforced», que les desactiva per complet. Només les has de conèixer per a dues coses:
reconèixer-les en heretar un compte antic, i saber que si un tutorial et diu --acl public-read,
aquest tutorial està desactualitzat. Fes servir polítiques de bucket.
URL signades prèviament: els informes de la Sara sense credencials
La Sara, l'analista de negoci, necessita descarregar l'informe mensual de vendes. No té usuari d'AWS, no n'ha de tenir, i el bucket és privat. La solució és una URL signada prèviament: un enllaç temporal que incorpora una signatura criptogràfica i caduca.
"""
Genera una URL temporal de descàrrega per a un informe de MercadoFresco.
Executar amb el perfil mercadofresco-dev configurat (lliçó 01-05).
"""
import boto3
from botocore.exceptions import ClientError
BUCKET = "mercadofresco-informes-analitica"
REGION = "eu-west-1"
def url_de_descarrega(clau: str, segons: int = 3600) -> str | None:
"""Retorna una URL signada prèviament de descàrrega, o None si alguna cosa falla.
:param clau: clau de l'objecte, p. ex. 'informes/2026/07/ventas-julio.csv'
:param segons: validesa de l'enllaç. Màxim 7 dies amb credencials d'usuari.
"""
# La signatura v4 exigeix que el client conegui la regió del bucket.
s3 = boto3.session.Session(profile_name="mercadofresco-dev").client(
"s3", region_name=REGION
)
try:
return s3.generate_presigned_url(
ClientMethod="get_object",
Params={"Bucket": BUCKET, "Key": clau},
ExpiresIn=segons,
)
except ClientError as e:
print(f"No s'ha pogut generar l'URL: {e}")
return None
def url_de_pujada(clau: str, segons: int = 900) -> dict | None:
"""URL signada prèviament de PUJADA, amb condicions que limiten què es pot pujar.
Es fa servir perquè un proveïdor extern pugi fotos de producte sense tenir
credencials d'AWS ni accés a la resta del bucket.
"""
s3 = boto3.session.Session(profile_name="mercadofresco-dev").client(
"s3", region_name=REGION
)
try:
return s3.generate_presigned_post(
Bucket="mercadofresco-catalogo-fotos",
Key=clau,
Fields={"Content-Type": "image/jpeg"},
Conditions=[
{"Content-Type": "image/jpeg"}, # només JPEG
["content-length-range", 1024, 5242880], # entre 1 KB i 5 MB
],
ExpiresIn=segons,
)
except ClientError as e:
print(f"No s'ha pogut generar l'URL de pujada: {e}")
return None
if __name__ == "__main__":
enllac = url_de_descarrega("informes/2026/07/ventas-julio.csv", segons=3600)
print(f"Enllaç per a la Sara (vàlid 1 hora):\n{enllac}")L'essencial d'aquest mecanisme:
- Qui tingui l'enllaç el pot fer servir. No hi ha autenticació addicional: l'enllaç és la credencial. Per això els terminis han de ser curts.
- L'URL hereta els permisos de qui la signa. Si el perfil que signa no pot llegir l'objecte, l'URL tampoc no funcionarà.
- Caducitat màxima: 7 dies amb credencials d'usuari IAM; 1 hora si se signa des d'un rol amb credencials temporals, com seria el cas dins d'una Lambda.
generate_presigned_postambConditionsés la manera correcta d'acceptar pujades de tercers: limita tipus i mida abans que el fitxer arribi.
Xifratge en repòs i en trànsit
Tot objecte nou a S3 es xifra en repòs automàticament des del gener del 2023. No cal fer res per tenir xifratge; la decisió és només qui gestiona la clau.
| Mode | Qui gestiona la clau | Cost extra | Auditoria de l'ús de la clau | Quan |
|---|---|---|---|---|
SSE-S3 (AES256) |
AWS, de manera transparent | Cap | No | Valor per defecte; suficient gairebé sempre |
SSE-KMS (aws:kms) |
Tu, a AWS KMS | Sí, per clau i per petició | Sí, a CloudTrail | Dades regulades, separació de funcions |
| SSE-C | Tu, enviant la clau a cada petició | Cap a AWS | No | Requisits molt específics |
| DSSE-KMS | Doble xifratge amb KMS | Més gran | Sí | Requisits governamentals |
Decisió de MercadoFresco: SSE-S3 per a les fotos (són dades públiques a la pràctica, no compensa el cost per petició de KMS) i SSE-KMS per als informes de vendes i les còpies de la base de dades, que contenen dades de negoci i on interessa el registre de qui desxifra.
# Forçar SSE-KMS per defecte al bucket d'informes
aws s3api put-bucket-encryption \
--bucket mercadofresco-informes-analitica \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "alias/mercadofresco-datos"
},
"BucketKeyEnabled": true
}]
}' \
--profile mercadofresco-dev --region eu-west-1BucketKeyEnabled: true redueix fins a un 99 % les crides a KMS i el seu cost associat; activa'l
sempre que facis servir SSE-KMS. La gestió de claus es veu a fons a la lliçó 04-02.
En trànsit, tot el trànsit amb S3 va per HTTPS. Per garantir que ningú faci servir HTTP en clar
hi ha la instrucció DenegarTodoLoQueNoSeaHTTPS de la política de bucket anterior.
Allotjament d'un lloc estàtic
S3 pot servir un lloc web estàtic directament: HTML, CSS, JavaScript i imatges, sense cap servidor.
aws s3 website s3://mercadofresco-tienda-web-desarrollo/ \
--index-document index.html \
--error-document error.html \
--profile mercadofresco-devEl resultat és una URL del tipus
http://mercadofresco-tienda-web-desarrollo.s3-website-eu-west-1.amazonaws.com.
Limitacions que cal conèixer abans d'emocionar-se:
- Només HTTP, sense HTTPS. El punt d'enllaç de lloc web estàtic no admet TLS.
- Sense domini propi amb certificat.
- Exigeix el bucket públic, cosa que xoca amb la política de Block Public Access.
Per això, en producció no es fa servir així. L'arquitectura correcta és bucket privat + CloudFront al davant amb Origin Access Control: dona HTTPS, domini propi, memòria cau en més de 400 ubicacions de vora i protecció. Això és exactament la lliçó 03-04. El mode lloc web d'S3 queda per a proves ràpides del Luis.
Esdeveniments d'S3: el disparador de les miniatures
S3 pot notificar quan passa alguna cosa en un bucket. És la porta d'entrada a les arquitectures orientades a esdeveniments, i per a MercadoFresco resol un problema concret: les fotos originals pesen massa per al llistat de productes i calen miniatures.
Esdeveniments disponibles i destinacions possibles:
| Tipus d'esdeveniment | Quan es dispara |
|---|---|
s3:ObjectCreated:* |
Qualsevol creació (Put, Post, Copy, fi de multipart) |
s3:ObjectRemoved:* |
Esborrament o marcador d'esborrament |
s3:ObjectRestore:* |
Restauració des de Glacier completada |
s3:LifecycleTransition |
Un objecte ha canviat de classe per una regla de cicle de vida |
s3:ReducedRedundancyLostObject |
Pèrdua d'un objecte (classe obsoleta) |
| Destinació | Quan triar-la |
|---|---|
| AWS Lambda | Processar l'objecte amb codi propi: el nostre cas |
| Amazon SQS | Encuar per a processament per lots o amb reintents (mòdul 7) |
| Amazon SNS | Notificar diversos subscriptors alhora (mòdul 7) |
| EventBridge | Encaminament avançat amb regles i filtres (mòdul 7) |
El flux que muntarem:
flowchart LR
A["El Luis puja<br/>naranjas.jpg"] --> B["Bucket<br/>mercadofresco-catalogo-fotos<br/>prefix productos/"]
B -->|"s3:ObjectCreated:*"| C["Notificacio d'esdeveniment"]
C --> D["Funcio Lambda<br/>mercadofresco-generar-miniaturas"]
D --> E["Escriu al<br/>prefix miniaturas/<br/>200x200 px"]
E -.->|"regla de cicle de vida"| F["ONEZONE_IA als 30 dies"]
Configuració de la notificació (la funció s'escriu a 02-05):
aws s3api put-bucket-notification-configuration \
--bucket mercadofresco-catalogo-fotos \
--notification-configuration '{
"LambdaFunctionConfigurations": [{
"Id": "generar-miniaturas-al-subir",
"LambdaFunctionArn": "arn:aws:lambda:eu-west-1:111122223333:function:mercadofresco-generar-miniaturas",
"Events": ["s3:ObjectCreated:*"],
"Filter": {"Key": {"FilterRules": [
{"Name": "prefix", "Value": "productos/"},
{"Name": "suffix", "Value": ".jpg"}
]}}
}]
}' \
--profile mercadofresco-dev --region eu-west-1El filtre per prefix i sufix és imprescindible. Sense ell, la Lambda es dispararia també en escriure les miniatures al mateix bucket, que al seu torn generarien un altre esdeveniment: un bucle recursiu infinit que és una de les maneres més ràpides i més cares d'equivocar-se a AWS.
Dos advertiments sobre la semàntica d'aquests esdeveniments: el lliurament és almenys una vegada (la funció pot rebre el mateix esdeveniment dues vegades, així que ha de ser idempotent) i no està garantit l'ordre. Aquí només deixem muntat el disparador; el codi l'escrivim a la lliçó 02-05.
Multipart upload i Transfer Acceleration
Multipart upload trosseja un objecte gran i puja les parts en paral·lel. És obligatori per sobre de 5 GB i recomanable a partir de 100 MB.
Avantatges: més rendiment per paral·lelisme, reintent d'una sola part si falla la xarxa, i
possibilitat de pausar i reprendre. aws s3 cp i aws s3 sync ho fan automàticament; només
necessites s3api si programes el procés a mà.
# Ajustar els llindars de la CLI per a una connexió ràpida
aws configure set default.s3.multipart_threshold 64MB
aws configure set default.s3.multipart_chunksize 16MB
aws configure set default.s3.max_concurrent_requests 20El risc: si una pujada multipart s'interromp, les parts ja pujades es queden i es
facturen, i no apareixen en un aws s3 ls normal. Per això incloem la regla
AbortIncompleteMultipartUpload al cicle de vida. Per veure-les:
aws s3api list-multipart-uploads --bucket mercadofresco-catalogo-fotos \
--profile mercadofresco-dev --region eu-west-1Transfer Acceleration encamina les pujades a través de la ubicació de vora de CloudFront més propera al client, i d'allà per la xarxa troncal d'AWS fins al bucket. Accelera de manera significativa quan qui puja és lluny de la regió. Té cost addicional (≈0,04 USD/GB) i per a MercadoFresco, que puja des d'Espanya a Irlanda, no compensa. Seria útil si un proveïdor de Sud-amèrica pugés catàlegs de fotos.
# Comprovar si valdria la pena, amb l'eina de comparacio d'AWS:
# https://s3-accelerate-speedtest.s3-accelerate.amazonaws.com/en/accelerate-speed-comparsion.html
aws s3api put-bucket-accelerate-configuration \
--bucket mercadofresco-catalogo-fotos --accelerate-configuration Status=Enabled \
--profile mercadofresco-dev --region eu-west-1Costos d'S3 i com no endur-se sorpreses
La factura d'S3 té quatre components, i gairebé tothom només mira el primer.
| Component | Preu orientatiu (eu-west-1) |
Comentari |
|---|---|---|
| Emmagatzematge | 0,023 USD/GB-mes (Standard) | El més visible i sovint el menor |
| Peticions | PUT: 0,0054 USD per 1.000 GET: 0,00043 USD per 1.000 |
Domina el cost amb molts objectes petits |
| Transferència de sortida | 0,09 USD/GB cap a internet | Sol ser el més gran. Entrada gratis; sortida a una altra regió, també de pagament |
| Recuperació i gestió | Variable per classe | Recuperar de Glacier, monitoratge d'Intelligent-Tiering, inventari |
Càlcul realista per a MercadoFresco: 20 GB de fotos, 500.000 visites al mes amb 10 fotos vistes per visita (5.000.000 de peticions GET), foto mitjana de 200 KB:
Emmagatzematge: 20 GB × 0,023 = 0,46 USD
Peticions GET: 5.000.000 / 1.000 × 0,00043 = 2,15 USD
Transferència: 5.000.000 × 200 KB = 1.000 GB
1.000 GB × 0,09 = 90,00 USD
------------------------------------------------------------------
Total ≈ 92,61 USD/mesEl 97 % del cost és transferència de sortida. I aquesta dada justifica per si sola la lliçó 03-04: posant CloudFront al davant, la majoria de les peticions se serveixen des de la memòria cau de vora, la transferència d'S3 a CloudFront és gratuïta, i el preu per GB cap a internet és menor. La factura pot baixar a menys d'una tercera part, i a més el web anirà més ràpid.
Eines de control:
# Mida i nombre d'objectes per bucket
aws s3 ls s3://mercadofresco-catalogo-fotos --recursive --summarize --human-readable \
--profile mercadofresco-dev | tail -3- S3 Storage Lens ofereix un tauler gratuït amb mètriques d'ús i recomanacions d'estalvi.
- S3 Inventory genera un informe periòdic en CSV o Parquet amb tots els objectes, la seva classe i la seva mida: la manera correcta d'auditar buckets amb milions d'objectes sense llistar-los un a un.
- El pressupost
presupuesto-mensual-mercadofrescode la lliçó 01-02 continua sent la xarxa de seguretat.
Neteja de la lliçó. Si has creat buckets de prova, elimina'ls. Un bucket amb versionatge requereix esborrar també les versions i els marcadors:
aws s3 rm s3://mi-bucket-de-pruebas --recursive --profile mercadofresco-dev aws s3api delete-objects --bucket mi-bucket-de-pruebas \\ --delete "$(aws s3api list-object-versions --bucket mi-bucket-de-pruebas \\ --query '{Objects: Versions[].{Key:Key,VersionId:VersionId}}' --output json)" \\ --profile mercadofresco-dev aws s3 rb s3://mi-bucket-de-pruebas --profile mercadofresco-dev
Errors Habituals i Consells
- Tractar S3 com un disc. Canviar el nom d'un prefix amb 40.000 objectes són 80.000 operacions i minuts d'espera. Dissenya bé les claus des del principi.
- Fer un bucket públic «perquè funcioni ràpid». És l'origen de la majoria de les filtracions publicades. Deixa Block Public Access activat i fes servir CloudFront amb OAC.
- Oblidar
LocationConstraintfora d'us-east-1, o posar-lo dins d'us-east-1. Tots dos fallen, amb missatges poc clars. - No configurar
AbortIncompleteMultipartUpload. Cost invisible que creix per sempre. - Activar el versionatge i no caducar les versions antigues. El bucket s'infla sense límit i ningú no entén per què la factura puja si «no es puja res de nou».
- Confondre l'ARN del bucket amb el dels objectes a les polítiques:
ListBucketva sobre el bucket,GetObjectsobrebucket/*. - Posar una Lambda a escoltar esdeveniments del mateix bucket on escriu. Bucle infinit. Filtra sempre per prefix, o fes servir buckets diferents.
- Fer servir
--acl public-readperquè ho diu un tutorial antic. Les ACL estan desactivades per defecte als buckets nous i AWS en desaconsella l'ús. - Pujar a Standard-IA dades de vida curta. El mínim de 30 dies de facturació fa que surti més car que Standard.
- Mirar només el cost d'emmagatzematge. La transferència de sortida sol ser el 90 % de la factura d'S3.
- Consell: executa
syncamb--dryrunsempre la primera vegada. Una destinació mal escrita pot copiar 40.000 fitxers al prefix equivocat, i desfer-ho és més feina que fer-ho.
Exercicis
Exercici 1: dissenyar el cicle de vida de les còpies de la base de dades
MercadoFresco desarà a mercadofresco-copias-basedatos els abocaments diaris de la base de dades
de comandes, sota el prefix copias/base-datos/. Cada abocament ocupa 2 GB. Els requisits són:
- Els últims 30 dies han de poder restaurar-se en minuts.
- Entre 30 dies i 1 any, la restauració pot trigar hores.
- Entre 1 i 7 anys (retenció legal fiscal) es conserven al cost mínim possible.
- Passats 7 anys s'esborren automàticament.
Escriu la regla de cicle de vida en JSON i calcula el cost mensual en règim estacionari, comparant-lo amb deixar-ho tot a Standard. Fes servir: Standard 0,023; Glacier Flexible 0,0036; Deep Archive 0,00099 USD/GB-mes.
Exercici 2: la política de bucket dels informes
La Sara ha de poder llegir els informes sota informes/, però no esborrar-los ni tocar altres prefixos.
El rol rol-mercadofresco-analitica ha de poder escriure a informes/. Ningú no ha d'accedir sense
HTTPS ni pujar objectes sense xifrar amb KMS.
Escriu la política de bucket completa i explica per què l'última condició necessita un Deny i no
un Allow.
Exercici 3: decidir on va cada dada
Per a cada dada de MercadoFresco, indica bucket, prefix, classe d'emmagatzematge inicial, si actives versionatge i quina regla de cicle de vida aplicaries:
- A) Les 40.000 fotos originals del catàleg, en alta resolució.
- B) Les miniatures 200×200 generades automàticament a partir de les anteriors.
- C) Els registres d'accés del servidor web, uns 3 GB al dia, consultats només si hi ha una incidència i obligatoris durant 90 dies.
- D) L'informe mensual de vendes que la Sara descarrega per URL signada prèviament.
Solucions
Solució 1.
{
"Rules": [
{
"ID": "copias-base-datos-retencion-fiscal",
"Filter": {"Prefix": "copias/base-datos/"},
"Status": "Enabled",
"Transitions": [
{"Days": 30, "StorageClass": "GLACIER"},
{"Days": 365, "StorageClass": "DEEP_ARCHIVE"}
],
"Expiration": {"Days": 2555}
},
{
"ID": "limpiar-multipart",
"Filter": {},
"Status": "Enabled",
"AbortIncompleteMultipartUpload": {"DaysAfterInitiation": 7}
}
]
}Volum en règim estacionari (2 GB/dia):
Standard (0-30 dies): 30 × 2 GB = 60 GB Glacier Flexible (30-365): 335 × 2 GB = 670 GB Deep Archive (365-2555): 2190 × 2 GB = 4.380 GB Total = 5.110 GB
| Configuració | Càlcul | Cost mensual |
|---|---|---|
| Amb cicle de vida | 60×0,023 + 670×0,0036 + 4.380×0,00099 | 8,13 USD |
| Tot a Standard | 5.110 × 0,023 | 117,53 USD |
| Estalvi | 109,40 USD/mes (93 %) |
Notes de disseny: 2.555 dies són 7 anys. Deep Archive té 180 dies de permanència mínima, sense problema aquí perquè els objectes hi arriben amb 365 dies de vida i s'hi queden més de sis anys. I el requisit «restaurar en minuts els últims 30 dies» és el que impedeix baixar a Glacier abans: Glacier Flexible triga de minuts a 12 hores segons el mode de recuperació.
Solució 2.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SaraLeeInformes",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::111122223333:user/sara"},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mercadofresco-informes-analitica/informes/*"
},
{
"Sid": "SaraListaSoloElPrefijoInformes",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::111122223333:user/sara"},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::mercadofresco-informes-analitica",
"Condition": {"StringLike": {"s3:prefix": "informes/*"}}
},
{
"Sid": "RolAnaliticaEscribeInformes",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::111122223333:role/rol-mercadofresco-analitica"},
"Action": ["s3:PutObject", "s3:GetObject"],
"Resource": "arn:aws:s3:::mercadofresco-informes-analitica/informes/*"
},
{
"Sid": "DenegarSinHTTPS",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mercadofresco-informes-analitica",
"arn:aws:s3:::mercadofresco-informes-analitica/*"
],
"Condition": {"Bool": {"aws:SecureTransport": "false"}}
},
{
"Sid": "DenegarSubidasSinCifradoKMS",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::mercadofresco-informes-analitica/*",
"Condition": {
"StringNotEquals": {"s3:x-amz-server-side-encryption": "aws:kms"}
}
}
]
}Per què les dues últimes necessiten Deny i no Allow. Un Allow només concedeix: si simplement
«permetessis HTTPS», qualsevol altra política —una política d'identitat d'IAM adjunta a l'usuari,
per exemple— podria continuar concedint l'accés per HTTP, perquè els permisos se sumen. Un
Deny explícit, en canvi, té precedència absoluta: cap política de cap capa no el pot
anul·lar. Per a requisits de seguretat que s'han de complir sempre i sense excepció, la
formulació correcta és prohibir la condició no desitjada, no permetre la desitjada.
Detall addicional: sense la condició s3:prefix a ListBucket, la Sara podria llistar tot el bucket i
veure els noms d'objectes d'altres prefixos, encara que no els pogués descarregar. Noms que de vegades
revelen més del que sembla.
Solució 3.
| Dada | Bucket i prefix | Classe inicial | Versionatge | Cicle de vida |
|---|---|---|---|---|
| A) Fotos originals | mercadofresco-catalogo-fotos / productos/ |
Standard | Sí: són l'original i no es poden regenerar; protegeix de l'rm accidental |
IA a 90 d, Glacier IR a 365 d, Deep Archive a 3 anys; versions antigues caduquen a 90 d |
| B) Miniatures | mercadofresco-catalogo-fotos / miniaturas/ |
Standard, i One Zone-IA als 30 d | No: són regenerables amb la Lambda; el versionatge només hi afegiria cost | A One Zone-IA als 30 d. Prefix diferent del d'origen per no crear bucle d'esdeveniments |
| C) Registres del servidor web | mercadofresco-registros-web / nginx/AAAA/MM/DD/ |
Standard | No | IA a 30 d, caducitat a 90 d exactament (el requisit legal). Particionar per data a la clau facilita consultar-los i esborrar-los |
| D) Informe mensual de vendes | mercadofresco-informes-analitica / informes/AAAA/MM/ |
Standard amb SSE-KMS | Sí: és una dada de negoci que no s'ha de perdre per sobreescriptura | IA a 60 d, caducitat a 2 anys. Accés només per URL signada prèviament, bucket privat |
Observació transversal: el prefix de les miniatures ha d'estar fora del prefix que dispara
l'esdeveniment (productos/), o el filtre de la notificació les ha d'excloure. És la protecció contra el
bucle recursiu esmentat abans.
Conclusió
MercadoFresco ja té les seves fotos on han de ser. Has entès que S3 és un magatzem d'objectes i no un sistema de fitxers: no hi ha carpetes, només claus planes on la barra és un caràcter més; els objectes són immutables; canviar el nom d'un prefix significa copiar i esborrar. A canvi d'aquestes restriccions s'obté escala pràcticament il·limitada, onze nous de durabilitat per replicació automàtica en tres o més zones de disponibilitat, i un cost per GB unes tretze vegades menor que EFS.
Saps construir noms de bucket vàlids en un espai de noms global, amb el parany de
LocationConstraint inclòs, i tens una convenció pròpia (mercadofresco-<component>- <propòsit>). Domines les set classes d'emmagatzematge i les seves compensacions —latència, cost
de recuperació, permanència mínima, nombre d'AZ— i has escrit regles de cicle de vida que
refreden les fotos del catàleg automàticament, mouen les miniatures a One Zone-IA per ser
regenerables, caduquen els informes als dos anys, esborren les versions antigues i —la regla que
tothom oblida— avorten les càrregues multipart incompletes que es facturen en silenci.
Has activat el versionatge i has practicat la recuperació real d'un esborrament accidental eliminant
el marcador d'esborrament, i coneixes MFA Delete i Object Lock per als casos que exigeixen
retenció inviolable. Has migrat /var/www/fotos amb aws s3 sync, amb el seu --dryrun
obligatori i els seus filtres d'inclusió, i tens clara la divisió de feina entre aws s3
per moure dades i aws s3api per configurar.
En seguretat, has vist per què avui els buckets neixen tancats: Block Public Access amb els seus
quatre interruptors, polítiques de bucket en JSON amb la distinció crítica entre l'ARN del
bucket i el dels objectes, la precedència absoluta del Deny explícit, i les ACL com a llegat
que no has de fer servir. Has generat URL signades prèviament amb boto3 perquè la Sara descarregui els seus informes
sense tenir credencials d'AWS, i també per acceptar pujades de tercers amb límits de tipus i
mida. Saps que tot es xifra en repòs per defecte i quan compensa passar de SSE-S3 a
SSE-KMS amb BucketKeyEnabled.
Has vist l'allotjament estàtic i per què no es fa servir així en producció, has deixat configurada la notificació d'esdeveniments que dispararà la generació de miniatures —amb el filtre per prefix que evita el bucle infinit—, coneixes multipart upload i Transfer Acceleration, i has fet el càlcul que ordena tota la resta: a la factura d'S3 de MercadoFresco, el 97 % és transferència de sortida, no emmagatzematge.
Queden les fotos resoltes i falta el cor del negoci. Les comandes de MercadoFresco continuen a la base de dades del servidor de l'oficina, amb la seva còpia de seguretat poc fiable i la seva impossibilitat de créixer. A la lliçó 02-04, «Amazon RDS», migrarem aquesta base de dades a un servei gestionat: veurem què aporta davant d'instal·lar PostgreSQL en una EC2, muntarem Multi-AZ amb rèplica síncrona en espera, crearem rèpliques de lectura perquè els informes de la Sara no castiguin producció, i tancarem definitivament el problema 2 amb còpies automàtiques i restauració a un punt en el temps.
Curs d'AWS
Mòdul 1: Introducció a AWS
- Què és AWS?
- Configuració del teu compte d'AWS
- Infraestructura global d'AWS
- Consola d'administració d'AWS
- AWS CLI i SDK
Mòdul 2: Serveis principals d'AWS
Mòdul 3: Xarxes i lliurament de contingut
- Amazon VPC
- Grups de seguretat i llistes de control d'accés
- Elastic Load Balancing
- Amazon CloudFront
- Route 53
Mòdul 4: Seguretat i identitat
- AWS Identity and Access Management (IAM)
- AWS Key Management Service (KMS)
- Secrets Manager i Parameter Store
- AWS Shield
- AWS WAF
Mòdul 5: Monitoratge i gestió
- Amazon CloudWatch
- AWS X-Ray i traçabilitat distribuïda
- AWS CloudTrail
- AWS Config
- AWS Trusted Advisor
Mòdul 6: Bases de dades
- Com triar la base de dades adequada
- Amazon DynamoDB
- Amazon Aurora
- Amazon Redshift
- Amazon ElastiCache
Mòdul 7: Integració d'aplicacions
- Amazon SQS
- Amazon SNS
- Amazon EventBridge
- AWS Step Functions
- Patrons d'integració: idempotència, reintents i cues de missatges fallits
