node.js - 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: "*"
不幸的是,这个错误非常普遍,我无法弄清楚我做错了什么,有人有什么想法吗?
解决方案
InvalidRequestException
可能意味着很多不同的事情,这取决于抛出它的调用。最常见的原因InvalidRequestException
是调用格式不正确、缺少必需的参数、参数的值无效等。
如果是getQueryResults
调用抛出它,我认为这也可能意味着查询结果不可用。看起来您在调用之前正确地等待查询完成getQueryResults
,但您也将它称为失败和取消的查询,这可能是问题所在。getQueryResults
除非状态为 ,否则您不应调用SUCCEEDED
。
另请注意,您需要Glue 目录的权限才能运行查询,这可能是一个问题。另一方面,AccessDenied
在这种情况下你应该得到错误。
推荐阅读
- webpack - SASS DevTools 未指向变量声明
- asp.net - UWP 10.1 不支持 NewtonSoft 吗?
- node.js - 安装 react-paypal-button 时出现 npm 错误
- qt - Qt 窗口调整纵横比 1:1
- mobile - 使用polymerjs打开手机摄像头
- python - sqlite3.OperationalError:无法打开数据库文件(灾难响应管道)
- google-chrome - 谷歌浏览器从脚本标签中剥离 nonce 值
- android - EGL 错误:“纹理资源为 NULL,未指定级别”
- cordova - 构建 Cordova 应用程序时出现“java.lang.ExceptionInInitializerError”
- python - 无法在虚拟环境中导入“flask_wtf”和“wtforms”,即使我已经安装了它们?