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
相关产品推荐
相关产品推荐

