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

时间:2019-02-09 03:39:00

标签: python amazon-web-services sqlite aws-lambda

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

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

3 个答案:

答案 0 :(得分:1)

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函数,我强烈建议您使用ServerlessLambdaSharp之类的部署工具。以下是用于无服务器框架的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。它可以存储任意数量的数据。

如果要查询信息,则可以选择将其放入数据库中。根据您的需求,有许多不同的数据库选项可用。