Athena Node.js AWS SDK - 任何请求都会抛出 InvalidRequestException

Athena Node.js AWS SDK - Any request throws InvalidRequestException

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

我正在尝试 运行 使用官方 aws-sdk/Athena 进行查询。 在本地一切正常,但是一旦将 lambda 部署到 AWS,我会尝试任何查询 运行 returns 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: "*"

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

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

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

另请注意,您需要 permissions to the Glue catalog 到 运行 查询,这可能是个问题。另一方面,在那种情况下你应该得到 AccessDenied 错误。