Florian Dambrine
Engineering Manager
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
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.
Theorie Pratique
Utilisateurs du cloud AWS
Cli / SDK
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
You manage
Managed for you
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.
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.
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.
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
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
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.
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.
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.
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.
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.
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.
$ 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
# ...
+ 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
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"
}
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
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
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
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:
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
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
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
Adapter le nombre de serveurs en fonction de la demande
Temps
# Serveurs
Besoins réels
Besoins prévus
Gaspillage
Insatisfaction Client
Diviser pour mieux régner
.
.
.