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.