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

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

我有一个从 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/

相关文章:

python - 谷歌应用引擎(python)混淆类 'object has no attribute'错误

python - python函数的第一次使用

java - 我在 JSP 中的 SQL 查询在服务器环境中不起作用

r - 如何使用 IAM 角色身份验证从 EC2 上的 RStudio 访问 S3 数据?

amazon-web-services - EC2实例如何连接到同一VPC中的ElastiCache集群?

android - 如何从 Sqlite 获取最后一条记录?

SQL:选择另一个表中大于最大值的行

python - 从 python 客户端发送带有标签的 statsD 指标

java - SQLite , Derby 与文件系统

Python-Pandas-Dataframe-datetime 转换排除空值单元格