29

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

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

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

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

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

4

4 回答 4

22

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

我写了一篇详细的博客文章,其中包含分步说明,但总的来说,过程如下:

  1. 确保您有一个使用新 Athena 引擎版本 2 的 Athena 工作组,如果没有,请创建一个
  2. 在数据源下的 Athena 中,创建一个新数据源并选择“查询数据源”,然后选择“Amazon DynamoDB”
  3. 在向导的下一部分,单击“配置新的 AWS Lambda 函数”以部署预构建的 AthenaDynamoDBConnector。
  4. 部署 AthenaDynamoDBConnector 后,选择您在 Athena 的数据源创建向导中部署的函数的名称,为您的 DynamoDB 数据提供一个目录名称,如“dynamodb”,然后单击“连接”
    1. 您现在应该能够在 Athena 中查询 DynamoDB 数据,但还需要执行几个步骤才能在 QuickSight 中正常工作。
  5. 转到 IAM 控制台并找到 QuickSight 服务角色(即 aws-quicksight-service-role-v0)。
  6. 将 AWS 托管的“AWSLambdaRole”策略附加到 QuickSight 角色,因为 QuickSight 现在需要调用您的数据连接器的权限。
  7. 转到 QuickSight 控制台并添加一个新的 Athena 数据源,该数据源使用您在步骤 1 中创建的版本 2 引擎
  8. 您现在应该能够使用该 Athena Engine 版本 2 工作组数据源创建一个数据集,并选择您在步骤 4 中为 DynamoDB 连接器提供的 Athena 目录名称。

Bingo Bango,您现在应该能够直接在 Quicksight 中查询或缓存 DynamoDB 数据,而无需创建将您的数据复制到另一个数据源的自定义代码或作业。


自 2020 年 3 月起,亚马逊将提供名为Athena DynamoDB Connector的测试版功能。

不幸的是,它只是测试版/预览版,您可以在 Athena 中进行设置,但我看不到在 Quicksight 中使用这些新的 Athena 目录的方法。

希望一旦这个功能是 GA,它可以很容易地导入 Quicksight,我可以用好消息更新答案。

建立 DynamoDB 连接器的说明

AWS 在测试版中提供了许多新数据源,用于自动连接到 Athena。

您可以通过控制台设置这些:

  1. 导航到 AWS Athena 控制台中的“数据源”菜单。
  2. 单击“配置数据源”按钮
  3. 选择“查询数据源”单选按钮
  4. 选择出现的“Amazon DynamoDB”选项
  5. 单击“配置新功能”选项
  • 您需要指定一个存储桶来帮助将“溢出”数据放入并为新的 DyanmoDB 目录提供名称。
  1. 从第 5 步部署应用程序后,在第 4 步的 Athena 数据源表单中选择 Lambda 名称(您在第 5 步中输入的目录的名称),并提供相同的目录名称。
  2. 创建数据连接器

现在您可以转到 Athena 查询编辑器,选择您刚刚创建的default目录,然后在新目录的 Athena 数据库下查看您所在地区的所有 DyanmoDB 表的列表,您现在可以将其作为 Athena 的一部分进行查询。

于 2020-03-24T19:33:40.897 回答
11

We want DynamoDB support in Quicksight!

The simplest way I could find is below:

1 - Create a Glue Crawler which takes DynamoDB table as a Data Source and writes documents to a Glue Table. (Let's say Table X)

2 - Create a Glue Job which takes 'Table X' as a data source and writes them into a S3 Bucket in parquet format. (Let's say s3://table-x-parquets)

3 - Create a Glue Crawler which takes 's3://table-x-parquets' as data source and creates a new Glue Table from it. (Let's say Table Y)

Now you can execute Athena queries in Table Y and also you can use it as Data Set in Quicksight.

于 2019-11-21T23:26:49.883 回答
5

我还希望看到 DynamoDB 和 QuickSight 之间的原生集成,所以我也会关注这个线程。

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

然后,您只能根据需要对特定的 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));
                }
            }
        }
    }
}
于 2019-10-24T15:38:03.673 回答
0

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

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

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

还要确保您转换数据,以便每个 Elastic Search 文档都具有根据您的需要最精细的数据。由于 kibana 可视化将所有内容聚合到一个文档中。

于 2020-02-07T18:59:45.613 回答