Ich habe versucht, Python mit Cloud-Funktionen auszuführen, und es ist tagelang geschmolzen Ich werde es verlassen, damit mein zukünftiges Selbst nicht mehr schmilzt.
Sie können die Protokollausgabe auch durch Drucken aus der Cloud-Protokollierung überprüfen, wenn der Vorgang normal abgeschlossen ist. Wenn eine Ausnahme auftritt, werden beim Drucken in der Ausnahmeklausel keine Details in die Cloud-Protokollierung gedruckt, sodass nur die Informationen "Absturz" übrig bleiben. Damit gibt es keinen Hinweis, und ich habe keine Ahnung, welche Art von Fehler in welchem Prozess aufgetreten ist. Wenn Sie das Protokollierungsmodul verwenden, wird das Protokoll fest an der Stelle ausgegeben, an der Sie es ausgeben möchten, und das Symbol für jede Zeile der Cloud-Protokollierung ändert sich je nach Protokollstufe, sodass die Verwendung einfacher ist.
import logging
import traceback
def main():
try:
#wird bearbeitet
logger.info("output by logger")
print("output by print") #Ausgabe, wenn die Verarbeitung normal endet
except:
traceback.print_exc() #Wird nicht in die Cloud-Protokollierung ausgegeben
logger.error("error by logger: ", exc_info=True)
raise
Mit dem ADC (https://cloud.google.com/docs/authentication/production?hl=ja) können Sie die Anmeldeinformationen mit "google.auth.default ()" abrufen. Abhängig vom zu authentifizierenden Dienst können Informationen zum Umfang der Anmeldeinformationen hinzugefügt und bei Bedarf Rollen für das Ausführungsdienstkonto festgelegt werden.
Speichern Sie bei der lokalen Entwicklung die Anmeldeinformationen in einer JSON-Datei und geben Sie einfach den Pfad der JSON-Datei in der Umgebungsvariablen "GOOGLE_APPLICATION_CREDENTIALS" an. "Google.auth.default ()" wird authentifiziert, sodass "Local" und "Cloud" Es ist nicht erforderlich, die Verarbeitung in Funktionen zu verzweigen.
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)
Es ist ein wenig abseits der Spitze des Python-Programms, aber ich bin süchtig danach, Funktionen mithilfe von Terraform für Cloud-Funktionen bereitzustellen, also lasse ich das auch.
Ich denke nicht, dass dies der Fall ist, wenn eine Funktion über die GCP-Konsole im Web erstellt wird, aber wenn ich sie anwende, wenn Terraform den Unterschied im Plan ohne Probleme zeigt.
400 Bad Request INVALID_ARGUMENT The request has errors
↑ Es wird nur eine Nachricht wie diese ausgegeben, und ich weiß nicht, welcher Artikel defekt ist.
Bei Terraform ändert das Hinzufügen von "TF_LOG = debug" zur Umgebungsvariablen nicht viel an den erhaltenen Informationen.
Notieren Sie sich jedoch die von diesem TF_LOG = debug
ausgegebenen Informationen zum Anforderungshauptteil.
In der Cloud-Funktionen API-Referenzseite (https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions/create?hl=ja) ** Probieren Sie diese API aus ** Wenn Sie den von TF_LOG = debug
ausgegebenen Anfragetext eingeben und EXECUTE ausführen, werden der Feldname mit dem Fehler und die Details des Fehlers zusätzlich zu 400 Bad Request INVALID_ARGUMENT Die Anforderung hat Fehler
an die Nachricht ausgegeben. Überlegen.
Da ich es jedes Mal mit print ausdrucke und überprüfe, lasse ich die Ausgabe unverändert als Memorandum.
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',
})
Wenn nützliche Informationen in das Protokoll ausgegeben werden können, ist die Fehleruntersuchung einfacher. Die Authentifizierung wird durch die Rolleneinstellung des Dienstkontos unter Verwendung von "google.auth" genau gesteuert.
Ich habe nur das Gefühl, dass es noch einen Punkt der Harmonie gibt, aber ich habe das Gefühl, dass ich den Punkt verstanden habe.
Recommended Posts