# DO - Fonctions

{{#include ../../../banners/hacktricks-training.md}}

## Informations de base

DigitalOcean Functions, également connu sous le nom de "DO Functions", est une plateforme de calcul sans serveur qui vous permet de **faire fonctionner du code sans avoir à vous soucier de l'infrastructure sous-jacente**. Avec DO Functions, vous pouvez écrire et déployer votre code sous forme de "fonctions" qui peuvent être **déclenchées** via **API**, **requêtes HTTP** (si activées) ou **cron**. Ces fonctions sont exécutées dans un environnement entièrement géré, donc vous **n'avez pas à vous soucier** de la mise à l'échelle, de la sécurité ou de la maintenance.

Dans DO, pour créer une fonction, vous devez d'abord **créer un espace de noms** qui sera **un groupe de fonctions**.\
À l'intérieur de l'espace de noms, vous pouvez ensuite créer une fonction.

### Déclencheurs

La façon **de déclencher une fonction via REST API** (toujours activée, c'est la méthode utilisée par le cli) est de déclencher une requête avec un **jeton d'authentification** comme :
```bash
curl -X POST "https://faas-lon1-129376a7.doserverless.co/api/v1/namespaces/fn-c100c012-65bf-4040-1230-2183764b7c23/actions/functionname?blocking=true&result=true" \
-H "Content-Type: application/json" \
-H "Authorization: Basic MGU0NTczZGQtNjNiYS00MjZlLWI2YjctODk0N2MyYTA2NGQ4OkhwVEllQ2t4djNZN2x6YjJiRmFGc1FERXBySVlWa1lEbUxtRE1aRTludXA1UUNlU2VpV0ZGNjNqWnVhYVdrTFg="
```
Pour voir comment l'outil cli **`doctl`** obtient ce jeton (afin que vous puissiez le reproduire), la **commande suivante montre la trace réseau complète :**
```bash
doctl serverless connect --trace
```
**Lorsque le déclencheur HTTP est activé**, une fonction web peut être invoquée via ces **méthodes HTTP GET, POST, PUT, PATCH, DELETE, HEAD et OPTIONS**.

> [!CAUTION]
> Dans les fonctions DO, **les variables d'environnement ne peuvent pas être chiffrées** (au moment de la rédaction de ce document).\
> Je n'ai trouvé aucun moyen de les lire depuis la CLI mais depuis la console, c'est simple.

**Les URLs des fonctions** ressemblent à ceci : `https://<random>.doserverless.co/api/v1/web/<namespace-id>/default/<function-name>`

### Énumération
```bash
# Namespace
doctl serverless namespaces list

# Functions (need to connect to a namespace)
doctl serverless connect
doctl serverless functions list
doctl serverless functions invoke <func-name>
doctl serverless functions get <func-name>

# Logs of executions
doctl serverless activations list
doctl serverless activations get <activation-id> # Get all the info about execution
doctl serverless activations logs <activation-id> # get only the logs of execution
doctl serverless activations result <activation-id> # get only the response result of execution

# I couldn't find any way to get the env variables form the CLI
```
> [!CAUTION]
> Il **n'y a pas de point de terminaison de métadonnées** depuis le sandbox des Functions.

{{#include ../../../banners/hacktricks-training.md}}
