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

lis*_*ite 0 amazon-s3 amazon-web-services aws-lambda amazon-athena

我设置了一个 Athena 数据库,指向包含 ALB 日志的 S3 存储桶,并且一切正常。我按名为 的列对表进行分区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/"
    }
)
Run Code Online (Sandbox Code Playgroud)

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

我有一种感觉,这可能取决于权限,但是我已向 lambda 执行角色授予对 S3 上所有资源的完全权限以及对 Athena 上所有资源的完全权限,但它似乎仍然不起作用。

The*_*heo 5

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

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

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