[PYTHON] Erstellen einer Cognito-Benutzerliste in S3 mit SQS Stellen Sie mit SAM Warteschlangenverarbeitungsfunktionen und APIs für Lambda bereit

Der Titel ist auf Japanisch unpraktisch geworden, aber ich werde ihn in die richtige Reihenfolge bringen.

Erstellen Sie eine Funktion auf Lambda, die automatisch eine CSV-Datei der von AWS Cognito unter S3 verwalteten Benutzerliste erstellt. Legen Sie SQS als Auslöser für die Aktivierung dieses Lambda fest und implementieren Sie die API, um SQS in einem anderen Lambda eine Nachrichtenwarteschlange hinzuzufügen, damit HTTP-Anforderungen über das API-Gateway empfangen werden können.

Das Konfigurationsdiagramm lautet wie folgt.

image.png

AWS-CLI-Installation und IAM-Konfiguration

$ 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

SAM-Installation

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

Initialisierung des SAM-Projekts

Dieses Mal werden wir mit der Implementierung basierend auf der Hello World-Vorlage in Python 3.8 fortfahren

% 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

Erstellen eines Cognito-Benutzerpools

Dieses Mal habe ich es mit den Standardeinstellungen erstellt und manuell einen geeigneten Benutzer hinzugefügt. Verwenden Sie beim Erstellen der Datei die erstellte Benutzerpool-ID.

image.png

image.png

Implementierung

Ich habe die Hauptdateien wie folgt implementiert.

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")
        #Sobald Sie SQS bereitstellen, wird in SQS automatisch eine Warteschlange erstellt. Legen Sie diese fest.
        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

$ 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

Starten Sie SAM lokal

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

Ein Fehler tritt auf, weil der SQS-Endpunkt ein Dummy ist, aber über den Browser auf "http: //127.0.0.1: 3000 / hello" zugreifen und nach Syntaxfehlern usw. suchen.

Stellen Sie SAM bereit

Beim ersten interaktiven Bereitstellen mit --guided wird samconfig.toml erstellt.

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

Es wird einige Zeit dauern, aber IAM und Api Gateway werden entsprechend eingerichtet und bereitgestellt.

Umgebungseinstellung

image.png

Dann erneut erstellen und bereitstellen.

$ sam build
$ sam deploy

Funktionsprüfung

Greifen Sie mit einem Browser auf den in der Lambda-Funktion von HelloWorld festgelegten API-Gateway-Endpunkt zu.

Wenn Sie danach auf den S3-Bucket zugreifen, wird die folgende CSV-Datei erstellt.

image.png

Recommended Posts

Erstellen einer Cognito-Benutzerliste in S3 mit SQS Stellen Sie mit SAM Warteschlangenverarbeitungsfunktionen und APIs für Lambda bereit
Herausforderung beim Erstellen eines Zeitachsenlistenberichts mit der Toggl-API und Python
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
Senden Sie mit ESP32-WROOM-32 aufgenommene Bilder an AWS (API Gateway → Lambda → S3).
Crawlen mit Python und Twitter API 2-Implementierung der Benutzersuchfunktion
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Erstellen Sie eine Benutzerauthentifizierungsfunktion in Airflow
[AWS lambda] Stellen Sie mit lambda verschiedene Bibliotheken bereit (generieren Sie eine Zip-Datei mit einem Kennwort und laden Sie sie auf s3 hoch) @ Python
Stellen Sie die Lambda-Funktion ein und lassen Sie sie mit S3-Ereignissen arbeiten!
Laden Sie das, was Sie angefordert haben, mit AWS Lambda Python in S3 hoch
[AWS] Verknüpfen Sie Lambda und S3 mit boto3
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Erstellen und Bereitstellen von Flask-Apps mit PTVS
Erstellen Sie eine API zum Konvertieren von PDF-Dateien in TIF-Bilder mit FastAPI und Docker