
Que vous gériez la rotation des clés, créiez des alertes de surveillance ou appliquiez des politiques d’expiration à vos ressources, vous vous tournerez probablement vers les fonctions sans serveur programmées pour trouver une solution bon marché et évolutive. En étudiant la faisabilité de l’utilisation de Google Cloud Functions pour gérer les ressources d’un projet dans Google Cloud Platform, il est apparu que ce type de fonctionnalité était encore assez peu développé. Avec la sortie du nouveau fournisseur Terraform de Google 2.0.0, l’exécution d’une fonction Cloud selon un programme cron donné est désormais un peu plus facile.
GCP 2.0.0 Terraform Provider
Lors de sa sortie le 12 février 2018, la toute nouvelle version du fournisseur GCP pour Terraform a inclus quelques changements intéressants et non documentés, notamment la ressource google_cloudfunctions_function dans la branche google-beta. En parcourant le code source et les tests, nous trouvons de la documentation sur le démarrage.
Configuration
La création d’une fonction Cloud dans Terraform commence par la gestion de votre code source. Il existe plusieurs méthodes différentes, notamment l’extraction à partir d’un dépôt externe, mais pour cet exemple, je vais stocker le code source de Terraform et de la fonction dans le même dépôt, ce qui permettra à Terraform de gérer l’archivage. La structure du dossier ci-dessous est celle que j’ai utilisée pour les échantillons de code dans le reste de cette démo.
terraform/ ├── hello_world/ │ └── main.py ├── main.tf └── variables.tf
Avec cette configuration, notre code Terraform créera une archive compressée du répertoire hello_world, la téléchargera vers un bucket et transmettra cette référence d’objet à la fonction Cloud. Il convient de noter que pour une fonction Cloud avec un moteur d’exécution Python, le fichier qui contient le point d’entrée doit être nommé main.py. Le code Terraform correspondant à cette approche :
# zippez notre code source data "archive_file" "hello_world_zip" { type = "zip" source_dir = "${path.root}/hello_world/" output_path = "${path.root}/hello_world.zip" } # créez le bucket de stockage resource "google_storage_bucket" "hello_world_bucket" { name = "hello_world_bucket" } # placez le code zippé dans le bucket resource "google_storage_bucket_object" "hello_world_zip" { name = "hello_world.zip" bucket = "${google_storage_bucket.hello_world_bucket.name}" source = "${path.root}/hello_world.zip" }
Création de la fonction Cloud
Maintenant que notre code est dans le Cloud, nous devons créer la fonction Cloud elle-même. À l’heure où nous écrivons ces lignes, le support de GCP pour Python Cloud Functions est en version bêta et ne prend en charge que le runtime python3.7.
resource "google_cloudfunctions_function" "hello_world_function" { name = "hello-world-function" description = "Scheduled Hello World Function" available_memory_mb = 256 source_archive_bucket = "${google_storage_bucket.hello_world_bucket.name}" source_archive_object = "${google_storage_bucket_object.hello_world_zip.name}" timeout = 60 entry_point = "hello_world" trigger_http = true runtime = "python37" }
Ici, nous nous assurons d’activer le déclencheur HTTP pour la fonction Cloud puisque Cloud Scheduler requiert un point de terminaison pour la programmation.
Cloud Scheduler
Une fois notre fonction Cloud définie, nous devons maintenant créer son déclencheur programmé.
provider "google-beta" { project = "${var.project_id}" region = "us-east1" zone = "us-east1-b" } # créez une application app engine pour votre programmateur resource "google_app_engine_application" "hello_world_scheduler_app" { project = "${var.project_id}" location_id = "us-east1" } resource "google_cloud_scheduler_job" "hello_world_trigger" { provider = "google-beta" name = "hello-world-scheduler-job" schedule = "${var.schedule_cron}" http_target = { uri = "${google_cloudfunctions_function.hello_world_function.https_trigger_url}" } }
Au moment de la rédaction de cet article, la ressource google_cloud_scheduler_job n’est disponible que dans le fournisseur google-beta, nous devons donc nous assurer de l’inclure dans la définition de la ressource. Notez que si vous avez déjà des ressources App Engine dans une zone particulière, vous devez également spécifier cette région et cette zone ici, puisque Cloud Scheduler utilise App Engine.
L’argument schedule accepte toute chaîne de style cron valide. Par exemple, * * * * * créerait un déclencheur qui se déclenche toutes les minutes. Le fait de les transmettre en tant que variable peut vous permettre de mieux modulariser cette ressource particulière.
Lectures complémentaires