2
votes

À l'aide d'AWS Lambda pour exécuter un script Python, comment puis-je enregistrer des données?

J'ai un script qui rassemble les données d'une API, et l'exécutant manuellement sur ma machine locale, je peux enregistrer les données dans un fichier CSV ou SQLite .db.

Si je mets ceci sur AWS lambda, comment puis-je stocker et récupérer des données?


0 commentaires

3 Réponses :


0
votes

avec aws lambda, vous pouvez utiliser une base de données telle que dynamo db qui n'est pas une base de données SQL et à partir de là, vous pouvez télécharger un fichier csv.

avec l'intégration de lambda à dynamo bd est si simple lambda est sans serveur et dynamo db est une base de données nosql.

afin que vous puissiez enregistrer des données dans dynamo db, vous pouvez également utiliser RDS (Mysql) et utiliser un autre service man mais le meilleur moyen sera dynamo db.


0 commentaires

0
votes

Cela dépend vraiment de ce que vous voulez faire des informations par la suite.

Si vous souhaitez le conserver dans un fichier, copiez-le simplement sur Amazon S3. Il peut stocker autant de données que vous le souhaitez.

Si vous avez l'intention d'interroger les informations, vous pouvez choisir de les placer dans une base de données à la place. Il existe un certain nombre d'options de base de données disponibles, en fonction de vos besoins.


1 commentaires

S3 est une bonne option même si vous avez besoin d'interroger vos données en exploitant S3 Select. C’est un moyen impressionnant et puissant de traiter S3 comme une base de données sans serveur. Une autre option pour S3 est AWS Athena.



4
votes

TL;DR

Vous pouvez sauvegarder des données dans une instance d'une fonction lambda, mais vous ne voulez pas vraiment l'utiliser comme stockage permanent. Au lieu de cela, vous souhaitez utiliser un service cloud spécialisé dans le stockage de données, lequel dépendra de votre cas d'utilisation.

Quelques informations générales

Lorsque vous utilisez lambda, vous devez le considérer comme une instance éphémère dans laquelle vous n'avez accès qu'au répertoire / tmp et pouvez économisez jusqu'à 512 Mo ( voir les limites lambda ). Les données stockées dans le répertoire / tmp peuvent n'être disponibles que pendant l'exécution de la fonction, et il n'y a aucune garantie que les informations que vous y enregistrez seront disponibles dans les futures exécutions.

Considérations

C'est pourquoi vous devriez envisager d'utiliser d'autres services cloud pour stocker des données, par exemple Service de stockage simple (S3) pour stocker des fichiers, RDS pour les bases de données relationnelles ou DynamoDB en tant que solution de base de données NoSQL.

Il existe de nombreuses autres options et tout dépendra du cas d'utilisation.

Solution de travail

Avec python, il est très simple de stocker des fichiers dans S3 en utilisant boto3. Le code utilise les demandes de bibliothèque pour faire une demande GET à google.com et enregistre la sortie dans un compartiment S3. Comme étape supplémentaire, il crée également une URL signée que vous pouvez utiliser pour télécharger le fichier

#!/usr/bin/env bash
# deploy.sh
mkdir package
pip install -r requirements.txt --target=./package
cp lambda_function.py package/
$(cd package; zip -r ../package.zip .)
serverless deploy --verbose

Déploiement

Pour déployer la fonction lambda, je recommande vivement à l'aide d'un outil de déploiement tel que Serverless ou LambdaSharp . Ce qui suit est un fichier serverless.yml pour le framework sans serveur pour empaqueter et déployer le code, il crée également le compartiment S3 et définit les autorisations appropriées pour placer des objets et générer l'URL signée:

# serverless.yml
service: s3upload

provider:
  name: aws
  runtime: python3.7
  versionFunctions: false
  memorySize: 128
  timeout: 30

  # you can add statements to the Lambda function's IAM Role here
  iamRoleStatements: 
    - Effect: "Allow"
      Action:
        - s3:PutObject
        - s3:GetObject
      Resource:
        - Fn::Join: ["/", [Fn::GetAtt: [FilesBucket, Arn], "*"]]
        - Fn::GetAtt: [FilesBucket, Arn]

# Package information
package:
  artifact: package.zip

functions:
  s3upload-function:
    handler: lambda_function.lambda_handler
    environment:
      FILES_BUCKET:
        Ref: FilesBucket
    events: 
      # THIS LAMBDA FUNCTION WILL BE TRIGGERED EVERY 10 MINUTES
      # CHECK OUT THE SERVERLESS DOCS FOR ALTERNATIVE WAYS TO 
      # TRIGGER THE FUNCTION
       - schedule:
           rate: rate(10 minutes)

# you can add CloudFormation resource templates here
resources:
  Resources:
    FilesBucket:
      Type: AWS::S3::Bucket
      Properties:
        PublicAccessBlockConfiguration:
          BlockPublicAcls: true
          BlockPublicPolicy: true
          IgnorePublicAcls: true
          RestrictPublicBuckets: true

Maintenant empaquetez et déployez

# lambda_function.py
import os
import boto3
from botocore.client import Config
import requests

s3 = boto3.resource('s3')
client = boto3.client('s3', config=Config(signature_version='s3v4'))

# This environment variable is set via the serverless.yml configuration
bucket = os.environ['FILES_BUCKET']

def lambda_handler(event, conntext):
    # Make the API CALL
    response = requests.get('https://google.com')

    # Get the data you care and transform it to the desire format
    body = response.text

    # Save it to local storage
    tmp_file_path = "/tmp/website.html"
    with open(tmp_file_path, "w") as file:
        file.write(body)
    s3.Bucket(bucket).upload_file(tmp_file_path, 'website.html')

    # OPTIONAL: Generar signed URL to download the file
    url = client.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': bucket,
            'Key': 'website.html'
        },
        ExpiresIn=604800 # 7 days
    )
    return url

Conclusion

Lorsque vous exécutez des fonctions lambda, vous devez les considérer comme apatride. Si vous souhaitez enregistrer l'état de votre application, il est préférable d'utiliser d'autres services cloud bien adaptés à votre cas d'utilisation. Pour stocker les CSV, S3 est une solution idéale car il s'agit d'un système de stockage hautement disponible qui est très facile à utiliser avec python.


0 commentaires