首页 > 解决方案 > Athena Node.js AWS 开发工具包 - 任何请求都会引发 InvalidRequestException

问题描述

我正在使用 Node 10.x LTS 和 AWS + Serverless,我使用 S3 和 Athena 设置了一个数据库。

我正在尝试使用官方的aws-sdk/Athena. 在本地一切正常,但是一旦将 lambda 部署到 AWS,我尝试运行的任何查询都会返回InvalidRequestException

这是我的代码:

'use strict'

const AWS = require('aws-sdk')
const athena = new AWS.Athena({ athena: '2017-05-18' })
const sleep = require('util').promisify(setTimeout)
const parseAthenaResponse = require('../../utils/parseAthenaResponse')

const getQueryResults = async QueryExecutionId => {
  await sleep(5000)
  const { QueryExecution } = await athena
    .getQueryExecution({ QueryExecutionId })
    .promise()

  if (
    QueryExecution.Status.State !== 'SUCCEEDED' &&
    QueryExecution.Status.State !== 'FAILED' &&
    QueryExecution.Status.State !== 'CANCELLED'
  ) {
    console.log(`Not ready yet: ${JSON.stringify(QueryExecution, null, 2)}`)
    return getQueryResults(QueryExecutionId)
  }

  console.info(`(${QueryExecutionId}) Results ready, download started`)
  const data = await athena.getQueryResults({ QueryExecutionId }).promise()
  return data.ResultSet.Rows
}

const getDataFromAthena = async () => {
  try {
    var QueryString = `
      SELECT * FROM my_table
    `

    const params = {
      QueryString,
      QueryExecutionContext: {
        Database: 'test'
      },
      ResultConfiguration: {
        OutputLocation: `s3://${process.env.S3_BUCKET}/exports`
      }
    }

    var { QueryExecutionId } = await athena
      .startQueryExecution(params)
      .promise()

    console.info(`(${QueryExecutionId}) Getting query results...`)
    const data = await getQueryResults(QueryExecutionId)
    return parseAthenaResponse(data)
  } catch (err) {
    // InvalidRequestException error is caught here
    throw err
  }
}

module.exports = getDataFromAthena

我相信这不是权限问题,因为出于测试目的,我授予 lambda 对所有内容的访问权限:

iamRoleStatements:
  - Effect: "Allow"
    Action: "s3:*"
    Resource: "*"
  - Effect: "Allow"
    Action: "athena:*"
    Resource: "*"

不幸的是,这个错误非常普遍,我无法弄清楚我做错了什么,有人有什么想法吗?

标签: node.jsamazon-web-servicesamazon-s3amazon-athena

解决方案


InvalidRequestException可能意味着很多不同的事情,这取决于抛出它的调用。最常见的原因InvalidRequestException是调用格式不正确、缺少必需的参数、参数的值无效等。

如果是getQueryResults调用抛出它,我认为这也可能意味着查询结果不可用。看起来您在调用之前正确地等待查询完成getQueryResults,但您也将它称为失败和取消的查询,这可能是问题所在。getQueryResults除非状态为 ,否则您不应调用SUCCEEDED

另请注意,您需要Glue 目录的权限才能运行查询,这可能是一个问题。另一方面,AccessDenied在这种情况下你应该得到错误。


推荐阅读