APIからデータを収集するスクリプトがあり、これをローカルマシンで手動で実行すると、データをCSVまたはSQLite.dbファイルに保存できます。
これをAWSラムダに配置した場合、データを保存および取得するにはどうすればよいですか?
ラムダ関数のインスタンスにデータを保存できますが、永続的なストレージとして使用したくない場合に限ります。代わりに、データの保存に特化したクラウドサービスを使用する必要があります。これは、ユースケースによって異なります。
ラムダを使用する場合、/tmp
ディレクトリへのアクセスのみがあり、最大512MBを節約できる一時的なインスタンスと考える必要があります(ラムダの制限を参照)。/tmp
ディレクトリに保存されているデータは、関数の実行中にのみ使用できる可能性があり、そこに保存した情報が将来の実行で使用できるという保証はありません。
そのため、他のクラウドサービスを使用してデータを保存することを検討する必要があります。たとえば、ファイルを保存するためのSimple Storage Service(S3)、リレーショナルデータベース用のRDS、NoSQLデータベースソリューションとしてのDynamoDBなどです。
他にも多くのオプションがあり、すべてユースケースによって異なります。
Pythonを使用すると、boto3を使用してS3にファイルを保存するのは非常に簡単です。このコードは、ライブラリリクエストを使用してgoogle.comへのGETリクエストを実行し、出力を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
パッケージ化してデプロイします
#!/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の使用を開始するのが非常に簡単な高可用性ストレージシステムであるため、理想的なソリューションです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加