使用用户数据将 Web 访问日志发送到私有 S3 存储桶

时间:2021-07-22 11:03:07

标签: bash amazon-web-services amazon-s3 terraform

我正在开发一个项目,在该项目中我必须使用将包含在 EC2 实例的 user-data.tpl 中的 bash 脚本将 Web 访问日志发送到私有 S3 存储桶,到目前为止我有:< /p>

#!/bin/bash -xe
exec > >(tee /var/log/user-data.log|logger -t user-data ) 2>&1
echo BEGIN
date '+%Y-%m-%d %H:%M:%S'
yum update -y
yum install -y httpd
cat <<'EOF' >> /var/www/html/index.html
<html>
<head>
<title>Success!</title>
<style>
body {
background-image: url('https://ce-test-bg-image-onica.s3-us-west-2.amazonaws.com/onica.jpg');
background-repeat: no-repeat;
background-attachment: fixed;
background-position: center;
</style>
</head>
<body>
<h1>Hello Onica!</h1>
</body>
</html>
EOF
systemctl start httpd
systemctl enable httpd

我不知道如何将 Web 访问日志发送到名为“ifecycle-testing12345”的私有 S3 存储桶,我不确定要在 bash 脚本中为此添加什么。

1 个答案:

答案 0 :(得分:0)

最终答案取决于您将日志放入 S3 后对它们进行的操作。一个接近的答案是您可能希望在您的实例上安装 cloudwatch 日志代理,将其配置为监控 httpd 日志,并让它们自动发送到 cloudwatch。当然,您的日志现在位于 cloudwatch 而不是 S3,但如果您真的需要,您可以定期将它们导出到 S3 和/或将 cloudwatch 日志轮换时间配置为适合您的应用程序的任何时间。

或者,如果您真的希望将它们上传到 S3,您可以改为在脚本中安装一个 cron 作业,以定期将日志文件上传(或同步)到 S3。这可能是不可取的,因为您可能会覆盖旧的日志条目和/或每次都必须上传整个日志文件(而不是仅仅上传日志中的新事件)。

还有其他工具可以帮助解决这个问题(日志转发和聚合)。您可能需要查看 fluent-bit 或 filebeat 等工具,它们在监控日志文件并将它们转发到其他地方方面做得非常出色。 fluent-bit 甚至具有 S3 的本机输出。但是,它可能看起来不像您期望的那样,因为它会在该存储桶中显示为一系列文件(受监控文件的),每个新文件代表受监控文件的一些新行。这是因为 fluent-bit 很少单独使用,但通常与 fluentd 等工具结合使用,它们会摄取这些工具并将它们聚合到诸如 elasticsearch 之类的东西中。

您的用例和对复杂性的需求可能会推动您选择的解决方案。