node.js - Athena Node.js AWS SDK - 任何请求都会引发 InvalidRequestException

标签 node.js amazon-web-services amazon-s3 amazon-athena

我使用 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: "*"

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

最佳答案

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

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

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

关于node.js - Athena Node.js AWS SDK - 任何请求都会引发 InvalidRequestException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57807408/

相关文章:

node.js - npm 5.4.1 安装/卸载全部失败

amazon-web-services - 如何在AWS EMR上安装Hadoop 3?

amazon-web-services - 如何转换 CommaDelimitedList 参数以在 CloudFormation 中构建 ARN

node.js - s3 中存储的某些图像无法在 Safari 中加载

java - Spring Boot Amazon AWS S3 存储桶文件下载 - 访问被拒绝

docker - 使用 S3 收集 Docker 注册表的垃圾非常慢

javascript - Azure Node SDK 的文档(非命令行)?

javascript - Node.js 和串口;回调方法?

javascript - 在 Node.JS 中将多个音频文件合并/合并为一个

java - aws api 网关速度中的转义字符