将文件从 AWS EC2 实例推送到 gitlab repo

Pushing files from AWS EC2 instance to gitlab repo

我在 ubuntu EC2 机器上部署了一个名为 Amppot 的 DDoS 蜜罐来研究攻击的特征。这个蜜罐自动输出每日日志和描述它收到的请求的 sqlite 文件。

我写了一个 python 脚本,可以将 sqlite 文件转换为 csv 文件并进行一些处理。

我目前的工作流程是:

  1. 我通过 ssh 连接到实例
  2. 我将 ec2 实例中的 sqlite 文件复制到我的机器上
  3. 我在我的机器上执行 python 脚本
  4. 我将脚本生成的 csv 文件推送到 gitlab 存储库,以便所有成员都有数据。

我想使用 gitlab CI/CD 管道自动化所有这些。 我在 google 上找到的所有信息都是关于相反方向的任务(从本地到 ec2 实例)。

我设法向 gitlab 项目添加了一个 bash 运行程序,我知道我必须编写 .gitlab-ci.yml 文件。我也知道我可能需要设置一个服务帐户。但是,我以前从未使用过 gitlab CI/CD 或做过任何 DevOps,所以我不知道我想做的事情是否可行。

在我看来,您以错误的方式利用 Gitlab(用于存储日志、指标、应用程序数据等)。源代码控制管理 (SCM) 系统适用于您的源代码,显然不适用于应用程序日志或您的应用程序生成的任何数据。

相反,为此您可以使用工具,例如CloudWatch 日志、S3、任何其他数据源(ElasticSearch、DynamoDB、RDS 等)。因此,您的应用程序 (Amppot) 应该相应地进行检测。

如果您选择 CloudWatch 来收集日志和指标,您可以在您的 EC2 实例上配置 Amazon CloudWatch 代理并对其进行检测以将您的日志(您的应用程序正在生成)推送到 CloudWatch 日志组。请参阅文档 here.

您的应用会将其 stderrstdout 流推送到本地文件(例如 /var/log/amppot.log),CloudWatch 代理会将它们与 AWS CloudWatch 服务同步。

如果尽管有上述情况,您仍然想将您的应用程序文件推送到 Gitlab(从您的 EC2),那么只需配置一个 cron 作业,它将定期执行以下 bash 脚本:

#!/bin/bash

cd /home/user/my-git/repo
git add /home/user/amppot.log
git add /home/user/amppot.sqlite
git commit -m "commit message $(date +'%s')"
git push origin master

你可能想通过ssh与Gitlab通信,所以运行ssh-keygen生成一个ssh密钥对,然后将其public部分(~/.ssh/id_rsa.pub)复制到GitLab .

另一种选择是将您的应用程序打包到 Docker 映像中,然后 运行 使用 Elastic Container Service (ECS)。好处是您不需要将 stderrstdout 流写入文件,因为 ECS 会收集它们并直接为您流式传输到 CloudWatch。这种方法的缺点是你必须研究 DockerECS,将你的 Docker 图像存储在注册表中 (ECR),配置 ECS 集群等。这显然是一些额外的努力。

如果 csv 报告是在 gitlab-ci 作业中生成的,您可以将其作为作业工件保存。

https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html

它也可以发布到该存储库的 gitlab 页面部分

https://docs.gitlab.com/ee/user/project/pages/index.html(参见示例。基本上它是 gitlab 作业中保存 artifact/report 的 2 行)