<h1 style="color:#0055A4;">Cloud Computing</h1>
<h3 style="color:#b0b0b0;">Google Cloud Platform</h3>
---
La computación en la nube es una forma diferente de concebir y desplegar infraestructura tecnológica: en lugar de mantener recursos físicos dedicados podemos comprarlos bajo demanda, pagando solo por el uso que hagamos de ellos.
---
# Modelos de servicio
- `IaaS` Infraestructura como Servicio
- `PaaS` Plataforma como Servicio
- `SaaS` Software como Servicio
---
## Arquitectura Jerárquica: Regiones y Zonas
https://cloud.google.com/about/locations#network
**Zonas**: unidades básicas de despliegue
**Regiones**: áreas geográficas que contienen zonas
>[!Note]Ejemplo
> Identificador: `europe-west1-b`. Región: `europe-west1` (Bélgica). Zona: `b`
---
## Zonas y recursos
- Recursos zonales (p.e Compute Engine)
- Recursos regionales o multiregionales (p.e Storage)
- Recursos globales (p.e Cloud Build)
---
## Implicaciones de las regiones
- **Soberanía del dato**
- **Latencia**
- **Alta disponibilidad**
- Coste
- Disponibilidad de servicios
- Transferencia de datos
---
## Implicaciones de las zonas
- Alta disponibilidad
- Resiliencia
- Baja latencia entre zonas
---
## Estimación de latencias
- Entre zonas (misma región): ~1-5 ms
- Entre regiones:
- Mismo continente: 10-40 ms
- Diferente continente: 80-180 ms o más
:wink: https://www.gcping.com/
---
# Interacción con GCP
Permitir a los ingenieros gestionar, automatizar y consumir los recursos de GCP.
- Con la consola: `https://console.cloud.google.com/` <br><br>
- Usando `Cloud Shell`
- Usando el SDK de google (CLI)
- Con bibliotecas de lenguajes de programación
- A través del API :star:
---
## El SDK de Google
https://cloud.google.com/sdk
¡Instalemos el adecuado a nuestro equipo!
<div style="display: inline-flex; justify-content: center; align-items: center; gap: 32px;">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Windows_logo_-_2021.svg/512px-Windows_logo_-_2021.svg.png" width="64">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Icon-Mac.svg/256px-Icon-Mac.svg.png" width="64">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Tux.svg/1727px-Tux.svg.png" width="64">
</div>
---
### The CLI tools
- :arrow_right: `gcloud` (unified Google Cloud resource management)
- `bq` (Big query)
- `gsutil` (Cloud storage)
>[!Note] Hay otros instalables bajo demanda
---
### Básicos de `gcloud`
- Inicialización: `gcloud init`
- Autenticación: `gcloud auth`
- Estructura de una orden:
```bash
gcloud [GROUP] [COMMAND] [FLAGS]
```
- Multiconfiguración
```bash
gcloud config configuration list
```
---
### Ejemplos de gestión de recursos con `gcloud`
```bash!
gcloud compute instances list
gcloud compute instances start operaciones
gcloud compute instances stop operaciones
```
---
### El API HTTP de GCP
En GCP se accede a los recursos mediante peticiones HTTP(S) REST estandarizadas.
----
## Representational State Transfer
HTTP REST es un estilo de arquitectura para el diseño de servicios que utiliza el protocolo HTTP para intercambiar datos sobre un recurso
- Los recursos se identifican con una URL
- Las operaciones sobre los recursos son las de HTTP: \(C\)`POST`, \(R\)`GET`, (U)`PUT`, (D)`DELETE`
- Los datos del cuerpo de la petición generalmente son `JSON` o `XML`
- Es una arquitectura _stateless_
----
### Las VM como recursos en GCP
https://cloud.google.com/compute/docs/instances/get-list#rest
Universal Resource Locator:
```
https://compute.googleapis.com
/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
```
Hagamos una petición REST de tipo GET para obtener todas nuestras máquinas virtuales.
```bash
$ curl https://compute.googleapis.com/...
```
>[!Warning]¡Cuidado!
>En la URL anterior, sustituye `PROJECT_ID` y `ZONE` por los valores de tu entorno
----
### Pero no va a funcionar...
```json=
{
"error": {
"code": 401,
"message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"errors": [
{
"message": "Login Required.",
"domain": "global",
"reason": "required",
"location": "Authorization",
"locationType": "header"
}
],
"status": "UNAUTHENTICATED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "CREDENTIALS_MISSING",
"domain": "googleapis.com",
"metadata": {
"method": "compute.v1.InstancesService.List",
"service": "compute.googleapis.com"
}
}
]
}
}
```
Necesitamos identificarnos porque ...
**en GCP todo depende de quien seas**
(who is the `principal`)
<!-- .element: class="fragment" data-fragment-index="1" -->
----
### ¿Quién puede ser `principal`?
- 👤 Personas (o grupos): `oscarpoblacion@gmail.com`
- 🤖 Máquinas (workloads): `skynet@aso-git.iam.gserviceaccount.com`
- 👽 Especiales: `allUsers`
----
Hagamos una visita rápida al gestor de identidades de GCP, el Identity and Access Management
## IAM
----
### ...volvamos a `curl`
Necesitamos añadir la cabecera `Authorization` con algo que nos identifique como `👤 Oscar` con rol `owner`
```bash=
$ gcloud auth print-access-token
ya29.a0AQQ_BDRHr3zaAPTvBg2KIKkx...
```
Este tipo de tokens pertenece al protocolo de seguridad OAuth2, es un token de acceso opaco que autoriza al portador (`Bearer`) del mismo
----
### Probemos ahora:
```bash=
➜ curl https://compute.googleapis.com/compute/v1/projects/aso-git/zones/europe-west1-b/instances -H 'Authorization: Bearer ya29.a0A...'
```
----
### Implicaciones importantes
El API permite acceder de forma programática a todos los recursos de GCP. Podemos crear software que manipule la infraestructura (de hecho, lo haremos en este curso), lo que nos lleva a un concepto importante:
:::danger
<h4 style="color:red"> IaaC </h4>
<h4 style="color:red"> Infraestructura como Código </h4>
:::
<span style="float: right">...próximamente</span>
---
## Acceso a la shell de una VM
- Usando el cliente ssh desde la consola
- Usando `gcloud`
- Usando `ssh` clásico
---
### Usando el cliente ssh desde la consola
- Aburrido
- Lento
- Nada ágil para operaciones complejas
- Pero te saca de un apuro
---
### Usando `ssh`
https://hackmd.io/@ogarcia/ssh-y-google-cloud-engine
- [ ] Recordatorio del protocolo
- [ ] Generación de clave pública y privada
- [ ] Metadatos del proyecto vs claves por máquina
- [ ] El archivo `~/.ssh/config`
- [ ] Problema de las IP efímeras
- [ ] Firewall -> autorizar puerto 22
```bash
$ ssh usuario@ip-efimera
```
----
### Operaciones útiles con ssh
- `scp`
- `rsync`
- Agent forwarding
---
### Usando `gcloud`
```bash
$ gcloud compute ssh operaciones
$ gcloud compute ssh usuario@operaciones
```
```bash
$ gcloud compute scp archivo.txt usuario@instancia:~/destino
$ gcloud compute scp usuario@instancia:~/archivo.txt ./
```
---
### ¡Extra!
A través de `ssh` podemos ejecutar órdenes en la máquina remota
```bash
gcloud compute ssh operaciones \
--command "curl -s https://api.my-ip.io/v2/ip.json"
```
Podríamos instalar un programa que comunicara con un sistema de gestión y, a través de él, instalar todo lo que nos hiciera falta en esa máquina, o en mil máquinas 🤯
<!-- .element: style="margin-bottom:1.5em" class="fragment" data-fragment-index="1" -->
<span style="float: right;color:gray">Ansible, automated provisioning</span>
<span style="float: right">...This is the way</span>
<!-- .element: class="fragment" data-fragment-index="2" -->
---
# Fin S2/15 :sheep:
{"title":"Introducción a Cloud Computing","description":"Presentación de Sistemas Operativos 2025-2026.","contributors":"[{\"id\":\"93855254-5bcf-438a-b2d1-f9f805e036e4\",\"add\":11489,\"del\":3608,\"latestUpdatedAt\":1757928167357}]"}