gpt4 book ai didi

python - 使用AWS Lambda运行Python脚本,如何保存数据?

转载 作者:太空宇宙 更新时间:2023-11-04 02:06:26 25 4
gpt4 key购买 nike

我有一个从 API 收集数据的脚本,并在我的本地机器上手动运行它,我可以将数据保存到 CSV 或 SQLite .db 文件中。

如果我将它放在 AWS lambda 上,我该如何存储和检索数据?

最佳答案

长话短说

您可以将数据保存在 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框架打包部署代码的serverless.yml文件,同时创建S3 bucket,设置适当权限放置对象,生成签名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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com