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
错误。
我正在使用 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
错误。