Loading...
在本篇文章中,我们将讨论如何利用跨账户资源策略,通过AWS Lambda函数处理来自不同账户的Amazon Kinesis数据流。这种架构不仅能简化数据处理流程,还能优化成本管理,为企业提供更安全和灵活的解决方案。
在AWS上采用多账户架构对于增强安全性、合规性以及资源管理至关重要。这种方法通过隔离工作负载、实现精细化的成本分配以及促进不同环境间的协作,从而降低风险、提升可扩展性,并支持高级网络配置。
在流数据架构中,事件生产者、流存储以及事件消费者可能位于同一账户,也有可能跨不同账户,这取决于您的业务和IT需求。例如,您的公司可能希望集中来自多个生产者的点击流数据或日志数据,以便于进行后续分析。同时,不同的部门如市场营销、产品工程或数据分析,则需要跨账户访问同一流数据,这就要求构建可支持多账户的流数据架构。
为了构建这种多账户流数据架构,您可以使用Amazon Kinesis 数据流作为流存储,同时利用AWS Lambda作为事件消费者。Amazon Kinesis 数据流支持实时处理大规模流数据,并与Lambda集成以实现无服务器的数据处理。这使得您能够实时分析和响应数据流,而无需管理基础设施。这种集成支持实时分析、日志处理、物联网数据摄取等多种应用场景,对于需要及时洞察的企业来说尤为重要。本文将演示如何在一个账户中处理进入的数据流,并通过另一个账户中的Lambda函数进行处理。
在我们的解决方案中,我们将在账户1中部署Kinesis数据流,并在账户2中将Lambda作为消费者接收来自数据流的数据。下图描述了总体架构:
鲸鱼加速器该设置需要以下关键元素:
账户1中的Kinesis数据流和账户2中的Lambda函数账户1中的Kinesis数据流资源策略,允许跨账户的Lambda执行角色在Kinesis数据流上执行操作账户2中的Lambda执行角色及账户1中的增强分发消费者资源策略,允许跨账户的Lambda执行角色在Kinesis数据流上执行操作为了完成设置,您将使用三个AWS CloudFormation模板来创建关键资源:
CloudFormation模板1创建账户1中的以下关键资源:Kinesis数据流Kinesis数据流增强分发消费者CloudFormation模板2创建账户2中的以下关键资源:消费者Lambda函数消费者Lambda函数执行角色CloudFormation模板3在账户2中创建以下资源:消费者Lambda函数事件源映射此解决方案支持单区域部署,CloudFormation模板必须在不同AWS账户的同一区域中部署。在本解决方案中,我们使用Kinesis数据流的增强分发特性,以便在多个消费者之间提供大容量的数据处理。
您需要拥有两个AWS账户,并具备运行CloudFormation模板所需的权限,以创建解决方案架构中提到的服务。同时,您还需安装AWS命令行界面AWS CLI,建议版本为215以上。
请按照以下步骤启动第一个CloudFormation模板:
使用账户1登录AWS管理控制台并选择适当的AWS区域。下载并启动CloudFormation模板1,以在您希望部署Kinesis数据流的地方进行操作。在LambdaConsumerAccountId字段中输入您的Lambda消费者账户ID,然后点击提交。CloudFormation模板的部署会花费几分钟。当堆栈创建完成后,在AWS CloudFormation控制台中,导航到输出选项卡并复制以下参数的值:KinesisStreamArnKinesisStreamEFOConsumerArnKMSKeyArn在后续步骤中,您需要这些值。
请按照以下步骤启动第二个CloudFormation模板:
使用账户2登录控制台并选择适当区域。下载并启动CloudFormation模板2,以在您计划部署Lambda消费者的地方进行操作。提供在上一步捕获的以下输入参数:KinesisStreamArnKinesisStreamEFOConsumerArnKMSKeyArnCloudFormation模板将创建以下关键资源:
Lambda消费者Lambda执行角色Lambda函数的执行角色是一个IAM角色,授予函数访问AWS服务和资源的权限。在此,您需创建一个Lambda执行角色,以包含Kinesis数据流和Lambda调用的必要权限。
CloudFormation模板的部署将花费几分钟。
当堆栈创建设计完成后,转至AWS CloudFormation控制台,导航到输出选项卡并复制以下参数的值:KinesisStreamCreateResourcePolicyCommandKinesisStreamEFOConsumerCreateResourcePolicyCommand通过使用AWS CloudShell中的以下AWS CLI命令在账户1中运行该命令。我们建议使用CloudShell,因为它将拥有最新版本的AWS CLI,可以避免潜在的问题。KinesisStreamCreateResourcePolicyCommand 这将为账户1中的Kinesis数据流创建资源策略。以下是一个示例资源策略:json { Version 20121017 Statement [ { Sid StreamEFOReadStatementID Effect Allow Principal { AWS [ arnawsiamltAWS Lambda Consumer account idgtrole/kdscrossaccountstreamconsumerlambdaexecutionrole ] } Action [ kinesisDescribeStreamSummary kinesisListShards kinesisDescribeStream kinesisGetRecords kinesisGetShardIterator ] Resource arnawskinesisltregion idgtltAccount 1 Amazon KDS account idgtstream/kdscrossaccountstream } ] }
KinesisStreamEFOConsumerCreateResourcePolicyCommand 这将为账户1中的Kinesis数据流的增强分发消费者创建资源策略。以下是一个示例资源策略:json { Version 20121017 Statement [ { Sid ConsumerEFOReadStatementID Effect Allow Principal { AWS [ arnawsiamltAWS Lambda Consumer account idgtrole/kdscrossaccountstreamconsumerlambdaexecutionrole ] } Action [ kinesisDescribeStreamConsumer kinesisSubscribeToShard ] Resource arnawskinesisltregion idgtltAccount 1 Amazon KDS account idgtstream/kdscrossaccountstream/consumer/kdscrossaccountstreamefoconsumer1706616477 } ] }
您还可以在Kinesis数据流控制台的增强分发、消费者名称和消费者共享资源基础策略下访问此策略。
现在您在账户1中已为Kinesis数据流及其增强分发消费者创建了资源策略,接下来可以为账户2中的消费者Lambda函数创建事件源映射。请按照以下步骤操作:
使用账户2登录控制台并选择适当区域。下载并启动CloudFormation模板3,以更新您使用CloudFormation模板2创建的堆栈。CloudFormation模板将创建Lambda事件源映射。
至此,部署已完成。一个Kinesis数据流可用于消费消息,而Lambda函数在目标账户中接收这些消息。要将样本消息发送到账户1中的数据流,可以使用CloudShell运行以下AWS CLI命令:
bashaws kinesis putrecord streamname kdscrossaccountstream data sampledatarecord partitionkey samplepartitionkey3 region ltregion idgt
账户2中的Lambda函数能够接收消息,并且您应该能够通过Amazon CloudWatch日志验证这一点:
在CloudWatch控制台中,选择导航窗格中的日志组。找到日志组/aws/lambda/kdscrossaccountstreamefoconsumer。选择搜索日志组以查看相关日志消息。以下是示例消息:
jsonRecords [ { kinesis { kinesisSchemaVersion 10 partitionKey samplepartitionkey3 sequenceNumber 49648798411111169765201534322676841348246990356337393698 data sampledatarecord approximateArrivalTimestamp 1706623274658 } }]
清理您在本文中创建的所有资源,以避免额外费用始终是一个好习惯。
为了清理您的资源,请删除来自账户1和账户2的相应CloudFormation堆栈,并停止生产者向Kinesis数据流推送事件。这将确保您不产生不必要的费用。
在本文中,我们演示了如何使用AWS资源基础策略配置跨账户Lambda与Kinesis数据流的集成。这种集成允许在一个AWS账户中处理流入的数据,通过位于另一个账户中的Lambda函数来实现。为了支持在中央账户中使用Kinesis数据流并且有多个消费者进行数据读取的客户,我们使用了Kinesis数据流的增强分发功能。
要开始,请打开Kinesis数据流控制台,或使用新的APIPutResourcePolicy为您的数据流或消费者附加资源策略。
Pratik Patel 是高级技术账户经理及流媒体分析专家。他与AWS客户合作,提供持续的支持和技术指导,帮助客户规划和构建最佳实践的解决方案,并确保客户的AWS环境保持健康运营。
Amar 是亚马逊AWS在英国的高级解决方案架构师。他为能源、公用事业、制造业和汽车客户进行战略实施,专注于利用AWS流方案和先进的数据分析解决方案以推动最佳业务结果。