使用AWS CDK将Google Drive备份到S3的详细过程

106 阅读4分钟

在很久以前,我就做了一些工作,把一些经常性的手工Harmonia任务自动化。其中一项任务是将我们共享的Google Drive备份到Amazon S3。在这之前,我们一直在本地机器上手动运行 rclone sync命令,在我们的本地机器上手动运行,这样做的一个重要缺点是,我们每个人都需要有一份所有文件(约17GB)的本地拷贝,所以我很想提出一个在云端运行的自动解决方案。

与我们的Trello备份不同的是,我并不清楚我们如何能将工作分割成足够短的任务来作为AWS Lambda函数运行。此外,虽然从教育的角度来看,这很有趣,但我觉得将Trello的备份任务分割开来所带来的协调/配合的复杂性过于繁琐了。因此,我决定探索一下,让一些计算系统一次性执行一个脚本的想法,这更像是传统服务器上运行的cron job

我过去(现在也是)很喜欢使用AWS CDK,所以经过一番研究,我决定使用 ScheduledFargateTask构造,这是CDK中提供的高级模式之一。这个结构意味着在亚马逊弹性容器服务(ECS)上定期旋转一个容器并在该容器上执行一个shell脚本是相对直接的。

预定的Fargate任务

这个任务需要访问互联网,但不需要从互联网上访问它。我可以在一个私有子网中运行它,但这意味着我需要一个NAT网关或在亚马逊EC2上运行一个NAT实例(维护/复杂度开销)。由于这些任务每周只运行几分钟,我愿意牺牲私有子网提供的额外安全,而选择一个更简单/更便宜的系统,让任务在公共子网上运行。

然而,在这一点上,ScheduledFargateTask ,只有当其VPC有一个私有子网时才会运行。如果没有可用的私有子网,就会报告错误。因此,我决定利用这个机会为AWS CDK项目做出贡献,并开启了一个拉动请求,允许ECS任务在公共子网上运行,该请求已在v1.29.0版本中发布。我真的很喜欢为这样的开源项目做贡献,这是一个非常好的方式来深入了解它是如何运作的。

纳入这一变化后,我用 ecs.ContainerImage.fromAsset来定义容器镜像,使用本地Dockerfile这在Ubuntu基础镜像上安装rclone ,并将备份脚本和相关的rclone配置文件复制到主目录。这意味着当你运行cdk deploy ,你需要Docker CLI在本地可用,这样它就可以构建容器镜像,并将其推送到亚马逊弹性容器注册中心,供ECS使用。

事实证明,在包含如此多数据的Google Drive文件夹上使用rclone sync 命令需要相当多的CPU和内存,但很容易将其从默认的¼vCPU和½GB增加到4vCPU和16GB,因此该命令运行得非常快。尽管这是很强大的,但考虑到它每周只运行几分钟,其成本是可以忽略不计的。

该任务是通过 CronOptions接口安排任务。配置是通过使用dotenv的环境变量提供给容器的。Google Drive的凭证通过Secrets Manager提供。S3桶的凭证通过分配给ECS任务的IAM角色提供,并由rclone ,选项设置为 env_auth选项设置为true

该任务通过优秀的健康检查服务进行监控,我们已经在使用该服务进行Trello备份。这是一个有效的 "死人开关",如果脚本没有在给定的频率和定义的宽限期内成功完成,它会提醒我们。

思考

两年过去了,我真的很高兴这一切的结果。一旦我让备份成功运行,我们只有一次失败,那是由于最近Google Drive API的变化,需要一个新版本的rclone 。这意味着我不得不再次潜入代码来修复它,但我发现它很容易再次找到我的方式,部分原因是实际上没有太多的代码!