[GCP] Un mémorandum lors de l'exécution d'un programme Python avec Cloud Functions

J'ai essayé d'exécuter Python avec Cloud Functions et cela a fondu pendant des jours, alors Je le quitterai pour que mon futur moi ne fondre plus.

Journal

Vous pouvez également vérifier la sortie du journal en imprimant à partir de Cloud Logging lorsque le processus se termine normalement, Lorsqu'une exception se produit, imprimer dans la clause except n'imprime pas les détails dans Cloud Logging, ne laissant que les informations «crash». Avec cela, il n'y a aucun indice, et je n'ai aucune idée du type d'erreur survenu dans quel processus. Si vous utilisez le module de journalisation, le journal sera affiché fermement là où vous souhaitez sortir, et l'icône de chaque ligne de Cloud Logging changera en fonction du niveau de journalisation, ce sera donc plus facile à utiliser.

import logging
import traceback

def main():
    try:
        #En traitement
        logger.info("output by logger")
        print("output by print") #Sortie lorsque le traitement se termine normalement
    except:
        traceback.print_exc() #Pas de sortie vers Cloud Logging
        logger.error("error by logger: ", exc_info=True)
        raise

Autour de l'authentification avec d'autres services de GCP / Google

Avec l'ADC (https://cloud.google.com/docs/authentication/production?hl=ja), vous pouvez obtenir les informations d'identification avec google.auth.default (). En fonction du service à authentifier, des informations sur l'étendue des informations d'identification peuvent être ajoutées et des rôles peuvent être définis pour le compte de service d'exécution si nécessaire.

Lors du développement local, enregistrez les informations d'identification dans un fichier json, et spécifiez simplement le chemin du fichier json dans la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS, et google.auth.default () sera authentifié, donc local et Cloud Il n'est pas nécessaire de brancher le traitement dans Functions.

import google.auth
from google.cloud import kms_v1
import gspread

def spreadsheet(url):
    credentials, _ = google.auth.default(scopes=['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'])
    gc = gspread.authorize(credentials)
    return gc.open_by_url(url)

def kms_client():
    credentials, _ = google.auth.default()
    return kms_v1.KeyManagementServiceClient(credentials=credentials)

Recherchez la cause de l'erreur 400 Bad Request lors de la création d'une nouvelle depuis l'API Cloud Functions

C'est un peu en dehors de la pointe du programme Python, mais je suis accro au déploiement de fonctions sur Cloud Functions en utilisant terraform, donc je vais laisser cela aussi.

Je ne pense pas que vous rencontrerez ce problème lors de la création d'une fonction à partir de la console GCP sur le Web, mais si vous l'appliquez même si vous pouvez voir la différence de plan dans terraform.

400 Bad Request INVALID_ARGUMENT The request has errors

↑ Seul un message comme celui-ci est émis, et je ne sais pas quel élément est défectueux.

Pour terraform, l'ajout de TF_LOG = debug à la variable d'environnement ne change pas une grande partie des informations obtenues. Cependant, notez les informations du corps de la requête générées par ce TF_LOG = debug.

Dans la page de référence de l'API des fonctions cloud (https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions/create?hl=ja) ** Essayez cette API ** Si vous entrez le corps de la demande en sortie par TF_LOG = debug et exécutez EXECUTE, le nom du champ avec le défaut et les détails du défaut seront affichés dans le message en plus de 400 Bad Request INVALID_ARGUMENT La demande comporte des erreurs. pense.

Variables d'environnement prédéfinies

Puisque je l'imprime à chaque fois et que je la vérifie, je laisserai la sortie telle quelle sous forme de mémorandum.

environ({
  'PORT': '8080',
  'X_GOOGLE_WORKER_PORT': '8091',
  'NODE_ENV': 'production',
  'X_GOOGLE_ENTRY_POINT': 'entrypoint',
  'FUNCTION_TRIGGER_TYPE': 'HTTP_TRIGGER',
  'GCLOUD_PROJECT': 'project_id',
  'DEBIAN_FRONTEND': 'noninteractive',
  'X_GOOGLE_FUNCTION_MEMORY_MB': '256',
  'FUNCTION_TIMEOUT_SEC': '60',
  'SUPERVISOR_INTERNAL_PORT': '8081',
  'ENTRY_POINT': 'entrypoint',
  'X_GOOGLE_LOAD_ON_START': 'false',
  'X_GOOGLE_FUNCTION_REGION': 'asia-northeast1',
  'X_GOOGLE_FUNCTION_VERSION': '1',
  'WORKER_PORT': '8091',
  'VIRTUAL_ENV': '/env',
  'X_GOOGLE_GCP_PROJECT': 'project_id',
  'CODE_LOCATION': '/user_code',
  'PWD': '/user_code',
  'X_GOOGLE_CONTAINER_LOGGING_ENABLED': 'false',
  'FUNCTION_NAME': 'dummy_function',
  'X_GOOGLE_CODE_LOCATION': '/user_code',
  'FUNCTION_MEMORY_MB': '256',
  'X_GOOGLE_FUNCTION_IDENTITY': 'dummy_service_account@project_id.iam.gserviceaccount.com',
  'FUNCTION_IDENTITY': 'dummy_service_account@project_id.iam.gserviceaccount.com',
  'FUNCTION_REGION': 'asia-northeast1',
  'GCP_PROJECT': 'project_id',
  'X_GOOGLE_FUNCTION_NAME': 'dummy_function',
  'X_GOOGLE_SUPERVISOR_HOSTNAME': 'supervisor',
  'HOME': '/tmp',
  'SUPERVISOR_HOSTNAME': 'supervisor',
  'PATH': '/env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
  'X_GOOGLE_GCLOUD_PROJECT': 'project_id',
  'X_GOOGLE_FUNCTION_TRIGGER_TYPE': 'HTTP_TRIGGER',
  'X_GOOGLE_SUPERVISOR_INTERNAL_PORT': '8081',
  'X_GOOGLE_FUNCTION_TIMEOUT_SEC': '60',
  'LC_CTYPE': 'C.UTF-8',
})

Résumé

Si des informations utiles peuvent être sorties dans le journal, l'investigation des défauts sera plus facile. L'authentification est finement contrôlée par le paramètre de rôle du compte de service, en s'appuyant sur google.auth.

J'ai seulement le sentiment qu'il y a encore un point d'harmonie, mais je sens que j'ai saisi le point.

Recommended Posts

[GCP] Un mémorandum lors de l'exécution d'un programme Python avec Cloud Functions
Lors de l'écriture d'un programme en Python
Remarques sur l'utilisation de la saisie semi-automatique lors de l'exécution interactive de Python sous Windows
Créer un environnement Python + OpenCV sur Cloud9
[GCP] Procédure de création d'une application Web avec Cloud Functions (Python + Flask)
Argument de variable Python Un mémorandum lors de l'héritage d'une classe définie
Une histoire sur l'exécution de Python sur PHP sur Heroku
Un mémorandum pour toucher Python Flask avec Heroku
Pièges piégés lors de l'exécution d'exécutables Windows Python
Un mémorandum lors de l'écriture de code expérimental ~ Se connecter en python
Que contient cette variable (lorsque le script Python est en cours d'exécution)
De l'achat d'un ordinateur à l'exécution d'un programme sur python
[Django] Mémorandum lorsque vous souhaitez communiquer de manière asynchrone [Python3]
J'ai obtenu "ModuleNotFoundError: aucun module nommé" azure "" lors de l'exécution d'un programme à l'aide du SDK Azure pour Python
Résumé des points à garder à l'esprit lors de l'écriture d'un programme qui s'exécute sur Python 2.5
Spécifiez les options lors de l'exécution de python
Mémorandum sur la corrélation [Python]
Un mémorandum sur le simulacre de Python
[GCP] Comment générer des journaux Cloud Functions vers Cloud Logging (Stackdriver Logging) (Python)
Lorsque vous souhaitez lancer une commande UNIX sur Python
Émulez les fonctions GCP Cloud localement
Créez un classement de jeu sur le cloud Alibaba en utilisant Python et Redis
Publier un message d'IBM Cloud Functions sur Slack en Python
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Jouez avec le cadre gratuit GCP ② ~ Airflow (sur Compute Engine), Cloud Functions ~
Déterminer si la sortie standard est acheminée lors de l'exécution d'un script Python
"Erreur de valeur: impossible de configurer le gestionnaire'file_output_handler '" lors du démarrage d'un programme python
Comment mettre à jour la version Python de Cloud Shell dans GCP
Mémorandum lors de l'exécution de Python sur EC2 avec Apache
Tout, de la création d'un environnement Python à son exécution sous Windows
Construire un environnement Python sur Mac
[python] Gérer les fonctions dans une liste
Construire un environnement Python sur Ubuntu
[Python] Un mémorandum de belle soupe4
Créer un environnement Python sur Mac (2017/4)
Mémorandum sur la mémorisation des fonctions récursives
Exécutez un serveur Linux avec GCP
Créer un environnement python dans centos
Précautions lors de la création d'un générateur Python
Créer un environnement python3 sur CentOS7
Une note lors de l'utilisation de systemd pour garder CentOS 7 toujours en cours d'exécution des scripts Python qui n'étaient pas particulièrement conscients de l'exécution en tant que démon
Points à surveiller lors de la création d'un environnement Python sur un Mac
Lors de l'exécution d'un shell Python à partir d'Electron, transmettez plusieurs arguments pour exécuter Python.
[Django] Erreur de version de sqlite lors de l'exécution de python manage.py dans l'environnement aws cloud9
Un mémorandum parce que j'ai trébuché en essayant d'utiliser MeCab avec Python
Créez un environnement d'apprentissage pour le «Deep learning from scratch» avec Cloud9 (jupyter miniconda python3)
Un mémorandum lorsque Django est installé sur le serveur de location de Sakura (plan standard)
Notifier Slack lorsque le processus d'apprentissage automatique en cours d'exécution sur GCP est terminé
Migrer les applications Django exécutées sur Python 2.7 vers Python 3.5
J'ai fait un programme de gestion de la paie en Python!
Précautions lors du décapage d'une fonction en python
Construire un environnement python sur MacOS (Catallina)
Créez un environnement python sur votre Mac
Un mémo contenant Python2.7 et Python3 dans CentOS
Carte des informations de location sur une carte avec python