You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery与R Shiny集成:如何让查询发起用户承担对应查询费用

BigQuery Shiny应用用户侧计费最优实现方案

核心实现逻辑

最优方案是替换当前固定服务账号的认证模式,改用终端用户OAuth 2.0 授权模式,让查询以用户自己的Google Cloud身份执行,费用直接计入用户个人GCP账单,无需你做额外的费用结算流转。

具体实现步骤

  • 第一步:注册应用OAuth凭证
    在Google Cloud Console为你的Shiny应用申请OAuth客户端ID,开通BigQuery API访问权限,替换原有硬编码的服务账号密钥逻辑。
  • 第二步:修改认证与连接逻辑
    让访问应用的Google用户完成个人账号授权,动态获取用户的GCP计费项目ID,也可以在UI新增输入项让用户自行填写自己的计费项目ID,将连接参数中的billing字段修改为用户提供的项目ID。
  • 第三步:新增费用预提醒逻辑
    执行用户SQL前先调用BigQuery的dry run能力预估扫描数据量与对应费用,展示给用户确认后再执行查询,避免用户产生预期外的费用。

修改后的核心代码示例

ui <- fluidPage(
  textInput("billing_project", "你的GCP计费项目ID"),
  textAreaInput("query", "SQL query"),
  actionButton("submit", "Submit query"),
  dataTableOutput("queryResults")
)
server <- function(input, output, session) {
  # 改用用户OAuth认证,无需硬编码服务账号密钥
  bq_auth(email = NULL, cache = FALSE)
  
  con <- reactive({
    req(input$billing_project)
    DBI::dbConnect(
      bigrquery::bigquery(),
      project = "公共数据集/你要开放的项目ID",
      dataset = "你要开放的数据集名称",
      billing = input$billing_project
    )
  })
  
  query <- eventReactive(input$submit, input$query)
  
  output$queryResults <- renderDataTable({
    req(con(), query())
    # 可选:先执行dry run预估费用给用户确认
    # dry_run <- bq_project_query(input$billing_project, query(), dry_run = TRUE)
    # scan_size <- bq_table_size(dry_run)
    DBI::dbGetQuery(con(), query())
  })
}
shinyApp(ui, server, ...)

注意事项

  • 访问应用的用户需要提前在自己的GCP账号中开通BigQuery API,否则无法正常执行查询
  • 如果开放的是你自己私有数据集,需要提前给用户授予对应数据集的只读权限,避免用户授权后无数据访问权限。

内容的提问来源于stack exchange,提问作者Dylan Russell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:54:06