[PYTHON] API REST facile avec API Gateway / Lambda / DynamoDB

La 4e série de records de développement de services WEB avec 3 amis de l'université.

Dans la configuration du service WEB que nous allons faire cette fois (présenté dans cet article) Je voudrais résumer la méthode de construction d'API du côté back-end (API Gateway + Lambda + DynamoDB).

supposition

Portée de cet article

Diagramme

image.png

Dans cet article, je voudrais expliquer les deux points suivants.

  1. Paramètres actuels pour API Gateway, Lambda et DynamoDB dans le diagramme de configuration ci-dessus
  2. Modifier la procédure lors de l'ajout d'une nouvelle méthode à l'API

Paramètres actuels

Commençons par la situation de DynamoDB, qui est le point final des données. Ensuite, je présenterai les paramètres d'API Gateway qui reçoit les demandes de l'application Flask, Enfin, jetons un œil au contenu de Lambda, qui connecte DynamoDB et API Gateway.

DynamoDB Pour vérifier les paramètres DynamoDB, ouvrez DynamoDB à partir de AWS Management Console. image.png

Après avoir ouvert la console d'administration DynamoDB, sélectionnez «Tables» dans le menu de gauche pour afficher la liste des tables. image.png

Sélectionnez la table à laquelle vous souhaitez vous référer (ripple_prj cette fois) pour afficher des informations détaillées telles qu'un aperçu de la table et des éléments enregistrés. image.png

Le nom de la table ripple_prj utilisé cette fois est nommé par la règle<nom du site> _ <nom de la ressource>. Autrement dit, ripple_prj est une table pour gérer les ressources prj sur le site ripple.

La clé de partition principale est prj_id.

Dans le site ondulé que nous créons cette fois, la clé de tri n'est pas définie de sorte que les informations prj soient renvoyées à l'écran et que vous puissiez rechercher et affiner par le contrôle d'affichage à l'écran. Si vous souhaitez définir des conditions de recherche lors de la récupération de données à partir de DynamoDB, vous devez spécifier l'élément que vous souhaitez définir comme clé de tri.

image.png

Si vous ouvrez l'onglet d'élément, vous pouvez voir les données enregistrées dans la table ripple_prj. Vous pouvez vérifier et modifier les détails de chaque enregistrement en cliquant sur la clé de partition primaire de chaque ligne (partie prj0001 ou prj0002 affichée en bleu dans la colonne prj_id).

image.png

Jusqu'à présent, nous avons confirmé la table sur DynamoDB et le contenu des données stockées dans la table.

Lors de la liaison avec l'application Flask, nous examinerons et implémenterons comment acquérir ces données DynamoDB et comment les enregistrer et les mettre à jour.

API Gateway Ouvrez API Gateway depuis AWS Management Console. image.png

La liste des API définies dans API Gateway s'ouvre. L'API du service WEB que nous créons cette fois-ci est créée avec le nom ripple, alors cliquez dessus pour ouvrir les détails. image.png

La structure hiérarchique des ressources et des méthodes définies sur l'API s'affiche. image.png

Cliquez sur / prj (ressource prj) pour afficher une liste des méthodes définies dans la ressource prj. GET / prj est le processus d'obtention de la liste prj. POST / prj est un nouveau processus d'enregistrement prj Cela correspond à. image.png

De même, cliquer sur / {prjid} (/ prj / {prjid} resource) affichera une liste des méthodes configurées pour cette ressource. GET / prj / {prjid} est le processus pour obtenir un projet spécifique spécifié par prjid. Cela correspond à. image.png

À l'heure actuelle, il a été confirmé que trois types de traitement sont enregistrés dans l'API ripple. Ensuite, je voudrais examiner de plus près le contenu de chaque processus.

GET /prj Cliquez sur GET sur la ressource / prj pour voir le flux de traitement au sein de la méthode. image.png

Le traitement de la passerelle API est effectué selon le flux suivant.

Client (dans ce cas, l'application Flask sur Heroku) → Demande de méthode (définir les paramètres que API Gateway reçoit du client) → Demande d'intégration (définissez les paramètres que API Gateway transmet à Lambda suivant)   →Lambda → Réponse intégrée (définir les paramètres que API Gateway reçoit de Lambda) → Réponse de la méthode (définir les paramètres que API Gateway renvoie au client) → Client (reçoit les résultats du traitement API Gateway)

Il y a deux parties définies par GET / prj: la demande de méthode et la demande d'intégration.

Demande de méthode GET / prj

J'ai défini le besoin d'une clé API sur true. ripple nécessite une clé API pour toutes les API. La raison pour laquelle la clé API est requise cette fois est que nous voulons limiter la source d'accès uniquement à l'application Flask sur Heroku.

Le paramètre de chaîne de requête URL n'est pas défini en particulier. Généralement, dans la méthode GET, vous pouvez ajouter ? À la fin de l'URL comme https: //my-api.com/prj? Key1 = value1 & key2 = value2 et passer des paramètres sous la forme de key = value. Je peux le faire. Cette fois, puisque le traitement de GET / prj consiste à obtenir la liste de prj, il n'était pas nécessaire de définir les paramètres. image.png

Demande d'intégration

Cette fois, puisque le traitement suivant est implémenté dans Lambda, Type d'intégration: Lambda Fonction Lambda: ripple_prj Est réglé. (La mise en œuvre de ripple_prj sera décrite plus tard)

Un modèle de mappage est défini pour définir les paramètres à transmettre à Lambda. image.png

Le contenu du modèle de mappage est le suivant. La chaîne de caractères fixe «recherche» est définie dans le paramètre «méthode». image.png

POST /prj Sera ajouté à une date ultérieure.

GET /prj/{prjid} Sera ajouté à une date ultérieure.

Lambda Je crée une fonction Lambda appelée ripple_rpj.

ripple_prj/lambda_function.py


import boto3

dynamodb = boto3.resource('dynamodb') #Sélectionnez les ressources à utiliser
table_name = "ripple_prj" #nom de la table
dynamotable = dynamodb.Table(table_name)

def get(event):
    if "prj_id" not in event:
        return event
    primary_key = {"prj_id": event["prj_id"]} #nom de la table
    res = dynamotable.get_item(Key=primary_key) #Recherchez avec le prisme spécifié et obtenez le résultat
    item = res["Item"] #Puisqu'aucun élément n'est spécifié, tous

    return item

def search(event):
    response = dynamotable.scan()
    items = response['Items']
    return items

def create(event):
    print(event)
    response = dynamotable.put_item(
        Item={
            'prj_id': event['prj_id'],
            'name': event['name'],
            'goal': event['goal'],
            'issue': event['issue'],
            'description': event['description'],
            'term': event['term'],
            'term_unit': event['term_unit'],
            'create_date': event['create_date'],
        }
    )
    return response
    

def lambda_handler(event, context):
    print(event)
    return eval(event['method'])(event)

Points de mise en œuvre

Modifier la procédure lors de l'ajout d'une nouvelle méthode à l'API

Actuellement, il n'y a que la référence et l'enregistrement de prj, implémentons donc le processus de mise à jour de prj.

DynamoDB Aucun travail car il n'y a pas de modifications aux tables / éléments existants

API Gateway Ajoutez une nouvelle méthode put pour la ressource prj. Sera ajouté à une date ultérieure.

Lambda Ecrivez et enregistrez le processus d'écrasement et de mise à jour des informations prj existantes avec les informations prj reçues. Sera ajouté à une date ultérieure

Déployer API Gateway

Testez lorsque tout est terminé et déployez si OK. Une fois déployées, les modifications seront publiées et de nouvelles méthodes peuvent être appelées à partir de l'application Flask. Sera ajouté à une date ultérieure

Correspondance côté Flacon

Ajouter le traitement des appels API. Avec cette méthode, plusieurs personnes ouvraient la page du projet en même temps, Lorsque chacun est mis à jour, les données de la personne qui a mis à jour plus tôt seront écrasées par la dernière personne et disparaissent. Les éléments qui ne peuvent en contenir qu'un, comme le nom du projet et les objectifs, peuvent être gagnés plus tard, Pour les éléments qui peuvent avoir plusieurs valeurs, telles que la chronologie, il est nécessaire de faire référence au dernier état DynamoDB et de fusionner lorsqu'une personne ultérieure s'inscrit. Mettez en œuvre la logique en tenant compte de ce côté. Sera ajouté à une date ultérieure.

Recommended Posts

API REST facile avec API Gateway / Lambda / DynamoDB
[AWS SAM] Créer une API avec DynamoDB + Lambda + API Gateway
[AWS] Créer une API avec API Gateway + Lambda
Afficher les images sur S3 avec API Gateway + Lambda
LINE BOT avec Python + AWS Lambda + API Gateway
[AWS] Essayez de tracer API Gateway + Lambda avec X-Ray
Prenez rapidement une chaîne de requête avec API Gateway-> Lambda (Python)
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
Utilisez Nutanix avec l'API REST, partie 2
Envoyer les images prises avec ESP32-WROOM-32 vers AWS (API Gateway → Lambda → S3)
J'ai essayé ChatOps avec Slack x API Gateway x Lambda (Python) x RDS
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Manipulation des données DynamoDB avec Lambda (Node et Python)
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
Essayez d'implémenter un robot Cisco Spark avec AWS Lambda + Amazon API Gateway (Python)
Easy X-Ray avec Lambda Layer et CloudFormation / sam-cli
Transmettre Cognito Id à Lambda via API Gateway
Version Amazon API Gateway et AWS Lambda Python
Écrire plusieurs enregistrements dans DynamoDB avec Lambda (Python, JavaScript)
Essayez d'automatiser la surveillance du nombre de Qiita avec Lambda + DynamoDB + CloudWatch
Créer des couches Lambda avec Lambda
Easy Grad-CAM avec pytorch-gradcam
Création d'un BOT «Présentation non officielle du produit remis à neuf par Apple» avec l'API de messagerie LINE (v2) + API Gateway + lambda (python)
Utiliser DynamoDB avec Python
Extruder avec l'API Fusion360
Débogage facile avec ipdb
TopView facile avec OpenCV
Tenez compte du prétraitement courant lors du traitement du flux DynamoDB avec Lambda (Python)
API Nifty Cloud facile à utiliser avec botocore et python
La première API à créer avec le framework Python Djnago REST