亚马逊AWS官方博客

使用 FluentBit 抽取日志到 AOS 中不同索引 Index

1. 场景说明

AWS OpenSearch Service(简称 AOS) 是一个基于 Elasticsearch 的开源分布式搜索和分析引擎,专门为日志搜索和分析而设计。它提供了以下优势:

  • 高度可扩展性:可根据需求轻松扩展或缩减集群规模,满足不断变化的日志数据量。
  • 近乎实时搜索:日志数据几乎实时可搜索,确保及时发现和响应问题。
  • 强大的查询和分析功能:支持复杂的查询和聚合操作,帮助深入挖掘日志数据洞见。
  • 高可用性和容错性:采用分布式架构,确保服务的高可用性和容错性。
  • 安全性:提供多层安全控制,包括访问控制、加密传输和审计日志等。
  • 与 AWS 服务无缝集成:可与 AWS 其他服务(如 CloudWatch、Kinesis 等)无缝集成,构建完整的日志分析解决方案。

FluentBit 是一款轻量级的日志处理器,常用于从各种数据源收集日志并将其发送到不同的目标,包括 AWS OpenSearch Service (AOS)。在真实的业务场景中往往存在多种类型的日志,例如系统日志、安全日志、应用日志等。不同类型的日志需要隔离保存并实现访问控制,在 AOS 中可以使用索引 Index 的设计实现数据的分类存储、访问控制以及生命周期管理。

2. 部署架构

  1. HAQM Opensearch 集群以私有化形式部署在 VPC 内部
  2. 在一个 HAQM Opensearch 域存在多个 Index
  3. 最终用户通过部署在相同 VPC 内公共子网的 Windows 跳板机访问 HAQM Opensearch Dashboard
  4. 用于模拟应用服务器的 EC2 中部署 FluentBit 并持续抽取/var/log/secure 和/var/log/messages 中的安全和 syslog 到不同 HAQM Opensearch Index

3. 部署过程

3.1 创建 AOS 集群

推荐 VPC 私有子网内创建 AOS 集群,避免暴露到公网的安全隐患,但要注意私有集群的 Dashboard 无法直接通过 Internet 访问,需要额外创建一台 Windows 跳板机打开。

3.2 创建访问 AOS 集群的所需的 EC2

与 AOS 相同 VPC 内的公共子网内创建 EC2 或者是使用现有的 EC2,请注意 EC2 使用的 IAM role 必须要具备访问 Opensearch 服务的相关权限,如果是测试可以考虑分配 HAQMOpenSearchServiceFullAccess 权限。后续在 Fluent-bit 中将使用这个 IAM Role 完成日志上传到 Opensearch,避免每台 EC2 中都需要配置 AK/SK,因此需要确保这个 IAM Role 可以由 AWS 上应用调用,默认 EC2 中使用的 Role 只能由 EC2 调用。

3.3 安装 FluentBit

3.3.1 一键部署 FluentBit

运行“curl http://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh”一键部署 FluentBit

中国区 EC2 有可能由于网络原因无法连接 githubusercontent.com,可以选择修改 yum 源。以 HAQM Linux 2 为例,需要在 /etc/yum.repos.d/路径下添加 fluent-bit.repo 文件,以下为文件内容:

[fluent-bit]
name = Fluent Bit
baseurl = http://packages.fluentbit.io/amazonlinux/2/
gpgcheck=1
gpgkey=http://packages.fluentbit.io/fluentbit.key
enabled=1

或者使用 yum 命令安装

sudo yum install fluent-bit

更多内容请参考:http://docs.fluentbit.io/manual/installation/linux/amazon-linux

3.3.2 启动 fluent bit 并检查运行状态

3.3.3 设置开机自动启动

3.3.4 修改配置文件

找到 /etc/fluent-bit 路径,修改 fluent-bit.conf  配置文件。请注意只需要删除文件中默认的 [INPUT] 和 [OUTPUT] 下的内容,其他内容保留

输入输出配置示例和详解:以下配置支持将 2 个不同的日志输出到 Opensearch 集群中不同的 Index。如需要更多,可以添加更多的 [INPUT] [OUTPUT],详细可以参考 http://docs.fluentbit.io/manual/concepts/data-pipeline/router。以下配置请使用时删除中文说明和注释。

[INPUT]  #定义了日志的输入源,此处以var/log下的syslog和secure安全日志为例
    Name          tail
    Path          /var/log/messages  #日志的存储路径
    Parser        syslog-rfc3164  #所用的解析器,默认支持的解析器在相同路径下的parsers.conf配置文件中,可以添加自定义解析器
    Tag           system_logs  #输入的tag,用于后续实现将不同路径下的日志分发到Opensearch集群中不同的index
[INPUT]
    Name          tail
    Path          /var/log/secure
    Parser        syslog-rfc3164
    Tag           secure_logs
[OUTPUT]
    Name          opensearch  #指定使用AOS的agent进行输出
    Match         system_logs  #对应INPUT中的tag字段,FluentBit根据tag确认将日志输入到对应的Index
    Host          请替换{DOMAIN URL}  #Opensearch集群的domain URL
    Port 	  			443
    AWS_Auth      On  #使用AWS IAM认证
    AWS_Region    请替换使用的{region}
    Index         请替换使用的{Opensearch Index}  #Opensearch集群中的Index
    Suppress_Type_Name On 
    Type          doc
    AWS_Role_Arn  请替换使用的{IAM Role ARN}  #FluentBit使用的IAM role,请确认这个Role和日志源主机所用的IAM Role相同,并且可以由Fluent Bit调用。检查Role对应的Trusted Entity,确认Principle("AWS": "*")有调用sts:AssumeRole的权限
    tls 	  On
#    AWS_Profile   default
[OUTPUT]
    Name          opensearch  #指定使用AOS的agent进行输出
    Match         secure_logs  #对应INPUT中的tag字段,FluentBit根据tag确认将日志输入到对应的Index
    Host          请替换{DOMAIN URL}  #Opensearch集群的domain URL
    Port	  443
    AWS_Auth      On
    AWS_Region    请替换使用的{region}
    Index         请替换使用的{Opensearch Index} #Opensearch集群中的Index
    Suppress_Type_Name On
    Type          doc
    AWS_Role_Arn  请替换使用的{IAM Role ARN} #FluentBit使用的IAM role,请确认这个Role是可以由Fluent Bit调用,检查Role对应的Trusted Entity,确认Principle("AWS": "*")有调用sts:AssumeRole的权限
    tls	          On
    AWS_Profile   default

其它内容请参考:http://docs.fluentbit.io/manual/pipeline/outputs/opensearch

3.3.5 AOS 中添加 Index

在运行 Fluent-bit 新配置前需要手动在 Opensearch 集群中添加好 Index,这里使用 Dashboard 完成添加。由于 Opensearch 集群部署在了私有子网,需要创建另外一台在相同 VPC 内公共子网的 Windows EC2,通过域名连接到 Dashboard。请确保 Opensearch 集群的安全组配置可以允许这台 EC2 访问,例如使用相同的安全组并添加同一安全组内资源可以任意互访的规则。

3.3.6 尝试写入数据

打开 Dev tools 工具,粘贴如下 DSL 命令,依次执行两个 PUT 命令

#创建系统日志索引
PUT /system_logs
{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  },
  "mappings": {
    "properties": {
      "host": {
        "type": "text"
      },
      "message": {
        "type": "text"
      }
    }
  }
}
#创建安全日志索引
PUT /secure_logs
{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  },
  "mappings": {
    "properties": {
      "host": {
        "type": "text"
      },
      "message": {
        "type": "text"
      }
    }
  }
}

3.3.7 确认 Index 创建成功

运行 GET /_cat/indices?v 命令确认两个 index 创建成功

3.3.8 Opensearch Dashboard 中为 Fluent-bit 使用的 IAM role 添加必要的 Opensearch 权限

选择 Management 菜单下的 Security 选项,找到 all_access 角色,默认情况下只是在创建 Opensearch 集群时指定的 master 用户被加入到了这个角色。

点击角色的名称,选择 Mapped users 并选择 Manage mapping,将 Fluent-bit.conf 文件中使用的 IAM Role ARN 添加到 Use。

这里如果不添加 IAM Role,启动 Fluent-bit 服务时会遇到如下报错。

3.3.9 切换回 Fluent Bit 所在的 EC2,重启 Fluent Bit 服务

3.3.10 基于新的 Fluent-bit.conf 启动日志注入

3.3.11 切换到 Windows EC2 中的 Opensearch Dashboard,检查两个 Index 中是否有数据写入

使用之前保存的 GET /secure_logs/_search 和 GET /system_logs/_search 两段命令验证两个 Index 中是否已经有数据

GET /system_logs/_search
{
  "size": 3,
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ],
  "track_total_hits": true
}
 GET /secure_logs/_search
{
  "size": 3,
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ],
  "track_total_hits": true
}

4. 方案总结

本篇博客从客户实际需求出发,实现了通过 FluentBit 从服务器中抽取不同类型的日志数据,并且在同一个 AOS Domain 中按照不同的索引 Index 保存不同类型的日志数据。结合索引 Index 自身提供的功能可以轻松实现日志数据的分类保存以及生命周期和权限的管理。由于 FluentBit 可以部署在任意的虚拟机或者容器环境中,除了用于 AWS 云上的资源以外,也可以支持将本地资源的日志抽取到云上做统一的保存和分析。

本篇作者

魏羽

亚马逊云科技高级解决方案架构师,在 IT 行业有从业超过 13 年的工作经验,其中超过7年作为公有云架构师角色帮助企业级客户完成业务上云的需求。当前在亚马逊云科技主要负责若干世界 500 强中的制造业和高科技行业客户的上云规划和支持,技术上致力于推广亚马逊云科技 IoT 和大数据分析相关技术在企业中的应用。