[PYTHON] Explosive Speed API Konstruktion ~ Charice Edition ~

Senden Sie an diejenigen, die API mit explosiver Geschwindigkeit veröffentlichen möchten

https://github.com/awslabs/chalice

Was ist Kelch?

Dieser Kelch, der den Namen des Heiligen Grals trägt, ist eher ein Werkzeug als ein Rahmen. Wenn Sie über Anwendungscode verfügen, können Sie AWS Lambda, AWS APIGateway, IAM-Rolle usw. festlegen und auf AWS bereitstellen. ist. Auf diese Weise können Sie eine API mit explosiver Geschwindigkeit erstellen und eine Produktionsversion realisieren.

Als allererstes

Da wir APIs unter vollständiger und vollständiger Verwendung von AWS-Diensten erstellen, müssen Sie zuerst die Anmeldeinformationen festlegen.

$ mkdir ~/.aws
$ cat >> ~/.aws/config
[default]
aws_access_key_id=YOUR_ACCESS_KEY_HERE
aws_secret_access_key=YOUR_SECRET_ACCESS_KEY
region=ap-northeast-1

Wenn Sie durch Umschalten mehrere AWS-Konten verwenden, empfehlen wir, den ACCESS KEY in der Umgebungsvariablen mit direnv festzulegen. Es hängt vom SDK ab, aber für boto3, das dieses Mal verwendet wird, scheinen die Prioritäts- und Umgebungsvariablen mit einer Priorität gelesen zu werden, die mit AWS Cli kompatibel ist, also hier Möglicherweise freuen Sie sich über den Artikel -to-configure-aws-cli /).

Bereitstellen aus der Projekterstellung

Lassen Sie uns wie folgt in die Befehlszeile eintauchen

$ pip install chalice
$ chalice new-project helloworld && cd helloworld
Initial creation of lambda function.
Creating role
Creating deployment package.
Lambda deploy done.
Initiating first time deployment...
Deploying to: dev
https://endpoint/dev/

$ curl https://endpoint/dev
{"hello": "world"}

Die oben genannten Arbeitsreihen werden unmittelbar nach dem Erstellen eines neuen Projekts bereitgestellt. Mit dem Zauberwort "Kelch bereitstellen" wird das Projekt auf "AWS Lambda" bereitgestellt und in einem öffentlich zugänglichen Zustand bereitgestellt, indem "AWS API Gateway" und "AWS Lambda" verknüpft werden. Es ist.

Wenn Sie den Inhalt der API durcheinander bringen möchten, spielen wir mit dem Inhalt von "app.py", der zum Zeitpunkt der Neuerstellung erstellt wurde, als Instinkt.

So erstellen Sie eine API, die Protokolle an S3 ausspuckt

Es gibt viele Anforderungen, z. B. den Wunsch nach einer API, in der Protokolle gespeichert werden. Es gibt viele Fälle, in denen Sie es vorerst als JSON in S3 speichern und später retten. Besonders jetzt AWS Athena Es gibt Dinge, die interaktiv erledigt werden können, und ich höre oft von den Anforderungen.

Erstellen wir eine API, die JSON in diesem Format in S3 schreibt, wenn JSON in die API gestellt wird.

Lassen Sie uns zunächst einen Bucket für S3 erstellen (dies erfordert manuelle Arbeit). Und installieren wir das AWS SDK

$ pip install boto3

Schreiben wir app.py wie folgt um

app.py


from chalice import Chalice

app = Chalice(app_name='helloworld')
import json
import boto3
from botocore.exceptions import ClientError

from chalice import NotFoundError

S3 = boto3.client('s3', region_name='ap-northeast-1')
BUCKET = 'your-bucket-name'

@app.route('/objects/{key}', methods=['GET', 'PUT'])
def s3objects(key):
    request = app.current_request
    if request.method == 'PUT':
        S3.put_object(Bucket=BUCKET, Key=key,
                      Body=json.dumps(request.json_body))
    elif request.method == 'GET':
        try:
            response = S3.get_object(Bucket=BUCKET, Key=key)
            return json.loads(response['Body'].read())
        except ClientError as e:
            raise NotFoundError(key)

Lassen Sie uns nach dem Umschreiben bereitstellen

$ chalice deploy
Updating IAM policy.

The following actions will be added to the execution policy:

s3:GetObject
s3:PutObject

Would you like to continue?  [Y/n]: Y
Updating lambda function...
Regen deployment package...
Sending changes to lambda.
Lambda deploy done.
API Gateway rest API already found.
Deleting root resource id
Done deleting existing resources.
Deploying to: dev
https://endpoint/dev/

Ich habe Y reibungslos eingegeben und bereitgestellt, aber tatsächlich macht chalice die Einstellung der IAM-Rolle hier gut. Zur detaillierten Erläuterung wird zum Zeitpunkt der Bereitstellung der bereitzustellende Quellcode analysiert, die erforderlichen Berechtigungen ermittelt und gefragt, ob das Festlegen dieser Berechtigungen, dh der folgenden beiden Berechtigungen, in Ordnung ist.

Diese Berechtigung wird auf IAM festgelegt und bereitgestellt, damit Lambda auf S3 zugreifen kann. Mit anderen Worten, die Person, die die Anwendung erstellt, wird bereitgestellt, nachdem die IAM-Einstellungen vorgenommen wurden, ohne die IAM-Einstellungen zu kennen.

Was für eine schreckliche Art, es zu tun! !! Die IAM-Einstellungen sind furchtbar ärgerlich, und es kann eine Geschichte wie das Hinzufügen von Admin sein. Ich bin daher froh, wenn sie automatisch und entsprechend eingestellt werden können.

Ergänzung ~ Für die Entwicklung in gesundem Python ~

Python hat eine Lücke zwischen der 2.X-Serie und der 3.X-Serie, und die Welt ist zutiefst traurig. Python unter AWS Lambda ist die 2.7-Serie und unterscheidet sich daher von der 3.X-Serie Daher gibt es viele Fälle, in denen es besser ist, sich an die jeweilige Umgebung anzupassen.

Sich von solch tiefer Traurigkeit zu lösen Die vorhandene Entwicklungsumgebung auf eine beliebige Umgebung umzustellen Lassen Sie uns [pyenv] setzen (https://github.com/pyenv/pyenv)

Recommended Posts

Explosive Speed API Konstruktion ~ Charice Edition ~
CPLEX Python API selbst erstellte manuelle LP-Edition