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?
3 Réponses :
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.
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.
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.
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.
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.
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.
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
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
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.