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 上所有资源的完全权限,但它似乎仍然不起作用。
由于 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
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |