使用Lambda函数node.js创建一个雅典娜表

时间:2019-02-09 06:05:19

标签: node.js aws-lambda amazon-athena

我正在尝试在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政策

  • AmazonS3FullAccess
  • CloudWatchFullAccess
  • AmazonAthenaFullAccess
  • CloudWatchLogsFullAccess
  • CloudWatchEventsFullAccess

2 个答案:

答案 0 :(得分:0)

由于要根据查询结果创建表,因此在创建表之前首先需要运行查询。 StartQueryExecution API仅启动查询,然后查询异步运行,您将不得不使用GetQueryExecution定期询问Athena。

查询可能会花费大量时间来运行,而CTAS操作(创建表AS)所花费的时间甚至更长。您不希望在Athena运行时运行Lambda函数,这只会花费您的钱,并且如果查询运行的时间超过了该函数的超时时间,它甚至将无法工作。

您可以像在Lambda函数中那样开始查询执行,但是如果要等待查询完成并创建表,则需要以某种方式定期运行代码,直到GetQueryExecution指示查询完成。

这可以通过例如“阶梯函数”来完成,在该函数中,您可以有一个Lambda函数可以启动查询,另一个可以轮询一次又一次的完成查询,最后一个Lambda函数可以将所有内容包装起来。 。步进函数中有很好的模板可用于这种过程。

答案 1 :(得分:0)

谢谢!西奥 为了快速响应... 只是一个小问题: 在我运行Lambda代码之后(CATS的表我不应该看到已在Athena中创建了表? 因为我不知道发生了什么事... :-(