[PYTHON] Émulez les fonctions GCP Cloud localement

Lors de la création d'un backend sur Google Cloud Platform, le déploiement prend environ une minute. Il est donc facile de créer un environnement qui émule localement pendant le développement. Voici comment émuler Cloud Functions dans un environnement Python.

Conclusion

Créez une fonction appelée hello dans main.py et mettez-la

main.py


def hello(request):
    request_json = request.get_json()
    if request.args and 'message' in request.args:
        return request.args.get('message')+'get'
    elif request_json and 'message' in request_json:
        return request_json['message']+'post'
    else:
        return f'Hello Worlds!'

Dans ce dossier, saisissez le terminal ci-dessous.

terminal.


functions-framework --target=hello

Lors de la spécification du port, c'est comme suit.

terminal.


functions-framework --target=hello  --port=8081

commande curl

Il s'agit d'une commande curl pour le débogage.

get.la communication


curl  -X GET "localhost:8081/?message=Hi,get"

post.la communication


curl -X POST -H "Content-Type: application/json" -d '{"message":"hi,post"}' localhost:8081/

À propos des paramètres Cors

main.py


def hello(request):
    request_json = request.get_json()
    headers = {
        'Access-Control-Allow-Origin': '*',
    }
    """
    headers = {
        'Access-Control-Allow-Origin': 'https://example.com',
    }
    """
    if request.args and 'message' in request.args:
        return (request.args.get('message')+'get', 200, headers)
    elif request_json and 'message' in request_json:
        return (request_json['message']+'post', 200, headers)
    else:
        return (f'Hello Worlds!', 200, headers)

Deployment

Si tout se passe bien, déployez sur GCP.

terminal.


 gcloud functions deploy hello \
--runtime python37 --trigger-http --allow-unauthenticated

https://cloud.google.com/functions/docs/quickstart

officiel

https://github.com/GoogleCloudPlatform/functions-framework-python

Exemple d'application

En réalité, la valeur de retour est souvent au format JSON, c'est donc le cas.

main.py


import json

def hello(request):
    request_json = request.get_json()
    headers = {
        'Access-Control-Allow-Origin': 'http://localhost:8080',
    }
    """
    headers = {
        'Access-Control-Allow-Origin': 'https://example.com',
    }
    """
    print('called')

    if request.args and 'message' in request.args:
        input = request.args.get('message')
        rtrn = {'output':'hi %s(get)'%(input)}
        return (json.dumps(rtrn), 200, headers)
    elif request_json and 'message' in request_json:
        input = request_json['message']
        rtrn = {'output':'hi %s(post)'%(input)}
        return (json.dumps(rtrn), 200, headers)
    else:
        rtrn = {'output':'hi (no args)'}
        return (json.dumps(rtrn), 200, headers)

Pour les modules non standard, vous devez créer require.txt, mais dans ce cas, vous n'en avez pas besoin car c'est juste json.

Recommended Posts

Émulez les fonctions GCP Cloud localement
GCP: répétez de Pub / Sub vers Cloud Functions et de Cloud Functions vers Pub / Sub
Comment appeler l'API Cloud à partir de GCP Cloud Functions
[GCP] Un mémorandum lors de l'exécution d'un programme Python avec Cloud Functions
[GCP] Comment générer des journaux Cloud Functions vers Cloud Logging (Stackdriver Logging) (Python)
Jouez avec le cadre gratuit GCP ② ~ Airflow (sur Compute Engine), Cloud Functions ~
GCP: fonctions de lien et Pub / Sub
[GCP] Procédure de création d'une application Web avec Cloud Functions (Python + Flask)