amazon-web-services - AWS 按计划将文件下载到 s3
问题描述
现在我有一个每天运行一次的 cron 作业。它将 curl 命令通过管道传输到文件中,对该文件进行 gzip 压缩,然后将其上传到 s3 存储桶。我想把它从我的服务器上移到 aws 工具中。目前推荐的方法是什么?制作一个 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
推荐阅读
- postgresql - Postgresql 嵌套函数
- android - 尝试使用 Facebook 登录凭据登录 Firebase 时出错
- linux - 阿帕奇配置 2.4
- typescript - 使用 Angular 6 的动态选项卡
- python - Python 在终端中执行
- python - Python 多处理仅在第一次运行后快速
- javascript - 缩放 y 轴以适合多折线图显示中的数据
- c# - HttpResponseMessage 序列化为 xml
- python - 通过 websockets 抓取investing.com
- git - 如何使用 git 更新已更新的开源应用程序的本地版本?