每日 AWS Lambda 未创建 Athena 分区,但命令成功运行

Daily AWS Lambda not creating Athena partition, however commands runs successfully

我将 Athena 数据库设置为指向包含 ALB 日志的 S3 存储桶,并且一切正常。我将 table 划分为一个名为 datetime 的列,我的想法是它的格式为 YYYY/MM/DD.

我可以通过 Athena 控制台手动创建分区,使用以下命令:

ALTER TABLE alb_logs ADD IF NOT EXISTS PARTITION (datetime='2019-08-01') LOCATION 's3://mybucket/AWSLogs/myaccountid/elasticloadbalancing/eu-west-1/2019/08/01/'

我每天创建一个 lambda 到 运行 来创建一个新分区,但这似乎不起作用。我使用 boto3 python 客户端并执行以下命令:

result = athena.start_query_execution(
    QueryString = "ALTER TABLE alb_logs ADD IF NOT EXISTS PARTITION (datetime='2019-08-01') LOCATION 's3://mybucket/AWSLogs/myaccountid/elasticloadbalancing/eu-west-1/2019/08/01/'",
    QueryExecutionContext = {
        'Database': 'web'
    },
    ResultConfiguration = {
        "OutputLocation" : "s3://aws-athena-query-results-093305704519-eu-west-1/Unsaved/"
    }
)

这似乎 运行 成功,没有任何错误,并且查询执行甚至 returns 一个 QueryExecutionId 应该。但是,如果我 运行 SHOW PARTITIONS web.alb_logs; 通过 Athena 控制台它还没有创建分区。

我觉得这可能与权限有关,但是我已经为 lambda 执行角色授予了对 S3 上所有资源的完全权限和对 Athena 上所有资源的完全权限,但它似乎仍然无法正常工作。

由于 Athena 查询执行是异步的,因此您的 Lambda 函数永远不会看到查询执行的结果,它只会获取启动查询的结果。

如果这不是权限问题,我会感到非常惊讶,但由于上述错误不会出现在 Lambda 日志中。您可以做的是记录查询执行 ID 并使用 GetQueryExecution API 调用查找查询是否成功。

更好的方法是重写您的代码以直接使用 Glue API 来添加分区。添加分区是 Glue 中的快速同步操作,这意味着您可以在同一 Lambda 执行中进行 API 调用并获取状态。查看用于处理分区的 APIs:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html