我使用 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/