首页 > 解决方案 > 如何将我的文件从 s3 加载到 powerBi?

问题描述

我想从 s3 的存储桶中获取一些 csv 文件。由于没有连接器,我需要通过查询才能到达 s3。如何设置我的查询?

尝试使用邮递员并从邮递员的预览中复制信息,但无济于事。

邮递员标题和网址

现在我需要在逻辑上将这些标头放入 powerBI,但是,powerBi 不能像邮递员那样进行转换。有解决办法吗?

powerBi 查询编辑器

标签: amazon-s3powerbi

解决方案


只要使用 PowerBI 查询的人在其计算机上安装 AWS CLI,您接受的答案就很好。我的用例是,将要使用此 PowerBI 模板的个人想要登录并从那时起完成身份验证。

通过 PowerBI 访问 S3 存储桶的另一种选择是使用 AWS API Gateway 和 Lambda 函数来创建预签名 URL,根据Power BI 论坛上的这个问题。以下是用户spinwards的相关答案:

  1. 创建一个新的 Lambda 函数......它现在可以是空的
  2. 在 API Gateway 中设置新 API
  3. 创建一个新的 GET 方法
    • 3.1 为集成类型选择 Lambda 函数
    • 3.2 选择使用 Lambda 代理集成选项
    • 3.3 选择区域并输入您在步骤 1 中创建的 lambda 函数的名称
  4. 编辑您的 lambda 函数。
    • 4.1 使用 AWS 开发工具包,为您的文件生成一个带有预签名密钥的 url
    • 4.2 从步骤 4.1 返回一个 303 重定向到 url

以下是 python 2.7 中的 lambda 函数示例:

    bucket = 'bucket-name'
    key = 'path-to-file'

    client = boto3.client('s3')
    link = client.generate_presigned_url(
            'get_object',
            {'Bucket': bucket, 'Key': key},
            7200, 'GET')

    return {
        "statusCode": 303,
        "headers": {'Location': link}
    }

您可以将此 PowerBI 查询用作起点:

    let
        // Replace the URI with the "invoke url" of your API Gateway endpoint
        // See: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-call-api.html#how-to-call-api-console
        uri = "https://your-web-api.execute-api.us-east-1.amazonaws.com/stage/endpoint",

        // PowerBI should understand the 303 redirect and follow it to your presigned s3 url
        // Make sure to set IsRetry to true so that PowerBI gets a fresh url with a 
        //   fresh presigned key every time
        raw = Web.Contents(uri, [IsRetry=true]), 

        // My file is a gzipped utf-8 tsv, so I need to decompress it
        // and tell the csv parser the delimiter and encoding
        binary = Binary.Decompress(raw, Compression.GZip),
        csv = Csv.Document(binary, [
            Delimiter="#(tab)",
            extraValues=ExtraValues.Ignore,
            Encoding=65001]) // 65001 is utf8
    in
        csv

使用单个文件完成所有工作后,您可以参数化您的 API 和 Lambda 函数以接受 s3 路径,以便您可以从 S3 账户中提取任何内容。

Spinwards 还提供以下有关身份验证的警告:

在将其推广到生产环境之前,您应该考虑某种身份验证。普通的 AWS IAM 身份验证令牌不能很好地与 PowerBI 配合使用,因此您需要为 API 网关使用自定义身份验证方法:https ://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom -authorizer.html。我最终使用了基本身份验证,这不是世界上最强大的东西,但 API Gateway 使用 https,所以它应该足够安全。

因为 PowerBI 不自动支持 v4 签名身份验证,而且我的用户可能在他们的计算机上没有 CLI,所以我一直在试验的另一个选项是在我的 python 查询中包含和重构来自 AWS 文档页面的 python v4 签名示例。这将允许在机器上没有 AWS CLI 的情况下进行调用,但需要用户输入他们的访问密钥和秘密访问密钥。据我所知,PowerBI 中的参数不会自动暴露给 python 查询,因此我正在研究通过创建包含参数的数据集来暴露参数,如下所述:Power BI 参数是否暴露给 Python 全局变量


推荐阅读