[PYTHON] Créer une instance GCE à partir d'une image Docker GCR à l'aide de terraform

Diverses remarques lors de l'utilisation de terraform

Qu'est-ce que terraform

Terraform à comprendre en 10 minutes

Le fait est que lorsque vous créez un environnement cloud, vous ne créez pas de manuel de procédure et ne le créez pas manuellement. Cela semble être un outil qui essaie de tout faire dans le code. (Si vous pouvez le gérer avec du code, il peut être plus facile de gérer la version de l'environnement lui-même, ou vous pourrez peut-être éliminer la personnalité.)

Objectif (dans mon cas)

J'ai testé le script de scraping avec Colaboratory Pour lancer rapidement un serveur lorsque vous souhaitez l'exécuter toute la nuit

environnement

cloudshell Terraform est installé dans l'image docker cloudshell par défaut, vous n'avez donc pas besoin de créer une image personnalisée

supposition

L'image Docker est poussée vers GCR

(Référence) Dockerfile pour le scraping python

Utilisez du sélénium et de la belle soupe pour remplir la base de données pandas avec des résultats de grattage Dockerfile qui peut être utilisé lorsque vous souhaitez insérer des pandas dans BigQuery

Le fichier de clé GCP JSON et le fichier python pour le scraping sont supposés se trouver dans le même répertoire que Dockerfile

Dockerfile


FROM python:3

ARG project_dir=/selenium/
ARG credential_json=<Nom du fichier de clé JSON>

ADD requirements.txt $project_dir
ADD $credential_json $project_dir
ADD <Scraping du fichier python> $project_dir
ENV GOOGLE_APPLICATION_CREDENTIALS ./$credential_json 

WORKDIR $project_dir

RUN apt-get update
RUN apt-get install -y vim less python3-selenium

RUN pip install -r requirements.txt

CMD ["/bin/bash"]

requirements.txt


selenium==3.141.0
requests==2.23.0
pandas==1.0.4
bs4==0.0.1
google-cloud-bigquery==1.21.0
pandas-gbq==0.11.0
lxml==4.5.1

Créer un fichier de paramètres terraform (fichier tf)

Créez un fichier (fichier tf) qui définit les ressources dans un répertoire approprié

main.tf Fichier principal pour définir diverses choses liées à GCE

main.tf


provider "google" {
    credentials = "${file("<Fichier de clé JSON>")}"
	project     = "${var.project_name}"
    region      = "${var.region}"
  }

data "google_compute_network" "default" {
  name = "default"
}
  
resource "google_compute_instance" "apps-gcp-terraform" {
  name         = "selenium-docker"
  machine_type = "n1-standard-1"
  zone         = "${var.zone}"
  
  boot_disk {
	auto_delete = true
    initialize_params {
      image = "${var.boot_image_name}"
      type  = "pd-standard"
    }
  }

  metadata = {
    gce-container-declaration = "${var.docker_declaration}"
  }
  
  network_interface {
	network       = "default"
	access_config {
    }
  }

  service_account {
    email = "<Compte de service>"
    scopes = ["cloud-platform"]
  }
}

variables.tf Fichier qui gère les paramètres

Lors de la création d'une instance GCE à partir d'une image Docker, utilisez une image de démarrage appelée image optimisée pour le conteneur. Vous pouvez vérifier la version actuelle de l'image optimisée pour le conteneur avec la commande suivante

gcloud compute images list --project cos-cloud --no-standard-images

variables.tf


variable "project_name" {
  type    = string
  default = "<ID du projet>"
}

variable "region" {
  type    = string
  default = "us-central1"
}

variable "zone" {
  type    = string
  default = "us-central1-a"
}

variable "boot_image_name" {
  type    = string
  default = "projects/cos-cloud/global/images/cos-stable-81-12871-119-0"
}

variable "docker_declaration" {
  type    = string
  default = "spec:\n  containers:\n    - name: selenium-docker\n      image: '<image de docker>'\n      stdin: false\n      tty: true\n  restartPolicy: Always\n"
}

Créer une instance GCE avec terraform

Exécutez la commande suivante dans le répertoire où se trouve le fichier tf

  1. terraform init Initialiser terraform En cas de succès, il semble qu'un répertoire .terraform sera créé dans le répertoire exécuté et les plug-ins nécessaires seront installés.

Lorsqu'un tel message apparaît Terraform has initialized, but configuration upgrades may be needed.

terraform 0.12upgrade ↑ Il semble que cela mettra à jour le fichier tf avec la dernière version bien

  1. terraform plan Vérifiez si le fichier tf est correct Si une erreur se produit, corrigez le fichier tf

  2. terraform apply Jusqu'à gcp Il vous sera demandé si vous souhaitez l'exécuter en cours de route, alors entrez oui

Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve.

Enter a value: yes

google_compute_instance.apps-gcp-terraform: Creating... google_compute_instance.apps-gcp-terraform: Still creating... [10s elapsed] google_compute_instance.apps-gcp-terraform: Creation complete after 13s

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

Si ça ressemble à ↑, c'est OK

Entrez ensuite l'instance GCE créée

docker container ls 

Ensuite, le conteneur est en cours d'exécution, donc

docker container exec -it ID du conteneur/bin/bash 

Entrez dans le conteneur avec des commandes telles que

nohup python grattant le fichier python> log.txt 2>&1 & 

Laisser le programme s'exécuter

Supprimer l'instance

terrafrom destroy Do you really want to destroy all resources? Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm.

Enter a value:yes

Sera supprimé par

Point addictif

Joindre un compte de service

Error: Cannot get auth token: Metadata server responded with status 404 Quand quand Il semble que vous ne puissiez pas obtenir de jetons du serveur de métadonnées de GCE ...

Donc, si vous exécutez la commande suivante dans l'instance,

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
-H "Metadata-Flavor: Google"

↓ le message apparaît Service account not enabled on this instance

Donc, quand j'ai ajouté la pièce jointe du compte de service à main.tf, c'était OK ↓

main.Cette partie de tf


service_account {
    email = "<Compte de service>"
    scopes = ["cloud-platform"]
  }

référence

documentation terraform Créer et configurer une instance (https://cloud.google.com/container-optimized-os/docs/how-to/create-configure-instance?hl=ja#gcloud_1) Utiliser des variables dans Terraform GCP Infrastructure Construction Automation Road part1 ~ Terraform Introduction ~ Déployez une application Web sur Google Compute Engine avec Terraform. Terraform 0.12 est sorti, donc je l'ai mis à jour [Essayez de créer un environnement GCP avec Terraform](https://techblog.gmo-ap.jp/2017/11/16/terraform%E3%81%A7gcp%E7%92%B0%E5%A2%83% E3% 82% 92% E6% A7% 8B% E7% AF% 89% E3% 81% 97% E3% 81% A6% E3% 81% BF% E3% 82% 8B /) scopes param for service_account of google_compute_instance should be optional

Recommended Posts

Créer une instance GCE à partir d'une image Docker GCR à l'aide de terraform
Générer une image Docker à l'aide de Fabric
Créer un bloc de données à partir d'Excel à l'aide de pandas
Créer un arbre phylogénétique à partir de Biopyton en utilisant ClustalW2
[AWS Lambda] Créer un package de déploiement à l'aide de l'image Amazon Linux Docker
Essayez d'utiliser l'image Docker de Jupyter
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Utilisez wxpython pour créer une fenêtre de type d'image d'arrière-plan transparent semblable à un gadget
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
Créer une API qui renvoie les données d'un modèle à l'aide de turicreate
Recherche par image de la pellicule en utilisant Pythonista3
Créer une image de conteneur Docker avec JRE8 / JDK8 sur Amazon Linux
Créer un identifiant Santa à partir d'une image du Père Noël
Créer une interface graphique python à l'aide de tkinter
Créer un environnement go à l'aide de Docker
Créez un Dataframe pandas à partir d'une chaîne.
Créer un dictionnaire imbriqué à l'aide de defaultdict
Créer une API CRUD à l'aide de l'API rapide
Créez un wrapper de langage C à l'aide de Boost.Python
Utilisez Matplotlib pour créer plusieurs graphiques linéaires à partir d'un bloc de données à la fois
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
Créer une pile avec une file d'attente et une file d'attente avec une pile (à partir de LetCode / Implémenter la pile à l'aide de files d'attente, Implémenter la file d'attente à l'aide de piles)
Comment créer un clone depuis Github
Créez une image factice avec Python + PIL.
Créer un graphique à l'aide du module Sympy
[Python] Créer un environnement Batch à l'aide d'AWS-CDK
Créer un classement à partir des résultats des matchs JFL
Comment créer un référentiel à partir d'un média
[Golang] Créer une image de menu fixe avec des actions Github
Créer un service Web avec Docker + Flask
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
Créez des paramètres dans terraform pour envoyer des messages depuis AWS Lambda Python3.8 vers Slack