Una foto subida es una petición web
Una tienda de Valencia deja que sus clientes suban la foto de un artículo defectuoso. La foto se guarda en un bucket de S3, un espacio para archivos en la nube. Tu código no entra en ninguna máquina para guardarla. Envía una petición por la web y lee la respuesta.
Esta lección explica qué es un servicio en la nube, dónde funciona y quién cuida de qué.
Al final de esta lección
Nota
Puedo decir qué son una región, un servicio y una llamada a la API.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Servicio | una herramienta ya hecha que usas por la web | |
| Llamada a la API | una petición a un servicio y su respuesta | |
| Región | la zona del mundo donde funciona un servicio | eu-south-2 |
| Bucket | un contenedor con nombre para archivos en S3 | |
| Responsabilidad compartida | el proveedor y el cliente cuidan cada uno una parte del sistema |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Lo que este módulo no es
Nota
No necesitas una cuenta de AWS y no se despliega nada. Nunca escribirás una clave, una contraseña ni un número de cuenta reales. Tampoco es una lección sobre costes ni facturas. Lees, sin conexión, respuestas con la forma de las reales y escribes Python que las trata.
Un servicio es una API que llamas
Un proveedor de nube tiene ordenadores enormes y alquila lo que hacen. Cada herramienta alquilada es un servicio. S3 guarda archivos. SQS guarda mensajes en una cola. DynamoDB guarda elementos en tablas.
Usas un servicio con una llamada a la API: una petición que dice el nombre de la llamada, como list_objects_v2, y los datos que necesita. La respuesta vuelve en forma de datos.
Una llamada y su respuesta
call = {"service": "s3", "operation": "list_objects_v2", "Bucket": "tienda-fotos"}
answer = {
"Name": "tienda-fotos",
"KeyCount": 2,
"IsTruncated": False,
"Contents": [
{"Key": "defectos/cafetera.png", "Size": 2048, "StorageClass": "STANDARD"},
{"Key": "defectos/tostadora.png", "Size": 3072, "StorageClass": "STANDARD"},
],
}
print("servicio:", call["service"])
print("llamada:", call["operation"])
print("claves:", answer["KeyCount"])
for item in answer["Contents"]:
print(item["Key"], item["Size"])
# Cambia el Size de la tostadora a 5000 y pulsa Run otra vez.
Una llamada fallida también responde
No todas las llamadas funcionan. Puede faltar una clave o no existir un bucket. Entonces el servicio responde con un error: un Code que nombra el problema y un estado HTTP.
Tu código debe mirar primero si hay error. Una prueba como "Contents" in answer solo vale si la llamada funcionó.
Distinguir una buena respuesta de un error
good = {"KeyCount": 1, "Contents": [{"Key": "leeme.txt", "Size": 5}]}
bad = {"error": {"Code": "NoSuchBucket", "HTTPStatusCode": 404}}
for answer in [good, bad]:
if "error" in answer:
print("falló:", answer["error"]["Code"], answer["error"]["HTTPStatusCode"])
else:
print("funcionó, claves:", answer["KeyCount"])
# Cambia "NoSuchBucket" por "NoSuchKey" y pulsa Run otra vez.
Un error frecuente
Advertencia
Mucha gente cree que una respuesta vacía es un error. No lo es. Si pides a DynamoDB un elemento que no existe, responde {} con un buen estado. Busca una entrada error, con su Code. Una respuesta vacía significa «no encontré nada».
Una región es donde funciona un servicio
Un proveedor tiene centros de datos en muchos lugares. Una región es una de esas zonas, como eu-south-2, que está en España. Eliges la región al crear un bucket y los archivos se quedan allí.
Elige una región cercana a tus usuarios para que las respuestas lleguen rápido. Las respuestas también dicen en qué región está el bucket.
Leer la región de cada bucket
answer = {
"Buckets": [
{"Name": "tienda-fotos", "BucketRegion": "eu-south-2", "BucketArn": "arn:aws:s3:::tienda-fotos"},
{"Name": "tienda-copias", "BucketRegion": "us-east-1", "BucketArn": "arn:aws:s3:::tienda-copias"},
],
"Owner": {"DisplayName": "tienda", "ID": "id-propietario"},
}
for bucket in answer["Buckets"]:
print(bucket["Name"], "está en", bucket["BucketRegion"])
# Muestra solo los buckets de eu-south-2: añade un if dentro del bucle.
Proveedor y cliente se reparten el trabajo
El proveedor cuida los edificios, las máquinas y el programa del servicio. Tú cuidas lo que guardas en él y quién puede usarlo.
Esto es la responsabilidad compartida. Si dejas que cualquiera lea un bucket, esa fue tu decisión. Si un centro de datos se queda sin luz, le toca al proveedor resolverlo.
Quién cuida de qué
| Cosa | La cuida |
|---|---|
| El edificio y la electricidad | El proveedor |
| El programa de S3 en sí | El proveedor |
| Qué archivos subes | Tú |
| Quién puede leer un bucket | Tú |
| El código que llama al servicio | Tú |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.