我正在尝试在Lambda(node.js)中创建一个函数,该函数将在雅典娜中创建一个表。
我遵循了“开始查询执行” aws文档(附带代码),但是当我运行代码时,我看不到正在创建任何表,并且函数没有错误...
非常感谢您的帮助:
lambda是否有可能创建一个表(仅作为查询)?
重要的是,Lambda函数和雅典娜区域都将成为 一样吗?
代码中有什么错误吗?
我应该使用.promise()
还是try & catch
?
我试图在不同地区运行它,并让Lambda完全访问Athena和S3
// console.log('Loading function');
const AWS = require('aws-sdk');
AWS.config.update({region: 'eu-west-1'});
exports.handler = async (event, context, callback) => {
var athena = new AWS.Athena();
var params = {
"QueryExecutionContext": {
"Database": "mydatabase"
},
"QueryString": "CREATE TABLE table_test AS SELECT * FROM mydatabase.exsistingtable WHERE time > to_iso8601(current_timestamp - interval '1' day);",
"ResultConfiguration": {
"EncryptionConfiguration": {
"EncryptionOption": "SSE-S3" },
"OutputLocation": "s3://aws-athena-query-results-maybucket-eu-west-1/"
}
};
athena.startQueryExecution(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
console.log("end script");
return "";
};
这是我的 IAM政策:
答案 0 :(得分:0)
由于要根据查询结果创建表,因此在创建表之前首先需要运行查询。 StartQueryExecution
API仅启动查询,然后查询异步运行,您将不得不使用GetQueryExecution
定期询问Athena。
查询可能会花费大量时间来运行,而CTAS操作(创建表AS)所花费的时间甚至更长。您不希望在Athena运行时运行Lambda函数,这只会花费您的钱,并且如果查询运行的时间超过了该函数的超时时间,它甚至将无法工作。
您可以像在Lambda函数中那样开始查询执行,但是如果要等待查询完成并创建表,则需要以某种方式定期运行代码,直到GetQueryExecution
指示查询完成。
这可以通过例如“阶梯函数”来完成,在该函数中,您可以有一个Lambda函数可以启动查询,另一个可以轮询一次又一次的完成查询,最后一个Lambda函数可以将所有内容包装起来。 。步进函数中有很好的模板可用于这种过程。
答案 1 :(得分:0)
谢谢!西奥 为了快速响应... 只是一个小问题: 在我运行Lambda代码之后(CATS的表我不应该看到已在Athena中创建了表? 因为我不知道发生了什么事... :-(