【发布时间】:2019-04-28 12:36:32
【问题描述】:
现在我有一个每天运行一次的 cron 作业。它将 curl 命令通过管道传输到文件中,对该文件进行 gzip 压缩,然后将其上传到 s3 存储桶。我想把它从我的服务器上移到 aws 工具中。目前推荐的方法是什么?制作一个 lambda 函数并安排它每天运行?
【问题讨论】:
标签: amazon-web-services cron aws-lambda
现在我有一个每天运行一次的 cron 作业。它将 curl 命令通过管道传输到文件中,对该文件进行 gzip 压缩,然后将其上传到 s3 存储桶。我想把它从我的服务器上移到 aws 工具中。目前推荐的方法是什么?制作一个 lambda 函数并安排它每天运行?
【问题讨论】:
标签: amazon-web-services cron aws-lambda
最具成本效益的选择将是您描述的那个:
创建一个 lambda 函数,用于下载您的内容、对其进行压缩并上传到 S3。
Lambda 函数have access to the host's file system(/tmp 中为 500 Mb),之后不要忘记删除文件。该容器将被重复使用(在您的帐户中)
配置 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/*
[UPDATE] : 如果要下载的文件是 4Gb 怎么办?
在这种情况下,您将有两个选择。一种工作量更大但更具成本效益的产品。一种更容易实现,但可能会花费更多。
选项 1:完全无服务器
您可以设计您的 AWS Lambda 函数来下载 4GB 内容和 stream it to S3 by 5 Mb chuncks 并逐块压缩。我不是压缩专家,但我相信一定有可能找到一个库来为你处理。 缺点是需要编写具体的代码,不像结合AWS CLI和GZIP命令行工具那么简单。
选项 2:在作业期间启动 EC2 实例
计划的 Lambda 函数可以使用 EC2 的 API 来启动一个实例。作业脚本可以使用userdata (a script the instance will execute at boot time) 传递给实例。该脚本可以在工作完成后调用TerminateInstance 以杀死自己并停止为此收费。
缺点是您必须为该实例的运行时间付费(您可以拥有 750 小时/月 for free 的 t2.micro 实例)
好处是您可以使用 AWS CLI 和 GZIP 等标准命令行工具,并且您将拥有大量本地存储来完成您的任务。
这里是如何从 Python 启动一个实例:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.start_instances
【讨论】: