最近,随着我越来越多地使用 AWS,我的注意力一直在 DevOps 领域。我想到了我前段时间的一个想法......在 AWS 上运行一个临时的 BitTorrent 客户端并将下载自动保存到 S3 会涉及什么?

我的最终目标是能够从命令行启动和关闭远程 BitTorrent 客户端。我知道我想运行Transmission,因为它有一个用于添加和删除种子和监控下载的 Web 界面。

VPN

当我将它托管在云中时,我真的希望 BitTorrent 流量通过 VPN 路由,而不是直接路由到主机实例。当我第一次开始尝试这个想法时,我首先通过 AWS 控制台启动一个 t2.micro 实例,通过 SSH 连接并直接在主机上安装 OpenVPN。我很快发现,在通过 SSH 连接到主机时启动 OpenVPN 是行不通的,因为我猜默认情况下它会接管主机的网络流量,立即断开我的 SSH 连接并阻塞服务器,直到它通过 AWS 控制台重新启动。

这让我想到了 Docker。让 OpenVPN 容器化感觉像是一个更明智的解决方案,因为它允许我通过 SSH 连接到主机实例以修改设置。我想一定有人已经创建了一个 OpenVPN docker 映像,经过一番谷歌搜索后,我发现 github 用户haugene创建了一个恰当命名的映像docker-transmission-openvpn,它将 OpenVPN 和传输捆绑在一起。奖金!

将完成的下载同步到 S3

下载完成后,Transmission 会将文件复制到/data/completed目录。我需要想办法将完成的下载自动复制到 S3。为此,我决定在 Go 中编写自己的实用程序,它会简单地查看目录中的新文件内容并将它们上传到 S3 存储桶。此实用程序称为go-watch-s3,我在此处有一篇关于此的专门博客文章。

传输容器和运行 go-watch-s3 的容器共享一个绑定挂载的目录,因此当传输将文件写入它的/data/completed目录时,go-watch-s3 会看到新文件并上传它们。挺整洁的!

使用 Terraform 配置实例

配置由设置我们的基础设施的Terraform配置处理。它创建 EC2 实例、一个安全组,以便我们可以访问传输 UI,以及适当的 IAM 角色、策略和实例配置文件,以便实例能够将文件写入我们现有的 S3 存储桶。

在实例上安装软件作为用户数据脚本的一部分进行处理,该脚本在实例首次启动时运行,并在 Terraform 中定义为 aws_instance 资源类型的一部分。这个脚本实际上相对简单,因为它只是安装 Docker,拉取上述图像并运行它们。我曾考虑使用Docker Compose,因为在编排多个容器时通常会获得更好的体验,但使用 vanilla docker run 命令代替。

最后,剩下要做的就是应用terraform apply的配置来在 AWS 上创建我们的资源。应用配置后,将输出传输 Web UI 的 url,但是您需要等待几分钟才能让启动脚本执行此操作。一旦 UI 可用,就可以添加种子,完成的下载会自动复制到 S3!

[传输Web UI](https://res.cloudinary.com/practicaldev/image/fetch/s--z9-453lt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3 -ap-southeast-2.amazonaws.com/media.willdady.com/2019/07/transmission-web-ui.png)

完成后,可以使用terraform destroy摧毁刚刚创建的基础设施。

说明显而易见

总之,我觉得这是一个有趣的“玩具”项目,尽管我个人认为没有必要进一步改进它。如果你愿意的话,痒已经被抓到了。要查看完整的 Terraform 配置,请查看 github 上的terraform-transmission-aws。

虽然从纯粹的技术角度来看,BitTorrent 没有任何违法行为,但盗版内容很可能会让您快速受到 AWS 的谴责,或者更糟的是您的帐户被关闭。

[AWS 关闭你](https://res.cloudinary.com/practicaldev/image/fetch/s--DUFOvKSp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://s3- ap-southeast-2.amazonaws.com/media.willdady.com/2019/07/aws-rage.gif)

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐