我有一个脚本,可以从API收集数据,然后在本地计算机上手动运行该脚本,可以将数据保存到CSV或SQLite .db文件中。
如果将其放在AWS lambda上,如何存储和检索数据?
答案 0 :(得分:1)
您可以将数据保存在lambda函数的实例中,只是您确实不希望将其用作永久存储。相反,您要使用专门用于存储数据的云服务,具体取决于您的用例。
使用lambda时,您必须将其视为短暂的实例,在该实例中,您只能访问/tmp
目录,并且最多可以节省512MB(see lambda limits)。 /tmp
目录中存储的数据可能仅在函数执行期间可用,并且不能保证您保存在那里的任何信息在以后的执行中将可用。
这就是为什么您应该考虑使用其他云服务来存储数据的原因,例如用于存储文件的简单存储服务(S3),用于关系数据库的RDS或作为NoSQL数据库解决方案的DynamoDB。
还有许多其他选项,它们都取决于用例。
使用python,使用boto3将文件存储在S3中非常简单。该代码使用库请求对google.com进行GET请求,并将输出保存到S3存储桶。另外,它还会创建一个签名的URL,您可以使用该URL下载文件
# 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
要部署lambda函数,我强烈建议您使用Serverless或LambdaSharp之类的部署工具。以下是用于无服务器框架的serverless.yml
文件,用于打包和部署代码,它还创建S3存储桶并设置适当的权限以放置对象并生成签名的url:
# 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
立即打包并部署
#!/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
运行lambda函数时,必须将其视为无状态。如果要保存应用程序的状态,最好使用其他非常适合您的用例的云服务。对于存储CSV而言,S3是一个理想的解决方案,因为它是一个高度可用的存储系统,使用python很容易上手。
答案 1 :(得分:0)
使用aws lambda,您可以使用非sql数据库之类的dynamo db之类的数据库,并可以从那里下载csv文件。
使用lambda到dynamo bd集成非常容易,lambda是无服务器的,而dynamo db是nosql数据库。
因此您可以将数据保存到dynamo db中,也可以使用RDS(Mysql)并使用其他服务,但是最好的方法是dynamo db。
答案 2 :(得分:0)
这实际上取决于您以后对信息的处理方式。
如果您要将其保存在文件中,只需将其复制到Amazon S3。它可以存储任意数量的数据。
如果要查询信息,则可以选择将其放入数据库中。根据您的需求,有许多不同的数据库选项可用。