现在我有一份每天执行一次的cron作业。它将curl命令传递到一个文件中,对该文件进行gzip压缩,然后将其上传到s3存储桶。我想将其从服务器移到AWS工具中。目前推荐的方法是什么?做一个lambda函数并安排它每天运行?
答案 0 :(得分:1)
最具成本效益的选择就是您所描述的选择:
创建一个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/*
[更新]:如果要下载的文件是4Gb怎么办?
在这种情况下,您将有两个选择。一种工作量更多但更具成本效益的方法。一个更容易实现,但可能会花费更多。
选项1:完全无服务器
您可以设计您的AWS Lambda函数来下载4GB内容和stream it to S3 by 5 Mb chuncks并逐个压缩chunck。我不是压缩专家,但是我敢肯定一定有可能找到一个为您处理的库。 缺点是您需要编写特定的代码,这不像将AWS CLI和GZIP命令行工具结合起来那样容易。
选项2:在工作期间启动EC2实例
预定的Lambda函数可以使用EC2的API启动实例。可以使用userdata
(a script the instance will execute at boot time)将作业脚本传递到实例。完成工作以杀死自己并停止为此充电时,该脚本可以调用TerminateInstance
。
缺点是您必须为该实例的运行时间付费(您每月for free的t2.micro
实例中有750小时)
肯定的是,您可以使用标准命令行工具(例如AWS CLI和GZIP),并且您将有大量本地存储用于执行任务。
以下是如何从Python启动实例:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.start_instances