Compare commits

..
7 Commits
Author SHA1 Message Date
gregandev 72232d84a4 maj Dockerfile 2023-03-19 23:58:42 +01:00
gregandev 4b40fcf844 correction README.md + clean up app/deploy.sh 2023-03-19 23:56:29 +01:00
gregandev 820f540bdb correction README.md 2023-03-19 23:43:19 +01:00
gregandev ad84c675f4 correction README.md 2023-03-19 23:39:18 +01:00
gregandev 5aaf23e181 clean up 2023-03-19 23:36:16 +01:00
gregandev 1fec82de6c ajout Dockerfile pour automatisation 2023-03-19 23:35:29 +01:00
gregandev bc26ed8889 ajout Dockerfile pour automatisation 2023-03-19 23:34:01 +01:00
8 changed files with 120 additions and 65 deletions
+27 -35
View File
@@ -1,9 +1,17 @@
# TERRAFORM / GCP # TERRAFORM / GCP
Demo Terraform déployant une application Flask dans un conteneur Docker sur GCP
## PRE REQUIS ## PRE REQUIS
- [COMPTE GCP](https://cloud.google.com/?hl=fr) - [COMPTE GCP](https://cloud.google.com/?hl=fr)
- [TERRAFORM](https://www.terraform.io/) - [TERRAFORM](https://www.terraform.io/)
## PREPARATION
### MACHINE LOCALE
- Installer Terraform:
```bash ```bash
# LINUX INSTALL # LINUX INSTALL
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
@@ -11,7 +19,13 @@ sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(l
sudo apt-get update && sudo apt-get install terraform sudo apt-get update && sudo apt-get install terraform
``` ```
## PREPARATION - Créer une paire de clé ssh dédiée pour Terraform dans ~/.ssh
```bash
# NOMMER LE CLE TERRAFORM
ssh-keygen -t rsa -b 4096
```
### DASHBOARD GCP
- Créer un projet "terraform-demo" - Créer un projet "terraform-demo"
- Séletionner le projet créé puis créer un compte de service dans l'onglet [IAM et administration](https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts?hl=fr) de la console GCP - Séletionner le projet créé puis créer un compte de service dans l'onglet [IAM et administration](https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts?hl=fr) de la console GCP
@@ -23,56 +37,34 @@ sudo apt-get update && sudo apt-get install terraform
![SERVICES ACCOUNT](docs/service-account.png) ![SERVICES ACCOUNT](docs/service-account.png)
- Créer une clé au sein du compte de service avec les droits sur le compute engine (pour créer les VMs), et télécharger le fichier json contenant la clé pour le mettre dans le dossier auth - Créer une clé au sein du compte de service avec les droits sur le compute engine (pour créer les VMs), et télécharger le fichier json contenant la clé pour le mettre dans le dossier auth/
- Modifier l'id du projet ainsi que le chemin du fichier json contenant la clef dans le fichier variables.tf
### TERRAFORM.TFVARS
- Modifier le fichier terraform.tfvars en fonction de votre environnement (gcp_project_id et gcp_auth_file)
## UTILISATION ## UTILISATION
- Lançer Terraform: - Initialiser Terraform:
```bash ```bash
cd terraform-demo
terraform init terraform init
``` ```
- Lançer Terraform: - Dry run:
```bash ```bash
terraform plan terraform plan
``` ```
- Lançer Terraform: - Lançer Terraform:
```bash ```bash
terraform apply terraform apply
# Saisir yes quand demandé # Saisir yes quand demandé
``` ```
> L'adresse public de la VM est fournie en output du terraform apply http://public-ip:5000 > Visiter l'adresse fournie en output du terraform apply (Web-server-URL = "http://SERVER_IP:5000")
- Se connecter en SSH à la VM pour créer l'application Flask:
- Stopper Terraform:
```bash ```bash
nano app.py terraform destroy
from flask import Flask ```
app = Flask(__name__)
@app.route('/')
def hello_cloud():
return 'Hello Cloud!'
app.run(host='0.0.0.0')
```
- Installer Flask:
```bash
python3 -m pip install flask
```
- Lançer l'application:
```bash
python3 app.py
```
> Visiter l'adresse fournie en output du terraform apply
+7
View File
@@ -0,0 +1,7 @@
FROM python:3.8-slim-bullseye
WORKDIR /python-docker
COPY ./requirements.txt requirements.txt
RUN python3 -m pip install -r requirements.txt
COPY ./ .
EXPOSE 5000
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
View File
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
sudo apt-get update
sudo apt-get install -yq docker.io
sudo docker build --network=host -t flaskapp .
sudo docker run -d -p 5000:5000 flaskapp:latest
+1
View File
@@ -0,0 +1 @@
flask
+57 -26
View File
@@ -24,31 +24,6 @@ resource "google_compute_subnetwork" "default" {
network = google_compute_network.vpc_network.id network = google_compute_network.vpc_network.id
} }
# VM
resource "google_compute_instance" "default" {
name = "flask-vm"
machine_type = "e2-micro"
zone = var.gcp_zone
tags = ["ssh"]
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
## INSTALL FLASK
metadata_startup_script = "sudo apt-get update; sudo apt-get install -yq build-essential python3-pip rsync; pip install flask"
network_interface {
subnetwork = google_compute_subnetwork.default.id
access_config {
# Include this section to give the VM an external IP address
}
}
}
## FIREWALL ## FIREWALL
### SSH ### SSH
resource "google_compute_firewall" "ssh" { resource "google_compute_firewall" "ssh" {
@@ -76,7 +51,63 @@ resource "google_compute_firewall" "flask" {
source_ranges = ["0.0.0.0/0"] source_ranges = ["0.0.0.0/0"]
} }
## VM
resource "google_compute_instance" "default" {
name = "flask-vm"
machine_type = "e2-micro"
zone = var.gcp_zone
tags = ["ssh"]
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
metadata = {
ssh-keys = "${var.gcp_ssh_user}:${file(var.gcp_ssh_pub_key_file)}"
}
network_interface {
subnetwork = google_compute_subnetwork.default.id
access_config {
#### TO HAVE A PUBLIC IP ADRESS
}
}
### COPY DES FICHIERS
provisioner "file" {
source = "app/"
destination = "./"
connection {
host = google_compute_instance.default.network_interface.0.access_config.0.nat_ip
type = "ssh"
user = var.gcp_ssh_user
timeout = "500s"
private_key = file(var.gcp_ssh_priv_key_file)
}
}
### START DEPLOY.SH
provisioner "remote-exec" {
inline = [
"chmod +x ~/deploy.sh",
"cd ~",
"./deploy.sh"
]
connection {
host = google_compute_instance.default.network_interface.0.access_config.0.nat_ip
type = "ssh"
user = var.gcp_ssh_user
timeout = "500s"
private_key = file(var.gcp_ssh_priv_key_file)
}
}
}
## GET VM PUBLIC IP ## GET VM PUBLIC IP
output "Web-server-URL" { output "Web-server-URL" {
value = join("",["http://",google_compute_instance.default.network_interface.0.access_config.0.nat_ip,":5000"]) value = join("", ["http://", google_compute_instance.default.network_interface.0.access_config.0.nat_ip, ":5000"])
} }
+7 -4
View File
@@ -1,5 +1,8 @@
# GCP Settings # GCP Settings
gcp_project_id = "terraform-demo-381114" gcp_project_id = "terraform-demo-381114" # A MODIFIER
gcp_region = "europe-west9" gcp_region = "europe-west9"
gcp_zone = "europe-west9-a" gcp_zone = "europe-west9-a"
gcp_auth_file = "./auth/terraform-demo-381114-158cfce10778.json" gcp_auth_file = "./auth/terraform-demo-381114-158cfce10778.json" # A MODIFIER
gcp_ssh_user = "devops" # A MODIFIER OU PAS
gcp_ssh_pub_key_file = "~/.ssh/terraform.pub"
gcp_ssh_priv_key_file = "~/.ssh/terraform"
+15
View File
@@ -20,4 +20,19 @@ variable "gcp_project_id" {
variable "gcp_zone" { variable "gcp_zone" {
type = string type = string
description = "GCP zone" description = "GCP zone"
}
variable "gcp_ssh_user" {
type = string
description = "SSH user"
}
variable "gcp_ssh_pub_key_file" {
type = string
description = "SSH public key file path"
}
variable "gcp_ssh_priv_key_file" {
type = string
description = "SSH private key file path"
} }