Amazon web services 在AWS Quicksight中可视化DynamoDB数据

Amazon web services 在AWS Quicksight中可视化DynamoDB数据,amazon-web-services,amazon-dynamodb,amazon-quicksight,Amazon Web Services,Amazon Dynamodb,Amazon Quicksight,我正在寻找一个以AWS为中心的解决方案(如果可能的话,避免使用第三方的东西)来可视化一个非常简单的DynamoDB表中的数据 我们使用AWS Quicksight为我们的客户提供许多其他报告和仪表盘,因此我们的目标是在那里提供可视化 我非常惊讶地看到,DynamoDB并不是Quicksight的支持源,尽管还有很多其他东西,如S3、Athena、Redshift、RDS等 有没有人有过为此创建解决方案的经验 我在想,我将创建一个作业,每隔一段时间将DynamoDB表转储到S3,然后使用S3或雅典

我正在寻找一个以AWS为中心的解决方案(如果可能的话,避免使用第三方的东西)来可视化一个非常简单的DynamoDB表中的数据

我们使用AWS Quicksight为我们的客户提供许多其他报告和仪表盘,因此我们的目标是在那里提供可视化

我非常惊讶地看到,DynamoDB并不是Quicksight的支持源,尽管还有很多其他东西,如S3、Athena、Redshift、RDS等

有没有人有过为此创建解决方案的经验


我在想,我将创建一个作业,每隔一段时间将DynamoDB表转储到S3,然后使用S3或雅典娜与Quicksight的集成来读取/显示它。如果有一个简单的解决方案来提供更多实时数据,那就太好了。

我还希望看到DynamoDB和QuickSight之间的本机集成,所以我也将关注这个线程

但至少有一个选项更接近你想要的。您可以在DynamoDB表上启用流,然后设置触发器,在对DynamoDB进行更改时触发Lambda函数

然后,如果愿意('Modify','Insert','Delete'),您只能对特定的DynamoDB事件采取操作,然后将新的/修改的记录转储到S3。这将非常接近实时数据,因为它会在更新后立即触发

我在过去做了类似的事情,但我没有将数据转储到S3,而是更新了另一个DynamoDB表。将示例切换到S3将非常简单。见下文

const AWS = require('aws-sdk');

exports.handler = async (event, context, callback) => {

    console.log("Event:", event);
    const dynamo = new AWS.DynamoDB();

    const customerResponse = await dynamo.scan({
        TableName: 'Customers',
        ProjectionExpression: 'CustomerId'
    }).promise().catch(err => console.log(err));

    console.log(customerResponse);

    let customers = customerResponse.Items.map(item => item.CustomerId.S);

    console.log(customers);

    for(let i = 0; i < event.Records.length; i++)
    {
        if(event.Records[i].eventName === 'INSERT')
        {
            if(event.Records[i].dynamodb.NewImage)
            {
                console.log(event.Records[i].dynamodb.NewImage);
                for(let j = 0; j < customers.length; j++)
                {
                    await dynamo.putItem({
                        Item: {
                            ...event.Records[i].dynamodb.NewImage,
                            CustomerId: { S: customers[j] }
                        },
                        TableName: 'Rules'
                    }).promise().catch(err => console.log(err));
                }
            }
        }
    }
}
const AWS=require('AWS-sdk');
exports.handler=async(事件、上下文、回调)=>{
日志(“事件:”,事件);
const dynamo=新的AWS.DynamoDB();
const customerResponse=等待dynamo.scan({
TableName:'客户',
ProjectionExpression:“CustomerId”
}).promise().catch(err=>console.log(err));
console.log(customerResponse);
让customers=customerResponse.Items.map(item=>item.CustomerId.S);
console.log(客户);
for(设i=0;iconsole.log(err));
}
}
}
}
}

我们需要Quicksight中的DynamoDB支持

我能找到的最简单的方法如下:

1-创建一个Glue Crawler,它将DynamoDB表作为数据源,并将文档写入Glue表。(假设为表X)

2-创建一个以“表X”为数据源的粘合作业,并将其以拼花格式写入S3存储桶。(比如s3://table-x-parquets)

3-创建一个胶水爬虫程序,该爬虫程序将“s3://table-x-parquets”作为数据源,并从中创建一个新的胶水表。(比如说表Y)


现在,您可以在表Y中执行Athena查询,也可以将其用作Quicksight中的数据集。

希望看到DynamoDB与Quicksight的集成。使用DynamoDB流转储到S3不起作用,因为DynamoDB流发送事件而不是更新记录。因此,如果您从这个S3存储桶中读取,您将拥有同一项的两个实例:一个在更新之前,一个在更新之后

我现在看到的一个解决方案是使用数据管道定期将数据从DynamoDB转储到S3存储桶,并在此S3存储桶上使用Athena和Quicksight

第二种解决方案是使用dynamo db stream,使用lambda函数将数据发送到弹性搜索。弹性搜索有一个名为Kibana的插件,它有非常酷的可视化效果。显然,这会增加您的成本,因为现在您将数据存储在两个地方


还要确保转换数据,使每个弹性搜索文档根据需要具有最细粒度的数据。正如kibana一样,可视化将所有内容聚合到一个文档中。

!!更新 到2021年,我们终于可以让Athena Data connectors在Quicksight中公开DynamoDB数据,而无需任何自定义脚本或重复数据

:

  • 确保您有一个使用新Athena引擎版本2的Athena工作组,如果没有,请创建一个
  • 在Athena的数据源下,创建一个新的数据源并选择“查询数据源”,然后选择“Amazon DynamoDB”
  • 在向导的下一部分中,单击“配置新AWS Lambda函数”以部署预构建的AthenaDynamoDBConnector
  • 部署AthenadynamodConnector后,选择在Athena中的数据源创建向导中部署的函数的名称,为DynamoDB数据指定一个类似“DynamoDB”的目录名称,然后单击“连接”
  • 现在,您应该能够在Athena中查询DynamoDB数据,但在QuickSight中还有几个步骤可以实现
  • 转到IAM控制台,找到QuickSight服务角色(即aws-QuickSight-service-role-v0)
  • 将AWS管理的“AWSLambdaRole”策略附加到QuickSight角色,因为QuickSight现在需要调用数据连接器的权限
  • 转到QuickSight控制台,添加一个新的Athena数据源,该数据源使用在步骤1中创建的版本2引擎
  • 现在,您应该能够使用Athena Engine version 2工作组数据源创建数据集,并选择在步骤4中为DynamoDB连接器提供的Athena目录名称
  • Bingo bango,您现在应该能够在Quicksight中直接查询或缓存DynamoDB数据,而无需创建自定义代码或dupl的作业