【问题标题】:Amazon QuickSight embedded dashboard - how to cache user session in my webapp (billing and timing concern)Amazon QuickSight 嵌入式控制面板 - 如何在我的 Web 应用程序中缓存用户会话(计费和时间问题)
【发布时间】:2021-07-05 15:58:41
【问题描述】:

我已使用 amazon-quicksight-embedding-sdk 在我的 Web 应用程序中嵌入了 Amazon QuickSight 控制面板(关注 https://learnquicksight.workshop.aws/en/dashboard-embedding.html)。

https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetDashboardEmbedUrl.html 中提到的用户会话似乎持续了很多小时 当我直接从我的网络浏览器请求嵌入 URL 时,我可以看到它在多个小时内都有效。

但是当用户重新启动它(通过关闭/重新打开选项卡/浏览器)时,我的网络应用程序将请求一个新的嵌入 URL。这是否意味着创建并计费了一个新的用户会话。

如果同一用户关闭选项卡/浏览器并再次打开网络应用程序和仪表板(当然在同一浏览器)?

我尝试将 embedURL 存储为名为“embed_url”的 cookie。但是调用 amazon-quicksight-embedding-sdk.embedDashboard({url: embed_url}) 导致

“由于无效的 URL 或授权码,嵌入失败。两者都有 其中必须有效且授权码不得过期 嵌入工作。”

我确信 embed_url 仍然有效,因为浏览器直接请求它是有效的。 上面的错误信息中提到了哪个“授权码”?我错过了什么或者实际上不可能?

除了计费问题,我注意到获取 embedURL 的调用需要时间(超过 5 秒,eu-central-1),而嵌入需要的时间更少(3 秒)。我想我可以通过重用获得的 embedURL 来缩短仪表板的加载时间。任何关于时间的cmets?这是正常的还是我做错了什么以至于它这么慢?我的测试仪表板只有 1 个数据集未更改的图表。

【问题讨论】:

  • 在每次重新加载页面时请求新的嵌入 URL 时,您是否设法了解计费方式?
  • 很遗憾没有。我希望看到单个 embedurl 请求的帐单,但在一天后访问计费仪表板仍然看到 0。上个月,我不得不为我确定少于 50 个请求的请求支付 8 美元,但这些请求在帐单中列为 27.000 个会话.完全糊涂了。
  • 谢谢,我将联系支持团队,让您知道我发现了什么

标签: amazon-web-services dashboard quicksight-embedding amazon-quicksight


【解决方案1】:

根据Quicksight Pricing Page,如果您要为 Quicksight“阅读器”创建嵌入式仪表板,那么您需要为此阅读器的每 30 分钟登录会话支付 0.30 美元/会话。

会话的有效期可以在GetDashboardEmbedUrl API的SessionLifetimeInMinutes参数中设置,上限为600分钟(10小时)。

例如,假设您为 Reader 用户将 SessionLifetimeInMinutes 设置为 600 分钟。还假设此用户保持登录状态并连续使用仪表板 10 小时,那么这将等同于 20 次使用会话(因为计费是以 30 分钟为单位的增量)。乍一看,这似乎会导致 0.30 美元/会话 * 20 个会话块 = 6 美元计费。

但是,根据定价页面,每位读者每月的上限为 5.00 美元。这意味着无论为他们创建了多少 Quicksight 会话(无论持续时间如何),这个 Reader 每月都不能超过 5 美元。因此,无论您为给定的 Reader 调用多少次 GetDashboardEmbedUrl API,该用户的上限为 5 美元/月。

也用于构成阅读器会话的内容(来自定价页面):

When does a Reader Session start and end?

A Reader Session starts with user-initiated action (e.g., login, dashboard load, page refresh, drill-down or filtering) and runs for next 30-minutes.
 
Keeping Amazon QuickSight open in a background browser window/tab does not result in active sessions until the Reader initiates action on page.

但是当用户重新启动它(通过关闭/重新打开选项卡/浏览器)时,我的网络应用程序将请求一个新的嵌入 URL。这是否意味着创建并计费了一个新的用户会话。

我对此不是 100% 确定,但是是的,我相信刷新(或打开/关闭)选项卡会导致同一用户的新会话。

阅读器会话以用户启动的操作(例如登录、仪表板加载、页面刷新、向下钻取或过滤)开始,并在接下来的 30 分钟内运行.

以上摘录来自定价页面。因此,页面刷新(以及对GetDashboardEmbedUrl 的另一次调用)似乎确实会为用户触发一个新会话。

上面的错误信息中提到了哪个“授权码”?

GetEmbedDashboardUrl API 响应是一个 JSON 对象,如下所示:

{
    "Status": 200,
    "EmbedUrl": "https://us-east-1.quicksight.aws.amazon.com/embed/f4147cd0d4d_BLAH_BLAH_...",
    "RequestId": "c15a7bad-629e-444a-b643-ff3142c9ae41"
}

如果你仔细看EmbedUrl,除了仪表板url本身,还有这些查询字符串参数:

  • 身份验证码
  • 代码
  • 身份提供者
  • statePersistenceEnabled
  • 可能:还有其他参数

code 参数(嵌入在 embedUrl 中)是您询问的“授权码”。

如果同一用户关闭选项卡/浏览器并再次打开网络应用程序和仪表板(当然在同一浏览器)?

不,这是不可能的。正如link you shared 中所说:

The following rules apply to the combination of URL and authorization code:

- They must be used together.
- They can be used one time only.
- They are valid for 5 minutes after you run this command.

因此 embedURL 及其关联的授权码只能一起使用一次。有道理,因为这将防止其他场景中的 MITM 重放攻击。此外,我实际上尝试缓存响应,然后在缓存命中的情况下重新使用 embedUrl,因为这将改善最终用户体验。但这不起作用 - QuickSight 阻止了 embedUrl 的“重播”,如他们的文档中所述。

有没有关于时间的cmets?

这也是我们的经验。对于我们的应用程序,GetDashboardEmbedUrl REST API 大约需要 5-7 秒 (us-east-1),然后实际嵌入需要另外 3-5 秒。不太好,但我目前还没有办法解决这种糟糕的用户体验。

【讨论】:

  • 非常感谢您分享您的知识和经验。与此同时,我对 QuickSight 的成本又感到困惑。我在这里创建了另一个主题stackoverflow.com/questions/67859312/…,因为它与该线程没有直接联系。你也有这方面的想法吗?
  • 很高兴它很有用,我刚刚提交了对您其他问题的答案。
猜你喜欢
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2019-04-04
  • 2014-03-26
  • 2013-05-31
  • 1970-01-01
相关资源
最近更新 更多