[PYTHON] Créer une liste d'utilisateurs Cognito dans S3 avec SQS Déployer des fonctions de traitement de file d'attente et des API sur Lambda avec SAM

Le titre est devenu peu pratique en japonais, mais je vais le mettre en ordre.

Créez une fonction sur Lambda qui crée automatiquement un fichier CSV de la liste d'utilisateurs gérée par AWS Cognito sur S3. Définissez SQS comme déclencheur pour activer ce Lambda et implémentez l'API pour ajouter une file d'attente de messages à SQS dans un autre Lambda afin que les requêtes HTTP puissent être reçues via API Gateway.

Le diagramme de configuration est le suivant.

image.png

Installation de l'AWS-CLI et configuration IAM

$ brew install awscli
$ aws configure
AWS Access Key ID [None]: ************
AWS Secret Access Key [None]: ************************
Default region name [None]: ap-northeast-1
Default output format [None]: json

Installation SAM

$ brew tap aws/tap
$ brew install aws-sam-cli
$ sam --version
SAM CLI, version 1.0.0

Initialisation du projet SAM

Cette fois, nous allons procéder à l'implémentation basée sur le modèle Hello World en Python 3.8

% sam init
Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice: 1

Which runtime would you like to use?
	1 - nodejs12.x
	2 - python3.8
	3 - ruby2.7
・ ・ ・
Runtime: 2

Project name [sam-app]: sample-app

Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git

AWS quick start application templates:
	1 - Hello World Example
	2 - EventBridge Hello World
・ ・ ・
Template selection: 1

-----------------------
Generating application:
-----------------------
Name: sample-app
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .

Next steps can be found in the README file at ./sample-app/README.md

Création d'un groupe d'utilisateurs Cognito

Cette fois, je l'ai créé avec les paramètres par défaut pour le moment et j'ai ajouté manuellement un utilisateur approprié. Utilisez l'ID du pool d'utilisateurs créé lors de la création du fichier.

image.png

image.png

la mise en oeuvre

J'ai implémenté les fichiers principaux comme suit.

app.py


import json
import requests
import boto3
from datetime import datetime
import pandas as pd


def lambda_handler(event, context):

    try:
        sqs_client = boto3.client("sqs")
        #Une fois que vous déployez SQS, une file d'attente sera automatiquement créée dans SQS, alors définissez-la.
        queue_url = "https://sqs.ap-northeast-1.amazonaws.com/********/**********"
        print(queue_url)
        now = datetime.now()
        date_str = now.strftime('%Y/%m/%d-%H:%M:%S')
        sqs_response = sqs_client.send_message(
            QueueUrl=queue_url,
            MessageBody=json.dumps(date_str)
        )
    except requests.RequestException as e:
        # Send some context about this error to Lambda Logs
        print(e)

        raise e

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world"
        }),
    }

def csv_create_handler(event, context):
    for record in event['Records']:
        payload=record["body"]

        date_str = str(payload)
        s3 = boto3.resource('s3')
        bucket = s3.Bucket('arkth-user-list-files')

        cognito_client = boto3.client('cognito-idp')

        response = cognito_client.list_users(
            UserPoolId = 'ap-northeast-***********',
            AttributesToGet = ['email','sub']
        )

        data = []
        for user in response["Users"]:
            data.append([user['Username'], user['Enabled']])

        Coulum = ['Username', 'Enabled']
        df = pd.DataFrame(data, columns=Coulum)

        df_csv = df.to_csv(index=None)
        objkey = 'user-list.csv'
        print(objkey)
        putobj = bucket.Object(objkey)
        putobj.put(Body=df_csv)

def support_datetime_default(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    raise TypeError(repr(obj) + " is not JSON serializable")

template.yaml


AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sample-app

  Sample SAM Template for sample-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3
    Runtime: python3.8

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

  UsersCsv:
    Type: AWS::SQS::Queue
    Properties:
      VisibilityTimeout: 60

  CsvCreateFunction:
    Properties:
      CodeUri: hello_world/
      Handler: app.csv_create_handler
      Events:
        MySQSEvent:
          Type: SQS
          Properties:
            Queue: !GetAtt UsersCsv.Arn
            BatchSize: 10
    Type: AWS::Serverless::Function

requirement.txt


requests
boto3
pandas

Construire SAM

$ sam build
Building function 'HelloWorldFunction'
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Building function 'CsvCreateFunction'
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

Lancer SAM localement

$ sam local start-api
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
2020-09-05 22:11:22  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

Une erreur se produira car le point de terminaison SQS est factice, mais accédez à http: //127.0.0.1: 3000 / hello à partir du navigateur et vérifiez l'erreur de syntaxe, etc.

Déployer SAM

La première fois, le déploiement avec --guided crée de manière interactive samconfig.toml.

$ sam deploy --guided

Configuring SAM deploy
======================

	Looking for samconfig.toml :  Not found

	Setting default arguments for 'sam deploy'
	=========================================
	Stack Name [sam-app]: sample-app
	AWS Region [us-east-1]: ap-northeast-1
	#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
	Confirm changes before deploy [y/N]: y
	#SAM needs permission to be able to create roles to connect to the resources in your template
	Allow SAM CLI IAM role creation [Y/n]: Y
	HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
	Save arguments to samconfig.toml [Y/n]: Y
・ ・ ・ ・
・ ・ ・ ・
・ ・ ・ ・

Cela prendra un certain temps, mais IAM et Api Gateway seront configurés et déployés de manière appropriée.

Cadre environnemental

image.png

Puis construisez et déployez à nouveau.

$ sam build
$ sam deploy

Contrôle de fonctionnement

Accédez au point de terminaison API Gateway défini dans la fonction Lambda de HelloWorld avec un navigateur.

Après cela, lorsque vous accédez au compartiment S3, le fichier CSV suivant est créé.

image.png

Recommended Posts

Créer une liste d'utilisateurs Cognito dans S3 avec SQS Déployer des fonctions de traitement de file d'attente et des API sur Lambda avec SAM
Défi pour créer un rapport de liste de l'axe des temps avec l'API Toggl et Python
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
Comment créer une trame de données et jouer avec des éléments avec des pandas
Envoyer les images prises avec ESP32-WROOM-32 vers AWS (API Gateway → Lambda → S3)
Exploration avec Python et Twitter API 2-Implémentation de la fonction de recherche d'utilisateurs
Comment créer une API de machine learning sans serveur avec AWS Lambda
Créer une fonction d'authentification utilisateur dans Airflow
[AWS lambda] Déployer, y compris diverses bibliothèques avec lambda (générer un zip avec un mot de passe et le télécharger vers s3) @ Python
Définissez la fonction Lambda et laissez-la fonctionner avec les événements S3!
Téléchargez ce que vous avez dans la demande vers S3 avec AWS Lambda Python
[AWS] Associez Lambda et S3 à boto3
Connectez-vous à s3 avec AWS Lambda Python
Créez et déployez des applications Flask avec PTVS
Créez une API pour convertir des fichiers PDF en images TIF avec FastAPI et Docker