亚马逊AWS官方博客

通过 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构建日志系统》,建议您先点击这里阅读。通过本文,您将了解到如何通过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为例,详细讲解一下整个的实现过程。

 

在开始之前,我们考虑这样一种场景。我们在Amazon Web Services账户A的EC2中部署了Nginx,用于构建我们的Web Server,并将账户A的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。

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

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

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

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

注意:请将<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。

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

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

  • 登录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>替换成demo-writing-kds角色的ARN

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

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

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

 

三.总结

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

 

四.参考资料

本篇作者

马涛

亚马逊云科技解决方案研发架构师,主要负责云上解决方案的设计与研发