我有一个从 API 收集数据的脚本,并在本地计算机上手动运行该脚本,我可以将数据保存到 CSV 或 SQLite .db 文件。
如果我将其放在 AWS lambda 上,我如何存储和检索数据?
最佳答案
TL;DR
您可以将数据保存在 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
文件,用于 Serverless 框架打包和部署代码,它还创建 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 非常容易上手。
关于python - 使用AWS Lambda运行Python脚本,如何保存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54602932/