首页 > 解决方案 > AWS 按计划将文件下载到 s3

问题描述

现在我有一个每天运行一次的 cron 作业。它将 curl 命令通过管道传输到文件中,对该文件进行 gzip 压缩,然后将其上传到 s3 存储桶。我想把它从我的服务器上移到 aws 工具中。目前推荐的方法是什么?制作一个 lambda 函数并安排它每天运行?

标签: amazon-web-servicescronaws-lambda

解决方案


最具成本效益的选择将是您描述的那个:

  • 创建一个 lambda 函数来下载您的内容,将其压缩并上传到 S3。Lambda 函数可以访问主机的文件系统(500 Mb in /tmp),之后不要忘记删除文件。容器将被重复使用(在您的帐户中)

  • 安排CloudWatch 事件以定期触发 lambda 函数。

  • 配置 lambda 函数以授权 CloudWatch Event 调用您的函数

aws lambda add-permission --function-name my-function\
                          --action 'lambda:InvokeFunction' --principal events.amazonaws.com
                          --statement-id events-access \
                          --source-arn arn:aws:events:*:123456789012:rule/*

[更新]:如果要下载的文件是 4Gb 怎么办?

在这种情况下,您将有两个选择。一种工作量更大但更具成本效益的产品。一种更容易实现,但可能会花费更多。

选项 1:完全无服务器

您可以设计您的 AWS Lambda 函数来下载 4GB 内容并将其按 5 Mb 块流式传输到 S3并逐块压缩。我不是压缩专家,但我相信一定有可能找到一个库来为你处理。缺点是您需要编写特定的代码,它不会像结合 AWS CLI 和 GZIP 命令行工具那么简单。

选项 2:在作业期间启动 EC2 实例

计划的 Lambda 函数可以使用 EC2 的 API 来启动实例。userdata可以使用(实例将在启动时执行的脚本)将作业脚本传递给实例。该脚本可以TerminateInstance在工作完成时调用以杀死自己并停止为此收费。缺点是你必须为这个实例的运行时间付费(你可以有 750 小时/月的免费t2.micro实例) 积极的是你可以使用标准的命令行工具,如 AWS CLI 和 GZIP,你会有很多用于您的任务的本地存储空间。

以下是如何从 Python 启动实例:https ://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.start_instances


推荐阅读