Как использовать AWS Lambda для запуска скрипта Python, как я могу сохранить данные? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть скрипт, который собирает данные из API, и запускающий его вручную на моем локальном компьютере, я могу сохранить данные в файл CSV или SQLite.я могу хранить и получать данные?

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

Это действительно зависит от того, что вы хотите сделать с информацией после этого.

Если вы хотите сохранить ее в файле, просто скопируйте ее в Amazon S3.Он может хранить столько данных, сколько вам нужно.

Если вы намереваетесь запросить информацию, вы можете вместо этого поместить ее в базу данных.В зависимости от ваших потребностей доступно несколько вариантов базы данных.

0 голосов
/ 09 февраля 2019

TL; DR

Вы можете сохранить данные в экземпляре лямбда-функции, только вы не хотите использовать их в качестве постоянного хранилища.Вместо этого вы хотите использовать облачный сервис, который специализируется на хранении данных, который будет зависеть от вашего варианта использования.

Некоторая справочная информация

При использовании лямбды вы должны рассматривать ее как эфемерный экземпляр, в котором у вас есть доступ только к каталогу /tmp и вы можете сэкономить до 512 МБ (см. пределы лямбды ).Данные, хранящиеся в каталоге /tmp, могут быть доступны только во время выполнения функции, и нет никаких гарантий, что любая сохраненная вами информация будет доступна в будущих выполнениях.

Соображения

Вот почему вам следует рассмотреть возможность использования других облачных сервисов для хранения данных, например, Simple Storage Service (S3) для хранения файлов, RDS для реляционных баз данных или DynamoDB в качестве решения для базы данных NoSQL.,

Есть много других опций, и все будет зависеть от варианта использования.

Рабочее решение

С помощью python очень просто хранить файлы в S3, используя boto3.Код использует запросы библиотеки для выполнения запроса GET к google.com и сохраняет вывод в корзину S3.В качестве дополнительного шага также создается подписанный 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

Развертывание

Для развертывания лямбда-функции я настоятельно рекомендую использовать такой инструмент развертывания, как Без сервера или 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

Пакет Nowи разверните

#!/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

Заключение

Когда вы запускаете лямбда-функции, вы должны думать о них как о не имеющих состояния.Если вы хотите сохранить состояние своего приложения, лучше использовать другие облачные сервисы, которые хорошо подходят для вашего варианта использования.Для хранения CSV S3 является идеальным решением, так как это высокодоступная система хранения, которую очень легко начать использовать с помощью python.

0 голосов
/ 09 февраля 2019

с AWS Lambda вы можете использовать базу данных, например, Dynamo DB, которая не является базой данных SQL, и оттуда вы можете скачать CSV-файл.

с лямбда-в Dynamo BD интеграция настолько проста, что лямбда-сервер не работает, а Dynamo DB является NOSQLбаза данных.

, чтобы вы могли сохранять данные в динамо-базу данных, также вы можете использовать RDS (Mysql) и использовать другой сервис man, но лучшим способом будет динамо-база данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...