AWS 360°

Florian Dambrine
Engineering Manager

Whoami

  • Florian Dambrine

  • Principal Engineer @ GumGum

  • 7+ ans chez GumGum

  • Fan d'automatisation !

Juin 2011                            Juin 2014                           Février 2014

Invente le In-Image 

advertising in 2008

GumGum - AI

GumGum Advertising

GumGum Sports

GumGum - AI

GumGum - AI

Verity analyzes web pages for content-level brand safety and contextual classification by applying machine learning (ML) techniques to both the text and prominent images on the web page.

 

Agenda

  • AWS
    • Généralités
    • Quelques services IAAS / PAAS
    • Infrastructures Types
  • AWS 360 Factory
    • Console
    • AWS-Cli
    • Terraform
  • Terraform
    • Introduction et Concepts
    • Terraform AWS VPC
    • Terrafrom AWS Autoscaling

Theorie                Pratique

Généralités

Utilisateurs du cloud AWS

Généralités

AWS - Régions et zones de disponibilité (AZs)

Généralités

AWS - Interfaces de gestion

Cli / SDK

Généralités

Networking

Storage

Servers

Virtualization

O/S

Middleware

Runtime

Data

Applications

Networking

Storage

Servers

Virtualization

O/S

Middleware

Runtime

Data

Applications

Networking

Storage

Servers

Virtualization

O/S

Middleware

Runtime

Data

Applications

Networking

Storage

Servers

Virtualization

O/S

Middleware

Runtime

Data

Applications

On premises

Infrastructure

(as a Service)

Platform

(as a Service)

Software

(as a Service)

You manage

Managed for you

AWS - Quelques services IaaS

VPC - Virtual Private Cloud

Amazon Virtual Private Cloud (Amazon VPC) vous permet de mettre en service une section du cloud AWS qui a été isolée de manière logique et dans laquelle vous pouvez lancer des ressources AWS dans un réseau virtuel que vous définissez. Vous conservez la totale maîtrise de votre environnement de mise en réseau virtuel, y compris pour la sélection de votre propre plage d'adresses IP, la création de sous-réseaux et la configuration de tables de routage et de passerelles réseau. Dans votre VPC, vous pouvez utiliser aussi bien le protocole IPv4 qu'IPv6, pour un accès simple et sécurisé aux ressources et applications.

AWS - Quelques services IaaS

EC2 - Elastic Compute

Amazon Elastic Compute Cloud (Amazon EC2) est un service Web qui fournit une capacité de calcul sécurisée et redimensionnable dans le cloud (machines virtuelles). Destiné aux développeurs, il est conçu pour faciliter l'accès aux ressources de cloud computing à l'échelle du Web.

AWS - Quelques services IaaS

AMI - Amazon Machine Image

Une Amazon Machine Image (AMI) fournit les informations requises pour lancer une instance, qui est un serveur virtuel dans le cloud. Vous devez spécifier une AMI source lorsque vous lancez une instance. Lorsque vous avez besoin de plusieurs instances configurées de manière identique, il est possible de lancer plusieurs instances à partir d'une même AMI. Lorsque vous avez besoin d'instances configurées de manière différente, vous pouvez utiliser différentes AMI pour lancer ces instances.

AWS - Quelques services IaaS

EBS - Elastic Block Store

Amazon Elastic Block Store (Amazon EBS) fournit des volumes de stockage permanent en mode bloc à utiliser avec les instances Amazon EC2 dans le cloud AWS. Chaque volume Amazon EBS est automatiquement répliqué au sein de sa zone de disponibilité, afin de vous protéger contre toute défaillance de composants, tout en garantissant une disponibilité et une durabilité élevées. Les volumes Amazon EBS vous fournissent les performances homogènes et à faible latence nécessaires à l'exécution de vos charges de travail

AWS - Quelques services IaaS

S3 -  Simple Storage Service

 

De nos jours, les entreprises doivent être en mesure de collecter, de stocker et d'analyser leurs données à grande échelle de façon simple et sécurisée. Amazon S3 est un stockage d'objets conçu pour stocker et récupérer n'importe quelle quantité de données, n'importe où : sites web, applications mobiles, applications d'entreprise et données de capteurs ou d'appareils IoT. Conçu pour offrir 99,999999999 % de durabilité, ce service stocke les données de millions d'applications utilisées par des leaders de tous les secteurs. Amazon S3 dispose de capacités de sécurité et de conformité complètes qui répondent aux exigences des règlementations les plus strictes qui soient

AWS - Quelques services PaaS

ELB / ALB / NLB - Elastic / Application / Network Load balancers

L'Elastic Load Balancing distribue automatiquement le trafic entrant d'application à travers plusieurs canaux, comme des instances Amazon EC2, des conteneurs et des adresses IP. Il peut traiter la charge variable du trafic de votre application dans une seule Zone de disponibilité ou à travers plusieurs Zones de disponibilité. L'Elastic Load Balancing offre trois types d'équilibreurs de charge offrant tous la haute disponibilité, la mise à l'échelle automatique et la sécurité robuste nécessaires pour assurer la tolérance aux pannes de vos applications.

AWS - Quelques services PaaS

RDS - Relational Database Service 

Avec Amazon Relational Database Service (Amazon RDS), configurez, gérez et dimensionnez facilement une base de données relationnelle dans le cloud. Ce service offre une capacité économique et ajustable ainsi qu'une automatisation des tâches administratives chronophages, telles que l'allocation de matériel, le paramétrage de bases de données, l'application de correctifs et les sauvegardes. Vous pouvez ainsi vous concentrer librement sur vos applications, afin de leur donner les performances rapides, la haute disponibilité, la sécurité et la compatibilité dont elles ont besoin.

AWS - Quelques services PaaS

DynamoDB - Base de données non relationnelle / NoSql

Amazon DynamoB est une base de données non relationnelle fournissant des performances fiables, quelle que soit l’échelle. Il s’agit d’une base de données multirégion et multimaître à gestion intégrale qui fournit une latence constante de quelques millisecondes et un système de sécurité, de sauvegarde et de restauration intégré, ainsi que de mise en cache en mémoire.

AWS - Quelques services PaaS

SQS -  Simple Queue Service

La solution Amazon Simple Queue Service (SQS) est un service de file d'attente de messagerie entièrement géré qui vous permet de découpler et mettre à l'échelle des microservices, des systèmes décentralisés et des applications sans serveur. SQS élimine la complexité et les frais généraux associés à la gestion et à l'utilisation de messages orientés intergiciel, et permet aux développeurs de se concentrer sur la différenciation des tâches.

AWS - Quelques services PaaS

Route53

Amazon Route 53 est un service Web de système de noms de domaine (DNS) dans le cloud hautement disponible et évolutif. Il est conçu pour donner aux développeurs et aux entreprises un moyen extrêmement fiable et rentable d'acheminer les utilisateurs finaux vers des applications Internet en traduisant des noms comme www.example.com par des adresses IP du type 192.0.2.1 que les ordinateurs utilisent pour se connecter l'un à l'autre. De plus, Amazon Route 53 est entièrement conforme au protocole IPv6.

AWS - Quelques services PaaS

CloudFront

Amazon CloudFront est un réseau mondial de diffusion de contenu (CDN) qui distribue en toute sécurité des données, des vidéos, des applications et des API à vos utilisateurs, avec une faible latence et des vitesses de transfert élevées. CloudFront est intégré à AWS, avec deux emplacements physiques qui sont directement connectés à l'infrastructure mondiale AWS, ainsi qu'un logiciel qui fonctionne parfaitement avec les services, notamment AWS Shield pour l'atténuation des attaques par déni de service (DDoS), Amazon S3, Elastic Load Balancing ou Amazon EC2 comme origines pour vos applications, et Lambda@Edge pour exécuter du code personnalisé pour vos utilisateurs.

AWS - Services 2011 - 2018

~20

+90

AWS - Architecture Cloud

Schéma typique d'architecture Web sur AWS

Exercice - AWS-360-Factory

AWS - Bootstrap from scratch

VPC

AWS - Bootstrap from scratch

VPC & AZs

AWS - Bootstrap from scratch

VPC & AZs & Subnets

AWS - Bootstrap from scratch

VPC & AZs & Subnets & Gateways

AWS - Bootstrap from scratch

VPC & AZs & Subnets & Gateways & Route tables

Introduction à Terraform

  • Projet Open source démarré par Mitchell Hashimoto
  • Outil de bootstrapping permettant de créer,
    changer et versioner des infrastructures efficacement
  • Automatisations rédigées en HCL (convertible Json)
  • Utilisations:
    • ​Création d'infrastructures cloud

       
  • Points forts:
    • Infrastructure as Code
    • Garde en mémoire l'état de l'infrastructure et permet l'application de diffs 

Terraform - Init

$ terraform init
providers
provider "aws" {
  access_key = "ACCESS_KEY_HERE"
  secret_key = "SECRET_KEY_HERE"
  region     = "us-east-1"
}

Initialisation de paramètres locaux qui seront utilisés par de futures commandes

Terraform - Apply / Destroy

$ terraform apply
# ...

+ aws_instance.example
    ami:                      "ami-2757f631"
    availability_zone:        "<computed>"
    ebs_block_device.#:       "<computed>"
    ephemeral_block_device.#: "<computed>"
    instance_state:           "<computed>"
    instance_type:            "t2.micro"
    key_name:                 "<computed>"
    placement_group:          "<computed>"
    private_dns:              "<computed>"
    private_ip:               "<computed>"
    public_dns:               "<computed>"
    public_ip:                "<computed>"
    root_block_device.#:      "<computed>"
    security_groups.#:        "<computed>"
    source_dest_check:        "true"
    subnet_id:                "<computed>"
    tenancy:                  "<computed>"
    vpc_security_group_ids.#: "<computed>"
resource "aws_instance" "example" {
  ami           = "ami-b374d5a5"
  instance_type = "t2.micro"
}
example.tf

+ Création de ressources

~ Modification de ressources

+/- Recréation de ressources

- Destruction de ressources

$ terraform destroy
# ...

- aws_instance.example

Terraform - Datasources

Collection d'informations sur l'infrastructure existante

datasources.tf
# Cherche la plus récente AMI avec 
# le tag "Component = web"
data "aws_ami" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:Component"
    values = ["web"]
  }

  most_recent = true
}
# Utilisation de la datasource
resource "aws_instance" "web" {
  ami           = data.aws_ami.web.id
  instance_type = "t1.micro"
}

Terraform - Variables

Paramétrisation de l'infrastructure

variable "mystring" {
  type = string
  description = "describe your variable"
  default = "default_value"
}


variable "mymap" {
  type = map(any)
  description = "describe your variable"
  default = {
    key1 = "val1"
    key2 = "val2"
  }
}


variable "mylist" {
  type = list(string)
  description = "describe your variable"
}
variables.tf
# Accès à la variable `env`
resource "aws_instance" "web" {
  subnet = var.subnet
}

# Condition booléenne
resource "aws_instance" "vpn" {
  count = var.vpn_enabled ? 1 : 0
}

# Utilisation de fonctions Terraform
resource "aws_instance" "vpn" {
  subnet_id = element(
    aws_subnet.subnets.*.id, 
    0
  )
}
interpolations.tf

Terraform - Resources

Représentation d'un élément de l'infrastructure

+ aws_eip.ip
    allocation_id:     "<computed>"
    association_id:    "<computed>"
    domain:            "<computed>"
    instance:          "${aws_instance.example.id}"
    network_interface: "<computed>"
    private_ip:        "<computed>"
    public_ip:         "<computed>"

+ aws_instance.example
    ami:                      "ami-b374d5a5"
    availability_zone:        "<computed>"
    ebs_block_device.#:       "<computed>"
    ephemeral_block_device.#: "<computed>"
    instance_state:           "<computed>"
    instance_type:            "t2.micro"
    key_name:                 "<computed>"
    placement_group:          "<computed>"
    private_dns:              "<computed>"
    private_ip:               "<computed>"
    public_dns:               "<computed>"
    public_ip:                "<computed>"
    root_block_device.#:      "<computed>"
    security_groups.#:        "<computed>"
    source_dest_check:        "true"
    subnet_id:                "<computed>"
    tenancy:                  "<computed>"
    vpc_security_group_ids.#: "<computed>"
resource "aws_eip" "ip" {
  instance = aws_instance.example.id
}

resource "aws_instance" "example" {
  ami           = "ami-b374d5a5"
  instance_type = "t2.micro"
}
example.tf

Expression de dépendances

Terraform - Outputs

Valeurs de retour exposées à l'appelant (utilisateur ou module)

output.tf
output "ip" {
  value = aws_eip.ip.public_ip
}

Terraform capture des centaines d'attributs sur les ressources.

En tant qu'utilisateur de Terraform, seules certaines variables ont de l'importance, comme l'IP d'un load balancer IP, ou l'ID d'un VPC, etc.

$ terraform apply
...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

  ip = 50.17.232.209

Terraform - Boucles for

output "instance_public_ip_addresses" {
  value = {
    for instance in aws_instance.example:
    instance.id => instance.public
    if instance.associate_public_ip_address
  }
}

Plus de documentation sur for et for_each:

Terraform - State

Information connue et gérée par Terraform sur l'infrastructure existante (metadata)

$ terraform state show
id                               = vpc-0ee382af80b1c60ef
arn                              = [...]/vpc-0ee382af80b1c60ef
assign_generated_ipv6_cidr_block = false
cidr_block                       = 172.20.0.0/16
default_network_acl_id           = acl-0e12a15434ee8ae1c
default_route_table_id           = rtb-015543ec5456b6fe7
default_security_group_id        = sg-0a3ce4d899b74380e
dhcp_options_id                  = dopt-f3730e88
enable_classiclink               = false
enable_classiclink_dns_support   = false
enable_dns_hostnames             = true
enable_dns_support               = true
instance_tenancy                 = default
main_route_table_id              = rtb-015543ec5456b6fe7
tags.%                           = 1
tags.Name                        = ccm-vpc

Local Vs Remote
State

terraform.tfstate
terraform.tfstate

locking

Terraform & Terragrunt

Terragrunt - Wrapper sur Terraform pour une meilleure isolation et modularisation du code

└── infra
    ├── prod
    │   ├── app
    │   │   └── terraform.tfvars
    │   ├── mysql
    │   │   └── terraform.tfvars
    │   └── vpc
    │       └── terraform.tfvars
    ├── qa
    │   ├── app
    │   │   └── terraform.tfvars
    │   ├── mysql
    │   │   └── terraform.tfvars
    │   └── vpc
    │       └── terraform.tfvars
    └── stage
        ├── app
        │   └── terraform.tfvars
        ├── mysql
        │   └── terraform.tfvars
        └── vpc
            └── terraform.tfvars

?

stage/
  app/
    terraform.tfstate
  mysql/
    terraform.tfstate
  vpc/
    terraform.tfstate

Exercice - Terraform-AWS-VPC

AWS - Autoscaling

Problématique de la montée en charge

t2.micro
c5.2xlarge
c5.large
c5.18xlarge
c5.large
c5.large
c5.large
c5.large
c5.large
c5.large

Horizontal

Vertical

AWS - Autoscaling

Adapter le nombre de serveurs en fonction de la demande

Temps
# Serveurs
Besoins réels
Besoins prévus
Gaspillage
Insatisfaction Client

AWS - Autoscaling

Diviser pour mieux régner

.

.

.

AWS - Autoscaling

ALB / Listener / Target Group

AWS - Autoscaling

ALB & Autoscaling group

AWS - Autoscaling

ALB & Autoscaling group & Autoscaling Metrics

Exercice - Terraform-AWS-Autoscaling

AWS 360°

By Florian Dambrine

AWS 360°

AWS 360° is an introduction to AWS and automation with Terraform. This project is meant for teaching AWS Cloud concepts to master degree students. The idea is to spin up an entire AWS infrastructure using Terraform and discover multiple ways to interact with this cloud provider (AWS Console / Aws-cli / SDKs). Once the infrastructure is fully up, we will see how Terraform can help managing such an AWS environment, and deploy similar environments such as staging and dev. The "DevOps 360°" (https://slides.com/floriandambrine/devops360) course can then leverage the AWS infrastructure to teach how to use a configuration management tool such as Ansible. You can find all the git repositories used in this course matching aws-360-* here https://github.com/Lowess

  • 2,866