Amazon Kinesis Data Streams 实现跨账户应用日志收集

概述

我们在之前的文章介绍了如何使用 Fluent Bit 结合 Amazon Kinesis Data Streams、Amazon Lambda 以及 Amazon OpenSearch Search 在同账户下构建应用日志系统。但是在有些场景下,企业可能会存在多个账户,因为企业内控的需要,管理员希望能够将各个账户下的应用日志通过 Private Link 传输到指定账户下,进行集中化的日志处理或审计。本篇文章中关于使用 Amazon Lambda 将日志写入 Amazon OpenSearch Service 中是基于上一篇博客介绍的内容,如果您之前没有阅读过《使用 Fluent Bit 与 Amazon OpenSearch Service 构建日志系统》,建议您先点击这里阅读 https://aws.amazon.com/cn/blo...。通过本文,您将了解到如何通过 Fluent Bit 结合 Amazon STS AssumeRole、Amazon Kinesis Data Streams 等服务,在跨账户的场景下进行集中化日志处理。阅读本文,您将会了解到:

  • 如何通过 Amazon Role Trust Relationship 与 Amazon STS AssumeRole 配置跨账户传输日志权限
  • 如何通过 Amazon for Fluent Bit 2.21.1 跨账户传输日志

简要说明

下面我们基于下图的总体架构,以 us-west-2 为例,详细讲解一下整个的实现过程。

image.png

在开始之前,我们考虑这样一种场景。我们在 Amazon Web Services 账户 A 的 EC2 中部署了 Nginx,用于构建我们的 Web Server,并将账户 A 的 Amazon EC2 的 Nginx 日志通过 Private Link,发送到 B 账户的 Amazon Kinesis Data Stream 里。关于B账户的 Amazon Lambda 与 Amazon Kinesis Data Stream 以及 VPC Endpoint、 Amazon OpenSearch Service 服务的创建,可以参考我们之前文章。

1、如何通过 Amazon Role Trust Relationship 与 Amazon STS AssumeRole 配置跨账户传输日志权限

我们先登录 B 账户,这里我们使用 us-west-2 区域,在 IAM 服务中创建一个角色,如下图所示:选择信任的实体类型处选择另一个账户,并输入账户 A 的 ID。

image.png

点击下一步,创建策略,策略文档参考如下:

{ 
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:PutRecord",
                "kinesis:PutRecords"
            ],
            "Resource": "arn:aws:kinesis:us-west-2:<YOUR ACCOUNT ID>:stream/LogStream"
        }

        ]
}

左滑查看更多

注意:请将替换成您所使用的 B 账户 ID,创建角色名称为 demo-writing-kds。

  • 登录 A 账户,同样选择 us-west-2 区域。创建 Amazon EC2,并安装 Fluent Bit。安装步骤同样可以参考我们之前文章的“安装与配置 Amazon for Fluent Bit 2.21.1”部分,安装过程我们可以将 /etc/fluent-bit/conf/fluent-bit.conf 文件内容设置为空。
  • 为 Amazon EC2 创建新的 IAM 角色,“use cases”我们选择 Amazon EC2,点击 Next, 创建策略,配置 Amazon STS AssumeRole,策略文档参考如下:
{ 
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "<demo-writing-kds>"
    }]
}

左滑查看更多

注意:请将替换成您在前面步骤所创建 demo-writing-kds 角色的 ARN,该角色在 B 账户中。

2、配置 Amazon for Fluent Bit 2.21.1 通过 Private Link 跨账户传输日志

我们还是在 A 账户下选择 us-west-2 区域。注意,以下场景不需要在 A 账户下创建 Amazon Kinesis Data Stream。

  • 让 Amazon EC2 通过 Private Link 访问 B 账户的 Amazon Kinesis Data Streams。创建 Amazon Kinesis Data Streams 的 VPC Endpoint,为了简化,在选择 VPC 时我们可以选择 Amazon EC2 所在的 VPC。

image.png

若创建新的安全组,安全组的入站规则需添加允许来自于 Amazon EC2 的所属安全组访问 443 端口,入站规则参考下图:

image.png

  • 登录 Amazon EC2,编辑/etc/fluent-bit/conf/fluent-bit.conf文件,为 Fluent Bit 的 output 插件“kinesis_streams”配置 Arn,完整配置文件内容参考如下:
[ SERVICE]
    Flush           5
    Daemon          off
    Log_Level       info
    Log_File        /tmp/fluent-bit.log
    Storage.path    /tmp/chunks-buffer
    Storage.backlog.mem_limit 5M
[INPUT]
    Name tail
    # log file location
    Path /var/log/nginx/access.log
    Tag nginx-log
    Read_from_head true
    #use this as checkpoint
    DB /tmp/checkpoint-nginx.db
    DB.Sync Normal
[OUTPUT]
    Name kinesis_streams
    # Match Tag
    Match nginx-log
    # AWS region
    Region us-west-2
    # Kinesis stream name
    Stream LogStream
    Arn <demo-writing-kds>
    Retry_Limit False
    Auto_retry_requests True

左滑查看更多

同样,我们需要将替换成 demo-writing-kds 角色的 ARN

  • 启动 Fluent Bit,查看日志,验证是否成功。

image.png

  • 登录 Amazon OpenSearch Service 的 dashboard,您即可看到写入的日志。

注意:如果想了接如何通过 Amazon Lambda 消费 Amazon Kinesis Data Stream 的日志消息,并将日志写入到 Amazon OpenSearch Service 中,可以点击这里了解。关于如何通过公网方式使用 Nginx 代理方式访问 VPC 内的 OpenSearch dashboard,大家可以参考我们的官方文档 https://docs.aws.amazon.com/o...

总结

在本文中,我们介绍了如何通过开源日志收集工具 Fluent Bit,在多账户的场景下结合 Amazon Role Trust Relationship 与 Amazon STS AssumeRole,并且通过使用 VPC Endpoint,我们还可以用内网访问 Kinesis Data Streams,从而满足企业内控的需要。在实际使用时,我们也需要注意跨账户使用 VPC Endpoint 连接 Kinesis Data Streams 时,两个账户下对应的服务必须处于相同的 Region,企业可以结合自身实际情况来决定是否启用 VPC Endpoint。

参考资料

  • VPC endpoints 资料:

image.png

  • Fluent Bit 资料:

image.png

本篇作者

image.png

马涛

亚马逊云科技解决方案研发架构师

主要负责云上解决方案的设计与研发。


亚马逊云开发者
亚马逊云开发者社区是面向开发者交流与互动的平台。在这里,你可以分享和获取有关云计算、人工智能、IoT...

亚马逊云开发者社区是面向开发者交流与互动的平台。在这里,你可以分享和获取有关云计算、人工智能、IoT...

2.9k 声望
9.6k 粉丝
0 条评论
推荐阅读
如何针对多租户 SaaS 使用案例扩展机器学习推理
Zendesk 是一家 SaaS 公司,该公司以简单为本,专注于开发面向所有人的支持、销售和客户参与软件。通过帮助全球超过 17 万家公司高效地为数亿客户提供服务,该公司得以蓬勃发展。Zendcaesk 的机器学习团队负责提...

亚马逊云开发者1

百度工程师浅谈分布式日志
导读 我们做软件开发时,或多或少的会记录日志。由于日志不是系统的核心功能,常常被忽视,定位问题的时候才想起它。本文由浅入深的探讨不起眼的日志是否重要,以及分布式架构下的日志运维工具应该具备哪些能力,...

百度Geek说3阅读 348

WAL的概念与实践分析
在计算机科学中,预写式日志[1](Write-Ahead logging,缩写 WAL)是关系数据库系统中用于提供原子性和持久性(事务ACID属性中的A与D)的一系列技术。在使用WAL的系统中,所有的修改在生效之前都要先写入log文件...

KaiwuDB阅读 837

封面图
如何优雅地记录操作日志
日志对于一个系统来说不可或缺,对于问题的排查,问题的再现有着至关重要的作用。由于不想从日志文件一行行摸索,想追求简单、快捷、方便;只需根据条件就可以检索到相应接口日志,以及是否出现报错的情况。同时...

极简博客阅读 801

封面图
【JAVA】Java 日志打印规范
规范的日志是养成良好编程习惯的开始,也是关键时刻解决严重BUG的救命稻草。程序员开发的过程中可以打印debug日志,在复杂业务中提供日志来排查问题,也可以在出现生产问题的时候快速问题,及时处理。无论如何了...

Xander阅读 718

OpenTelemetry日志体系
OpenTelemetry为了实现其可观测性有三大体系:Trace,Metrics和Log。本文将对于OpenTelemetry实现的日志体系进行详细的讲述。

骑牛上青山阅读 679

Django笔记三十之log日志的记录详解
这一节介绍在 Django 系统里使用 logging 记录日志以下是一个简单的 logging 模块示例,可以先预览一下,接下来会详细介绍各个模块的具体功能: {代码...} 以下是本篇笔记全部内容:模块总览LoggersHandlersFilte...

Hunter阅读 442

封面图

亚马逊云开发者社区是面向开发者交流与互动的平台。在这里,你可以分享和获取有关云计算、人工智能、IoT...

2.9k 声望
9.6k 粉丝
宣传栏