使用 Lambda 函数 node.js 创建 Athena table
Create an Athena table with Lambda function node.js
我正在尝试在 Lambda (node.js) 中创建一个函数,它将在 Athena 中创建一个 table。
我遵循了 "Start Query Execution" aws 文档(附加代码)但是当我 运行 代码时,我没有看到任何 table 被创建并且函数没有错误.. .
非常感谢您的帮助:
lambda 是否有可能创建一个 table(就像一个查询)?
Lambda 函数和 Athena 区域是否重要?
一样吗?
代码有什么问题吗?
我应该使用 .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
由于您是根据查询结果创建 table,因此在创建 table 之前,查询首先需要 运行。 StartQueryExecution
API 仅启动查询,然后查询 运行 异步进行,您将不得不使用 GetQueryExecution
定期询问 Athena 是否已完成。
查询可能会花费很多时间 运行,而 CTAS 操作(创建 Table AS)甚至需要更长的时间。您不希望在 Athena 工作时 运行 您的 Lambda 函数,这只会花费您金钱,而且如果查询 运行 的时间超过函数的超时时间,它甚至不会工作。
您可以像您一样在 Lambda 函数中开始执行查询,但是如果您想等待查询完成并创建 table,您需要以某种方式 运行 代码定期直到 GetQueryExecution
表示查询完成。
这可以通过例如 Step Functions 来完成,您可以在其中使用一个启动查询的 Lambda 函数,另一个轮询完成的函数,一遍又一遍地调用,最后一个 Lambda 函数将事情包装起来,例如。 Step Functions 中有适合此类过程的良好模板。
谢谢!西奥
为了快速响应...
只是一个小问题:
在我 运行 Lambda 代码(CATS 不应该看到 table 已经在 Athena 中创建的 table 之后?
因为我没有看到发生任何事情...
:-(
我正在尝试在 Lambda (node.js) 中创建一个函数,它将在 Athena 中创建一个 table。
我遵循了 "Start Query Execution" aws 文档(附加代码)但是当我 运行 代码时,我没有看到任何 table 被创建并且函数没有错误.. .
非常感谢您的帮助:
lambda 是否有可能创建一个 table(就像一个查询)?
Lambda 函数和 Athena 区域是否重要? 一样吗?
代码有什么问题吗?
我应该使用
.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
由于您是根据查询结果创建 table,因此在创建 table 之前,查询首先需要 运行。 StartQueryExecution
API 仅启动查询,然后查询 运行 异步进行,您将不得不使用 GetQueryExecution
定期询问 Athena 是否已完成。
查询可能会花费很多时间 运行,而 CTAS 操作(创建 Table AS)甚至需要更长的时间。您不希望在 Athena 工作时 运行 您的 Lambda 函数,这只会花费您金钱,而且如果查询 运行 的时间超过函数的超时时间,它甚至不会工作。
您可以像您一样在 Lambda 函数中开始执行查询,但是如果您想等待查询完成并创建 table,您需要以某种方式 运行 代码定期直到 GetQueryExecution
表示查询完成。
这可以通过例如 Step Functions 来完成,您可以在其中使用一个启动查询的 Lambda 函数,另一个轮询完成的函数,一遍又一遍地调用,最后一个 Lambda 函数将事情包装起来,例如。 Step Functions 中有适合此类过程的良好模板。
谢谢!西奥 为了快速响应... 只是一个小问题: 在我 运行 Lambda 代码(CATS 不应该看到 table 已经在 Athena 中创建的 table 之后? 因为我没有看到发生任何事情... :-(