Aller au contenu

2020-01-14: Splash with Akamai

Conférence et REX sur le theme de devops

Devops chez Akamai Image Manager

Optimisation d'images (transformation, conversion) ou de vidéos.

  • Configuration basée sur des policies et Policy Set.
  • Fournie avec une API REST pour ajouter/supprimer les policies et gérer l'historique de ces policies
  • S'interface avec la CLI akamai (CLI extensible en fonction des produits Akamai, mais aussi pour intégrer des trucs custom)

Contexte: client du luxe qui est en relation avec plusieurs partenaires (it, agences web, hosting partner etc...). Cetrtains partenaires sont experts en image donc Akamai doit déléguer la gestion des droits et policies à ces partenaires!

Mais ensuite:

  • overload de policies créées dans l'outil! (1 policy set avec 100+ policies doublon ou appelées "test" lol)
  • besoin d'avoir des environnements "Image Manager" dans des enviros DEV, QA...
  • synchronisation des configurations et continus entre environnements

CI/CD

Exemple d'image Akamai: github.com/akamai/cli

Utilisation de Jenkins. Pour builder une image spécifique à un env, on copie les bons fichiers de conf dans l'image.

TV5 Monde: REX Devops

Offre TV5Monde: site principal, site replay, site info, site "langue française", site "culture", site "afrique", site jeunesse, applications mobiles et réseaux sociaux.

Equipe de 3 seulement! 2 devs et 1 exploit. Autrement dit: nécessité d'automatiser et simplifier au maximum les process.

Conf akamai initiale: 1 conf par hostname de production et préproduction, utilisation de l'enviro de staging Akamai. Besoin de reporter les modifications validées en preprod sur la configuration de prod! => mauvaise pratique.

Solution choisie: utilisation de Akamai CLI, ajout d'une configuration master. Utilisation de variables d'environnement pour switcher d'enviro. La CLI Akamai permet de copier des propriétés de la conf master vers une autre conf arbitraire akamaicli property update toto.staging.com -srcprop toto.preprod.com_MASTER. Pour l'activation akamaicli property activate toto.staging.com -network prod

Cette solution permet d'avoir des propriétés différentes en fonction des environnements (par exemple pour désactiver le caching sur un environnement - cette propriété n'est pas présente sur les autres envs)

(par contre on reste encore sur une conf mutable et non versionnée, ils ont juste automatisé le passage de conf d'un environnment à l'autre)

Pipelines Jenkins pour réaliser ce switch d'environnement

Akamai Sandbox

Contexte: plateforme de streaming VOD fictive Splashtube avec un frontend basé sur Akamai Ion. Comment peuvent-ils tester leurs confs akamai avant la prod?

Sandbox: comprend client CLI + API. Dialogue avec la vraie conf Akamai Staging via websocket.

Objectif: déployer des confs en moins d'une minute sur un environnement dev (ex: Minikube).

A utiliser pour expérimenter sur des conf akamai, pour gérer des tests CI/CD etc, le tout en environnement firewallé

Demo:

  • Akamai control center permet de lister toutes les sandboxes en mode gui
  • Akamai sandbox est un module de Akamai CLI: akamai install sandbox
  • L'utilitaire qui route le trafic vers/from Akamai Staging est un jar, akamai sandbox cli est juste un wrapper
  • On peut aussi tester les edgeworkers (serverless à la mode akamai) avec sandbox
  • .edgerc: ini file pour indiquer les tokens api associés aux hosts. Prérequis pour l'utilisation des sandbox
  • la clé de cache générée est l'id de la sandbox
  • aka_curl pour vérifier le nouveau routage

  • pour le mode CI: installer la sandbox dans un cluster préexistant et y brancher les tests automatisés. Attention, le routage via sandbox est lent : augmenter les timeouts!

  • note: la sandbox est toujours créée à l'extérieur du Dockerfile, puis copiée à l'intérieur
  • envsubst

Akamai Edgeworker

Principe: déployer et exécuter du javascript sur tous les edge servers Akamai. Actuellement en beta chez Akamai.

Chaque package JS doit: - respecter ces 4 fonctions : onClientRequest/Response, onOriginRequest/Response. - avoir un bundle.json - temps d'execution max du script: 100ms

Gérable depuis le panneau de controle Akamai ou via la CLI. Exemple pour le démarrer: utiliser behavior "edgeworker" ("if querystring "&ew=on" then start edgeworker with identifier x")

Overhead assez mince: 30ms

Exemple d'usage: cacher les headers sur les requêtes à l'origine, faire varier un cookie, rediriger sur des conditions, générer des headers cache-tags etc

Attention:

  • cela peut être utlisé pour bypasser le property manager pour créer de nouvelles règles et donc pas de vérifications, droits etc!
  • erreurs JS = plantage akamai (c'est là où il faut utiliser l'enviro staging avec la sandbox par exemple)

Prochaines versions:

  • modifier à la volée la réponse de l'origine avec edgeworker

Akamai Terraform Provider

Etat actuel: en beta. Automatiquement installé par terraform init (blessed by hashicorp). Supporte les resources: property manager, fastDNS. GA en Q2 2020. De plus en plus de resources seront ajoutées dans le futur.

Contexte: SplashTube met ses assets sur Netstorage et délivrés par le CDN. Ils testent Terraform

  • Netstorage n'est pas provisionnable par le Terraform Provider
  • Par contre la conf Akamai est bien sûr provisionnable!
  • mapping entre notions Akamai et Terraform
  • il est conseillé d'utiliser le format JSON Akamai plutot que HCL pour manipuler les resources Akamai dans Terraform (afin de rester interopérable avec les autres solutions d'automatisation akamai). Exemple: rules.json
  • attention: les noms de resource et variables akamai ne sont pas forcément ceux que l'on connait - lire la doc

HCL population de liste

resource "resourcename" "myname" {
    hostnames = {
        (var.hostname) = akamai_edge_hostname.splash.edge_hostname
    }
}

HCL open un file

resource "resourcename" "myname" {
    rules = file("${path.module}/rules.json")
}
  • il existe une resource Akamai pour l'activation, car le terraform apply n'active pas la conf Akamai! (sinon ça serait la merde non?)

  • de plus aujourd'hui sur le provider Akamai, le terraform destroy ne fonctionne pas encore :)

cas multi-envrionnement

  • utilisation des workspaces: 1 seul main.tf, mais plusieurs workspaces qui permettent de stocker 1 tfstate par workspace et 1 tfvars par workspace = autrement dit pour gérerd les environnements

  • backends terraform pour partager le state: etcd, consul, file (par defaut)

  • il faut une pipeline d'infra et pas s'amuser à run tf en faisant du CTRL+C et tuer son state sur l'autel des interrupts

  • (à partir de la 0.12) utilisation des template file en natif avec interpolation de variables

template Terraform execution de fonction

Dans un template JSON, on peut appeler des fonctions de templating genre jsonencode, replace, for etc :)

{
    "name": "toto",
    "options": ${
        jsonencode(file("${template_path}"/test.json))
    }
}
  • terraform import n'est pas supporté par Akamai (ça serait trop beau, il faut écrire la conf TF depuis zero)

Elastic with Akamai

https://ela.st/akamai

Pub de Elastic: Exemples d'utilisation d'Elastic:

  • geopsatial request sur Uber quand on cherche des voitures.
  • tinder utilise elastic en primary datastore!!
  • activision/blizzard fait son monitoring server / bot detection avec
  • université indiana a crée un soc (security) basé sur elastic

Caractéristiques Elastic:

  • autosharding à chaque rajout de noeud
  • donc scalabilité
  • metric tf idf
  • elastic common schema: permet de mapper les champs de vendors épars sur 1 seul champ via des conf mutate {}

La stack Elastic c'est kwa:

  • ingest = les beats (en golang) (metricbeat, filebeat, auditbeat, winlogbeat...) et logstash
  • storage, analyze, search = elasticsearch
  • visualize, manage = kibana

Applications d'Elastic stack:

  • enterprise search (chercher tous les docs de l'entreprise via des connecteurs : gdocs, sharepoint etc)
  • security / SIEM
  • observabilité d'un système microservice: aller au-delà de la centralisation de logs et voir les metrics APM

Akamai joined the chat:

comment ajouter les logs akamai dans un stack elastic?

  • LDS (legacy
  • datastream (en beta) pour streamer les logs vers un endpoint

Interet:

  • répartition des edge requests
  • quelles IP font "trop" de requetes
  • status codes

Jobs de machine learning au sein d'Elastic Cloud

  • permet de déterminer des rules à partir de baselines et de déviations de cette baseline
  • querystring (détecter certains patterns etc), adresses ip