[PYTHON] Construction de l'API de vitesse explosive ~ Édition Charice ~

Envoyez à ceux qui veulent publier une API à une vitesse explosive

https://github.com/awslabs/chalice

Qu'est-ce que le calice

Ce calice, qui porte le nom du Saint Graal, est un outil plutôt qu'un cadre, et si vous avez un code d'application, vous pouvez configurer AWS Lambda, AWS APIGateway, IAM Role, etc. et le déployer sur AWS. est. Cela vous permet de créer une API à une vitesse explosive et de réaliser une version de production.

Tout d'abord

Étant donné que nous allons créer des API à l'aide des services AWS de manière complète et complète, il est nécessaire de définir d'abord les informations d'identification.

$ 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

Si vous utilisez plusieurs comptes AWS en changeant, nous vous recommandons de définir la CLÉ D'ACCÈS dans la variable d'environnement avec direnv. Cela dépend du SDK, mais comme pour boto3 utilisé cette fois, il semble qu'il lit les informations d'identification et les variables d'environnement avec une priorité compatible avec AWS Cli, donc ici Vous serez peut-être heureux de consulter l'article -to-configure-aws-cli /).

Comment déployer à partir de la création de projet

Plongeons dans la ligne de commande comme ci-dessous

$ 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"}

La série de travaux ci-dessus est déployée immédiatement après la création d'un nouveau projet. Avec le mot magique Chalice deploy, il déploie le projet sur ʻAWS Lambda et le déploie dans un état accessible au public en liant ʻAWS API Gateway et ʻAWS Lambda`. Il est.

Si vous voulez gâcher le contenu de l'API, jouons avec le contenu de ʻapp.py` créé au moment de la nouvelle création comme instinct.

Comment créer une API qui crache des journaux vers S3

Il y a de nombreuses exigences telles que vouloir une API qui stocke les journaux pour le moment autour de moi. Il existe de nombreux cas où vous l'enregistrez au format JSON dans S3 pour le moment et le récupérez plus tard. Surtout maintenant, AWS Athena Il y a des choses qui peuvent être faites de manière interactive, et j'entends souvent parler des exigences.

Créons une API qui écrit JSON dans S3 dans ce format lors du POST de JSON sur l'API.

Tout d'abord, faisons un bucket sur S3 (cela nécessite un travail manuel) Et installons le SDK AWS

$ pip install boto3

Réécrivons ʻapp.py` comme suit

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)

Déployons après réécriture

$ 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/

Je suis entré en Y en douceur et l'ai déployé, mais en fait, calice fait bien le réglage du rôle IAM ici. Pour expliquer en détail, lors du déploiement, il analyse le code source à déployer, détermine les autorisations requises et demande s'il est correct de définir ces autorisations, c'est-à-dire les deux autorisations suivantes

Et il définira cette autorisation sur IAM et la déploiera afin que Lambda puisse accéder à S3. En d'autres termes, la personne qui crée l'application est déployée une fois les paramètres IAM définis sans connaître les paramètres IAM.

Quelle façon terrifiante de le faire! !! Les paramètres IAM sont terriblement ennuyeux, et cela peut être une histoire comme l'ajout d'admin, donc je suis heureux si cela peut être défini automatiquement et de manière appropriée.

Supplément ~ Pour le développement en Python sain ~

Python a un écart entre les séries 2.X et 3.X, et il y a une profonde tristesse dans le monde. Python sur AWS Lambda est la série 2.7, donc il est différent de la série 3.X Par conséquent, il existe de nombreux cas où il vaut mieux correspondre à l'environnement actuel.

Pour rompre avec une tristesse si profonde Pour basculer l'environnement de développement à portée de main vers n'importe quel environnement Mettons pyenv

Recommended Posts

Construction de l'API de vitesse explosive ~ Édition Charice ~
CPLEX Python API manuel édition LP