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.
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
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)
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.
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',
})
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.