在 AWS Quicksight 中可视化 DynamoDB 数据

JD *_*D D 23 amazon-web-services amazon-dynamodb amazon-quicksight

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

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

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

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

我想我只是创建一个作业,将 DynamoDB 表每隔一段时间转储到 S3,然后使用 S3 或 Athena 与 Quicksight 集成来读取/显示它。为更多实时数据提供一个简单的解决方案会很好。

JD *_*D D 15

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

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

  1. 确保您有一个使用新 Athena Engine 版本 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 目录的方法。

希望一旦此功能正式发布,它就可以轻松导入 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 的一部分进行查询。


Emr*_*lan 11

我们希望 Quicksight 支持 DynamoDB!

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

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

2 - 创建一个 Glue 作业,将“表 X”作为数据源并将它们以镶木地板格式写入 S3 存储桶。(假设 s3://table-x-parquets)

3 - 创建一个 Glue Crawler,它将 's3://table-x-parquets' 作为数据源并从中创建一个新的 Glue Table。(假设表Y)

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


小智 5

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

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

然后,如果您愿意,您只能对特定的 DynamoDB 事件采取行动('Modify'、'Insert'、'Delete'),然后将新的/修改过的记录转储到 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));
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)