[PYTHON] Ich habe AWS Chalice berührt

Was ist AWS Kelch?

Amazon API Gateway und AWS Lambda werden über die CLI halbautomatisch angeklickt. Es scheint, dass es gemacht werden kann. Ich mag AWS Lambda (und Amazon API Gateway), also habe ich es berührt.

Vorbereitung

Erstellen einer virtuellen Umgebung für Python

Es wird empfohlen, eine virtuelle Umgebung mit AWS Chalice Hands-on zu erstellen. Erstellen Sie sie daher nach Bedarf. Ich werde.

Installieren von Virtualenv zum Erstellen einer virtuellen Umgebung

$ pip install virtualenv

Erstellen einer virtuellen Umgebung

# 『~/.virtualenvs/chalice-"handson" ist der Umgebungsname
#Jeder Umgebungsname ist in Ordnung, da er nur mit AWS zum Anfassen übereinstimmt.
virtualenv ~/.virtualenvs/chalice-handson

Virtuelle Umgebung aktivieren

$ source ~/.virtualenvs/chalice-handson/bin/activate
#"Quelle" ist ".] Kann ersetzt werden, daher hat der folgende Befehl dieselbe Bedeutung wie oben.
$ . ~/.virtualenvs/chalice-handson/bin/activate

Ende der virtuellen Umgebung

Wenn Sie die virtuelle Umgebung beenden möchten, verwenden Sie den folgenden Befehl. Selbst wenn Sie die virtuelle Umgebung verlassen, bleiben die erstellten Dateien der virtuellen Umgebung erhalten, sodass Sie die virtuelle Umgebung aufrufen können, indem Sie den Befehl enable erneut eingeben.

$ deactivate

Kelchinstallation

$ pip install chalice
#Überprüfen Sie, ob es installiert wurde
$ chalice --version
chalice 1.12.0, python 3.7.3, darwin 19.6.0

AWS-Anmeldeinformationen

Wenn ~ / .aws / credentials und ~ / .aws / config nicht vorhanden sind, setzen Sie sie mit dem folgenden Befehl. Andernfalls werden Sie bei der Bereitstellung in AWS verärgert.

$ aws configure

Erstellen Sie ein neues Projekt

Nachdem wir fertig sind, werfen wir einen kurzen Blick auf den Ablauf von der Projekterstellung bis zur Bereitstellung in AWS. Erstellen Sie zunächst ein Projekt mit dem folgenden Befehl.

#"Helloworld" ist der Projektname, der in AWS zum Anfassen verwendet wird, und jeder Projektname kann angegeben werden.
$ chalice new-project helloworld

Die folgenden Dateien werden durch Erstellen eines Projekts erstellt.

.
├── .chalice
│   └── config.json
├── .gitignore
├── app.py
└── requirements.txt

Der Inhalt der automatisch erstellten app.py lautet wie folgt. Der Inhalt ist einfach und gibt beim Zugriff auf den Index des API-Gateway-Endpunkts {'Hallo': 'Welt'} als Antworttext zurück. Der Antworttext {'Hallo': 'Welt'} wird mit {'Hallo': 'Welt'} festgelegt, auch wenn der Projektname nicht helloworld ist.

from chalice import Chalice

app = Chalice(app_name = 'helloworld')

@app.route('/')
def index():
    return {'hello': 'world'}    #Auch wenn der Projektname nicht helloworld ist, hier{'hello': 'world'}ist

Lokale Tests

Probieren Sie es in Ihrer lokalen Umgebung aus, um festzustellen, ob es sich tatsächlich wie oben beschrieben verhält (gibt es beim Zugriff {'Hallo': 'Welt'} zurück)? Sie können den lokalen Server mit dem folgenden Befehl starten. : + 1: Einfach und nett!

$ chalice local
Serving on http://127.0.0.1:8000

Wenn Sie versuchen, mit einem Browser darauf zuzugreifen, sollte "{" Hallo ":" Welt "}" angezeigt werden.

Bereitstellung in AWS

Es sieht in Ordnung aus, also lassen Sie es uns in AWS bereitstellen, damit von außen darauf zugegriffen werden kann. Die Bereitstellung ist einfach. Führen Sie einfach den folgenden Befehl aus:

$ chalice deploy

Anschließend wird in AWS automatisch Folgendes erstellt.

Nach der Bereitstellung lautet die Konfiguration wie folgt.

.
├── .chalice
│   ├── config.json
│   ├── deployed
│   │   └── dev.json
│   └── deployments
│       └── xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-python3.8.zip
├── .gitignore
├── app.py
└── requirements.txt

Schließlich wird der API-Gateway-Endpunkt als "Rest-API-URL" angezeigt. Greifen Sie also mit einem Browser darauf zu. Wenn Sie die Rest-API-URL nicht kennen, können Sie sie mit dem folgenden Befehl anzeigen.

$ chalice url

Bearbeitung von Anfragen

Nachdem Sie die Grundlagen der Verwendung von AWS Chalice kennengelernt haben, sehen wir uns einige weitere Steuerungsfunktionen an.

URL-Parameter

Sie können Parameter in das Pfadmuster @ app.route ('/') von app.py schreiben, wie unten gezeigt, und Sie können den als Parameter empfangenen Wert als Argument in der Methode verwenden.

from chalice import Chalice

app = Chalice(app_name = 'helloworld')

@app.route('/')
def index():
    return {'hello': 'world'} 

#Fügen Sie Folgendes hinzu
@app.route('/hello/{name}')
def greet(name):
    return {'hello': name}

Führen Sie nach dem Bearbeiten von "app.py" erneut "Kelch bereitstellen" aus. Fügen Sie nach Abschluss der Bereitstellung "/ hello /" beliebiger Wert "" zum API-Gateway-Endpunkt hinzu und greifen Sie mit einem Browser darauf zu. Sie sollten "{" Hallo ":" "beliebiger Wert" "}" sehen. Bitte beachten Sie, dass der als "beliebiger Wert" übergebene Wert eine Zeichenfolge ist, auch wenn es sich um einen numerischen Wert handelt.

HTTP-Methode

Die HTTP-Methode kann angegeben werden, indem die Methode wie folgt in @ app.route ('/') von app.py geschrieben wird.

from chalice import Chalice

app = Chalice(app_name = 'helloworld')

@app.route('/')
def index():
    return {'hello': 'world'}

@app.route('/hello/{name}')
def greet(name):
    return {'hello': name}

#Fügen Sie Folgendes hinzu
@app.route('/hello', methods = ['POST'])
def hello():
    return {'hello': 'POST world'}

Führen Sie nach dem Bearbeiten von "app.py" erneut "Kelch bereitstellen" aus. Der diesmal hinzugefügte POST kann nicht vom Browser bestätigt werden. Überprüfen Sie ihn daher schnell im interaktiven Modus von Python.

$ python
>>> import requests    #Wenn keine Anforderungen enthalten sind, installieren Sie Pip-Anforderungen
>>> response = requests.post('"API Gateway Endpoint"/hello', data = {})
>>> print(response.text)
{"hello":"POST world"}

Zugriff auf Metadaten

Der Code von hier beschreibt nur den Änderungsblock und die Antwort. Die Metadatenerfassung wird in Form von "app.current_request." Honyara "" angegeben. HTTP Method

@app.route('/hello')
def hello():
    return {'metadata': app.current_request.method}

#Antwort
{"metadata":"GET"}

Query Parameters

@app.route('/hello')
def hello():
    return {'metadata': app.current_request.query_params}

#Antwort (Anfrage ist/hello?test1=abc&test2=123&test2=456)
#Wenn in der Anfrage ein gleichnamiger Parameter angegeben ist, gewinnt der Kelch später (test2)=123&test2=456 ist test2=Werden Sie 456)
{"metadata":{"test1":"abc","test2":"456"}}

Request Body - Raw Ruft den Anforderungshauptteil im Bytetyp ab. Wenn "Content-Type: application / json", können Sie "app.current_request.json_body" anstelle von "app.current_request.raw_body" verwenden. Dies ist ein Zeichenfolgentyp.

@app.route('/hello')
def hello():
    return {'metadata': app.current_request.raw_body}

#Anfrage
$ python
>>> import requests, json
>>> response = requests.post('"API Gateway Endpoint"/hello', data = json.dumps({'hello': 'world'}), headers = {'Content-Type': 'application/json' })
>>> print(response.text)
#Antwort
{"metadata":{"hello":"world"}}

Reaktionsbehandlung

Schauen wir uns als nächstes die Antwort an.

Benutzerdefinierte HTTP-Antwort

Wenn Sie einen beliebigen Statuscode oder Header zurückgeben möchten, geben Sie ihn mit beliebigen Informationen zurück, die im Antwortklassenobjekt enthalten sind. Vergessen Sie nicht die "Importantwort". (Es spielt keine Rolle, aber ich habe "json.dumps" ohne "json.dump" und "s" geschrieben und "{" Code ":" InternalServerError "," Message ":" Ein interner Serverfehler ist aufgetreten. "} Ich bekam eine Antwort von `und war eine Weile süchtig danach, ohne den Fehler zu bemerken ...: durchhalten :)

from chalice import Chalice, Response
import json

app = Chalice(app_name='helloworld')

@app.route('/')
def index():
    return Response(
        body = json.dumps({'hello':'world'}),
        headers = {'Content-Type': 'application/json'},
        status_code = 200
    )

@app.route('/text')
def text():
    return Response(
        body = 'Hello, World',
        headers = {'Content-Type': 'text/plain'},
        status_code = 200
    )

Fehler HTTP-Antwort

Da es eine Klasse zum Zurückgeben einer Fehlerantwort gibt, werden wir sie verwenden. Im folgenden Beispiel ist es 403 Verbotener Fehler. Vergessen Sie nicht, auch hier die Fehlerklasse zu importieren.

from chalice import Chalice, ForbiddenError

app = Chalice(app_name='helloworld')

@app.route('/forbidden')
def forbidden():
    raise ForbiddenError(
        '403!'
    )

Es gibt andere Fehlerklassen wie folgt. ([[AWS mit einfacher Handarbeit lernen] Erstellen Sie eine serverlose RESTful-API! Python-App-Entwicklung mit Chalice | AWS Startup Blog](https://aws.amazon.com/jp/blogs/startup/event] Siehe -report-chalice-handson /)) Es ist auch möglich, eine Antwort mit einem Fehlercode zurückzugeben, der nicht mithilfe der oben eingeführten benutzerdefinierten HTTP-Antwort vorbereitet wurde. (Natürlich ist es auch möglich, einen Fehler mit einem Fehlercode in einer benutzerdefinierten HTTP-Antwort zurückzugeben.)

CORS aktivieren

Sie können einfach Folgendes schreiben.

@app.route('/', methods = ['POST'], cors = True)

Dekorateur

Ich habe es immer in Form von "@ app.route (" / ")" geschrieben, aber dies ist in Form von API Gateway + AWS Lambda. Eine andere AWS Lambda-Integration als API Gateway ist mithilfe anderer Dekoratoren möglich. Folgendes wird derzeit unterstützt.

Für eine detaillierte Verwendung und Beispielcode ist Ich habe versucht, Lambda (Python) und API Gateway mit Chalice zu verwalten sehr hilfreich.

Löschen

IAM-Rollen, Lambda und API-Gateway (für @ app.route), die in AWS mit "Kelchbereitstellung" bereitgestellt werden, können mit dem folgenden Befehl in großen Mengen gelöscht werden.

$ chalice delete

Zusammenfassung

Es scheint, dass Sie mit AWS Chalice ganz einfach eine Umgebung ohne Server erstellen können. Es ist einfach zu löschen, daher ist es schön, es einfach erstellen und löschen zu können. Ich habe darüber nachgedacht, ein konkreteres Beispiel zu schreiben, aber da es bereits ein langer Artikel geworden ist, werde ich es in einem anderen Artikel zusammenfassen.

We're hiring! Wir entwickeln einen KI-Chatbot. Wenn Sie interessiert sind, können Sie uns gerne über die Wantedly-Seite kontaktieren!

Referenzartikel

Recommended Posts

Ich habe AWS Chalice berührt
Ich habe versucht, AWS Chalice zu verwenden
Ich habe HaikuFinder berührt
Ich berührte Flask
Ich habe AWS Iot ausprobiert
Ich habe versucht, die Qiita-API zu berühren
Ich berührte Bachstelze (2). Einführung von Django-Erweiterungen.
Ich berührte Tensorflow und Keras
Ich berührte PyAutoIt für einen Moment
Stellen Sie fest, ob AWS Chalice ein lokaler Kelch ist
Ich habe etwas berührt, das sich Touch Designer nennt
Ich habe einen neuen AWS S3-Eimer hergestellt
Ich berührte "Orator" und machte mir eine Notiz
Ich mache mein eigenes aws cli
Ich möchte mit aws mit Python spielen
3 kleine Geschichten, die ich mit Chalice überprüft habe
Ich habe das Datenaufbereitungstool Paxata berührt
Ich habe gerade FizzBuzz mit AWS Lambda gemacht