[PYTHON] Erstellen Sie eine GCE-Instanz aus einem GCR Docker-Image mithilfe von Terraform

Verschiedene Hinweise bei der Verwendung von Terraform

Was ist Terraform?

Terraform in 10 Minuten zu verstehen

Der Punkt ist, dass Sie beim Erstellen einer Cloud-Umgebung kein Verfahrenshandbuch erstellen und es manuell erstellen. Es scheint ein Werkzeug zu sein, das versucht, alles im Code zu tun. (Wenn Sie es mit Code verwalten können, ist es möglicherweise einfacher, die Version der Umgebung selbst zu verwalten, oder Sie können möglicherweise die Persönlichkeit beseitigen.)

Zweck (in meinem Fall)

Ich habe das Scraping-Skript mit Colaboratory getestet Zum schnellen Starten eines Servers, wenn Sie ihn die ganze Nacht ausführen möchten

Umgebung

cloudshell Terraform ist im Standard-Cloudshell-Docker-Image installiert, sodass Sie kein benutzerdefiniertes Image erstellen müssen

Annahme

Das Docker-Image wird an GCR gesendet

(Referenz) Docker-Datei für Python-Scraping

Verwenden Sie Selen und eine schöne Suppe, um den Pandas-Datenrahmen mit Kratzergebnissen zu füllen Docker-Datei, die verwendet werden kann, wenn Sie von Pandas in BigQuery einfügen möchten

Es wird davon ausgegangen, dass sich die GCP-JSON-Schlüsseldatei und die Python-Datei für das Scraping im selben Verzeichnis wie Dockerfile befinden

Dockerfile


FROM python:3

ARG project_dir=/selenium/
ARG credential_json=<Name der JSON-Schlüsseldatei>

ADD requirements.txt $project_dir
ADD $credential_json $project_dir
ADD <Python-Datei verschrotten> $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

Erstellen Sie eine Terraform-Einstellungsdatei (tf-Datei)

Erstellen Sie eine Datei (tf-Datei), die Ressourcen in einem geeigneten Verzeichnis definiert

main.tf Hauptdatei zum Einstellen verschiedener Dinge im Zusammenhang mit GCE

main.tf


provider "google" {
    credentials = "${file("<JSON-Schlüsseldatei>")}"
	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 = "<Dienstkonto>"
    scopes = ["cloud-platform"]
  }
}

variables.tf Datei, die Parameter verarbeitet

Verwenden Sie beim Erstellen einer GCE-Instanz aus einem Docker-Image ein Boot-Image, das als containeroptimiertes Image bezeichnet wird. Sie können die aktuelle containeroptimierte Image-Version mit dem folgenden Befehl überprüfen

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

variables.tf


variable "project_name" {
  type    = string
  default = "<Projekt-ID>"
}

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: '<Docker-Bild>'\n      stdin: false\n      tty: true\n  restartPolicy: Always\n"
}

Erstellen Sie eine GCE-Instanz mit Terraform

Führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem sich die tf-Datei befindet

  1. terraform init Terraform initialisieren Bei Erfolg wird anscheinend ein .terraform-Verzeichnis im ausgeführten Verzeichnis erstellt und die erforderlichen Plug-Ins installiert.

Wenn eine solche Meldung erscheint Terraform has initialized, but configuration upgrades may be needed.

terraform 0.12upgrade ↑ Es scheint, dass es die tf-Datei auf die neueste Version gut aktualisieren wird

  1. terraform plan Überprüfen Sie, ob die tf-Datei korrekt ist Wenn ein Fehler auftritt, beheben Sie die tf-Datei

  2. terraform apply Bis zu gcp Sie werden gefragt, ob Sie es unterwegs ausführen möchten. Geben Sie also yes ein

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.

Wenn es wie ↑ aussieht, ist es OK

Geben Sie dann die erstellte GCE-Instanz ein

docker container ls 

Dann läuft der Container also

docker container exec -it Container ID/bin/bash 

Geben Sie den Container mit Befehlen wie

Nohup Python Scraping Python-Datei> log.txt 2>&1 & 

Lassen Sie das Programm laufen

Löschen Sie die Instanz

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

Wird von gelöscht

Suchtpunkt

Fügen Sie ein Dienstkonto hinzu

Error: Cannot get auth token: Metadata server responded with status 404 Wann wann Es scheint, dass Sie keine Token vom Metadatenserver von GCE erhalten können ...

Wenn Sie also den folgenden Befehl in der Instanz ausführen,

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

Die Meldung ↓ wird angezeigt Service account not enabled on this instance

Als ich den Dienstkonto-Anhang zu main.tf hinzufügte, war es OK ↓

main.Dieser Teil von tf


service_account {
    email = "<Dienstkonto>"
    scopes = ["cloud-platform"]
  }

Referenz

Terraform-Dokumentation Instanz erstellen und konfigurieren (https://cloud.google.com/container-optimized-os/docs/how-to/create-configure-instance?hl=ja#gcloud_1) Variablen in Terraform verwenden GCP Infrastructure Construction Automation Road Teil 1 ~ Terraform-Einführung ~ Stellen Sie mit Terraform eine Web-App für Google Compute Engine bereit. Terraform 0.12 wurde veröffentlicht, daher habe ich es aktualisiert [Versuchen Sie, eine GCP-Umgebung mit Terraform zu erstellen](https://techblog.gmo-ap.jp/2017/11/16/terraform%E3%81%A7gcp%E7%92%B0%E5%A2%83% E. scopes param for service_account of google_compute_instance should be optional

Recommended Posts

Erstellen Sie eine GCE-Instanz aus einem GCR Docker-Image mithilfe von Terraform
Generieren Sie ein Docker-Image mit Fabric
Erstellen Sie mit Pandas einen Datenrahmen aus Excel
Erstellen Sie mit ClustalW2 einen phylogenetischen Baum aus Biopyton
[AWS Lambda] Erstellen Sie ein Bereitstellungspaket mit dem Amazon Linux Docker-Image
Versuchen Sie es mit Jupyters Docker-Image
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
Verwenden Sie wxpython, um ein Gadget-ähnliches transparentes Hintergrundbildfenster zu erstellen
Erstellen Sie eine Instanz einer vordefinierten Klasse aus einer Zeichenfolge in Python
Erstellen Sie mit turicreate eine API, die Daten aus einem Modell zurückgibt
Suchen Sie mit Pythonista3 nach einem Bild von der Kamerarolle
Erstellen Sie ein Docker-Container-Image mit JRE8 / JDK8 unter Amazon Linux
Machen Sie eine Santa-Kennung aus einem Santa-Bild
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie mit Docker eine Go-Umgebung
Erstellen Sie einen Pandas-Datenrahmen aus einer Zeichenfolge.
Erstellen Sie ein verschachteltes Wörterbuch mit defaultdict
Erstellen Sie die CRUD-API mit der Fast API
Erstellen Sie mit Boost.Python einen C-Sprach-Wrapper
Verwenden Sie Matplotlib, um mehrere Liniendiagramme gleichzeitig aus einem Datenrahmen zu erstellen
Erstellen Sie mit Mecab aus Python3 ein Tool, das Furigana automatisch mit HTML schüttelt
Erstellen Sie einen Stapel mit einer Warteschlange und eine Warteschlange mit einem Stapel (von LetCode / Implement Stack using Queues, Implement Queue using Stacks)
So erstellen Sie einen Klon aus Github
Erstellen Sie mit Python + PIL ein Dummy-Image.
Erstellen Sie mit dem Sympy-Modul ein Diagramm
[Python] Erstellen Sie eine Stapelumgebung mit AWS-CDK
Erstellen Sie eine Rangliste aus den Ergebnissen der JFL-Spiele
So erstellen Sie ein Repository aus Medien
[Golang] Erstellen Sie ein Docker-Image mit Github-Aktionen
Erstellen Sie einen Webdienst mit Docker + Flask
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
Erstellen Sie Einstellungen in Terraform, um Nachrichten von AWS Lambda Python3.8 an Slack zu senden